/ Hex Artifact Content
Login

Artifact 3c8f3bc7fd823abb8af30ec89ba6bcc515923fa1:


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 33 39  select.c,v 1.339
0200: 20 32 30 30 37 2f 30 35 2f 30 33 20 31 33 3a 30   2007/05/03 13:0
0210: 32 3a 32 37 20 64 72 68 20 45 78 70 20 24 0a 2a  2:27 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 70 72 69 6e  0 );.      sprin
81f0: 74 66 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d  tf(zName, "colum
8200: 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20  n%d", i+1);.    
8210: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8220: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8230: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
8240: 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 0);.    }.  }
8250: 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  .  generateColum
8260: 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
8270: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
8280: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
8290: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
82a0: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e  D_SELECT./*.** N
82b0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65  ame of the conne
82c0: 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20  ction operator, 
82d0: 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d  used for error m
82e0: 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74  essages..*/.stat
82f0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  ic const char *s
8300: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20  electOpName(int 
8310: 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  id){.  char *z;.
8320: 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a    switch( id ){.
8330: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
8340: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
8350: 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b  N ALL";   break;
8360: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
8370: 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54  ERSECT: z = "INT
8380: 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b  ERSECT";   break
8390: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ;.    case TK_EX
83a0: 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58  CEPT:    z = "EX
83b0: 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61  CEPT";      brea
83c0: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
83d0: 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55            z = "U
83e0: 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65  NION";       bre
83f0: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
8400: 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   z;.}.#endif /* 
8410: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
8420: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
8430: 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
8440: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  claration.*/.sta
8450: 74 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65  tic int prepSele
8460: 63 74 53 74 6d 74 28 50 61 72 73 65 2a 2c 20 53  ctStmt(Parse*, S
8470: 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  elect*);../*.** 
8480: 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
8490: 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
84a0: 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
84b0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
84c0: 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
84d0: 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
84e0: 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
84f0: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
8500: 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  OfSelect(Parse *
8510: 70 50 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54  pParse, char *zT
8520: 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a  abName, Select *
8530: 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
8540: 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69  e *pTab;.  int i
8550: 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  , j;.  ExprList 
8560: 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d  *pEList;.  Colum
8570: 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a  n *aCol, *pCol;.
8580: 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63  .  while( pSelec
8590: 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  t->pPrior ) pSel
85a0: 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ect = pSelect->p
85b0: 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 72 65  Prior;.  if( pre
85c0: 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72  pSelectStmt(pPar
85d0: 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a  se, pSelect) ){.
85e0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
85f0: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  }.  if( sqlite3S
8600: 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61  electResolve(pPa
8610: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29  rse, pSelect, 0)
8620: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
8630: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73  ;.  }.  pTab = s
8640: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
8650: 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
8660: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
8670: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
8680: 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20  .  pTab->nRef = 
8690: 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  1;.  pTab->zName
86a0: 20 3d 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71   = zTabName ? sq
86b0: 6c 69 74 65 53 74 72 44 75 70 28 7a 54 61 62 4e  liteStrDup(zTabN
86c0: 61 6d 65 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69  ame) : 0;.  pELi
86d0: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
86e0: 4c 69 73 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43  List;.  pTab->nC
86f0: 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ol = pEList->nEx
8700: 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  pr;.  assert( pT
8710: 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20  ab->nCol>0 );.  
8720: 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f  pTab->aCol = aCo
8730: 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
8740: 28 20 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61  ( sizeof(pTab->a
8750: 43 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43  Col[0])*pTab->nC
8760: 6f 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  ol );.  for(i=0,
8770: 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 70 54   pCol=aCol; i<pT
8780: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  ab->nCol; i++, p
8790: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  Col++){.    Expr
87a0: 20 2a 70 2c 20 2a 70 52 3b 0a 20 20 20 20 63 68   *p, *pR;.    ch
87b0: 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 63  ar *zType;.    c
87c0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
87d0: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 43  int nName;.    C
87e0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
87f0: 20 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20     int cnt;.    
8800: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
8810: 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 47 65 74  .    .    /* Get
8820: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
8830: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c  name for the col
8840: 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  umn.    */.    p
8850: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
8860: 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
8870: 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  t( p->pRight==0 
8880: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f  || p->pRight->to
8890: 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70  ken.z==0 || p->p
88a0: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  Right->token.z[0
88b0: 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  ]!=0 );.    if( 
88c0: 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  (zName = pEList-
88d0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20  >a[i].zName)!=0 
88e0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
88f0: 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69  he column contai
8900: 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e  ns an "AS <name>
8910: 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e  " phrase, use <n
8920: 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65  ame> as the name
8930: 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   */.      zName 
8940: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a  = sqliteStrDup(z
8950: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
8960: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44   if( p->op==TK_D
8970: 4f 54 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  OT .            
8980: 20 20 26 26 20 28 70 52 3d 70 2d 3e 70 52 69 67    && (pR=p->pRig
8990: 68 74 29 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f  ht)!=0 && pR->to
89a0: 6b 65 6e 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b  ken.z && pR->tok
89b0: 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  en.z[0] ){.     
89c0: 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20   /* For columns 
89d0: 6f 66 20 74 68 65 20 66 72 6f 6d 20 41 2e 42 20  of the from A.B 
89e0: 75 73 65 20 42 20 61 73 20 74 68 65 20 6e 61 6d  use B as the nam
89f0: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
8a00: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
8a10: 66 28 22 25 54 22 2c 20 26 70 52 2d 3e 74 6f 6b  f("%T", &pR->tok
8a20: 65 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  en);.    }else i
8a30: 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20  f( p->span.z && 
8a40: 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a  p->span.z[0] ){.
8a50: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65        /* Use the
8a60: 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f   original text o
8a70: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70  f the column exp
8a80: 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e  ression as its n
8a90: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61  ame */.      zNa
8aa0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
8ab0: 6e 74 66 28 22 25 54 22 2c 20 26 70 2d 3e 73 70  ntf("%T", &p->sp
8ac0: 61 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  an);.    }else{.
8ad0: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
8ae0: 65 6c 73 65 20 66 61 69 6c 73 2c 20 6d 61 6b 65  else fails, make
8af0: 20 75 70 20 61 20 6e 61 6d 65 20 2a 2f 0a 20 20   up a name */.  
8b00: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
8b10: 74 65 33 4d 50 72 69 6e 74 66 28 22 63 6f 6c 75  te3MPrintf("colu
8b20: 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20  mn%d", i+1);.   
8b30: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
8b40: 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
8b50: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c    if( sqlite3Mal
8b60: 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20  locFailed() ){. 
8b70: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
8b80: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  zName);.      sq
8b90: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
8ba0: 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 72 65  (pTab);.      re
8bb0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  turn 0;.    }.. 
8bc0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
8bd0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
8be0: 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74  is unique.  If t
8bf0: 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75  he name is not u
8c00: 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70  nique,.    ** ap
8c10: 70 65 6e 64 20 61 20 69 6e 74 65 67 65 72 20 74  pend a integer t
8c20: 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68  o the name so th
8c30: 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e  at it becomes un
8c40: 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ique..    */.   
8c50: 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28   nName = strlen(
8c60: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28  zName);.    for(
8c70: 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  j=cnt=0; j<i; j+
8c80: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
8c90: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f  lite3StrICmp(aCo
8ca0: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  l[j].zName, zNam
8cb0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
8cc0: 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20   zName[nName] = 
8cd0: 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  0;.        zName
8ce0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
8cf0: 66 28 22 25 7a 3a 25 64 22 2c 20 7a 4e 61 6d 65  f("%z:%d", zName
8d00: 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20  , ++cnt);.      
8d10: 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    j = -1;.      
8d20: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
8d30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
8d40: 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e      }.    pCol->
8d50: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a  zName = zName;..
8d60: 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 74      /* Get the t
8d70: 79 70 65 6e 61 6d 65 2c 20 74 79 70 65 20 61 66  ypename, type af
8d80: 66 69 6e 69 74 79 2c 20 61 6e 64 20 63 6f 6c 6c  finity, and coll
8d90: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
8da0: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  or the.    ** co
8db0: 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lumn..    */.   
8dc0: 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
8dd0: 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
8de0: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
8df0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  = pSelect->pSrc;
8e00: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c  .    zType = sql
8e10: 69 74 65 53 74 72 44 75 70 28 63 6f 6c 75 6d 6e  iteStrDup(column
8e20: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
8e30: 20 30 2c 20 30 29 29 3b 0a 20 20 20 20 70 43 6f   0, 0));.    pCo
8e40: 6c 2d 3e 7a 54 79 70 65 20 3d 20 7a 54 79 70 65  l->zType = zType
8e50: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  ;.    pCol->affi
8e60: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78  nity = sqlite3Ex
8e70: 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20  prAffinity(p);. 
8e80: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
8e90: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
8ea0: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  arse, p);.    if
8eb0: 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
8ec0: 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73   pCol->zColl = s
8ed0: 71 6c 69 74 65 53 74 72 44 75 70 28 70 43 6f 6c  qliteStrDup(pCol
8ee0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  l->zName);.    }
8ef0: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b  .  }.  pTab->iPK
8f00: 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  ey = -1;.  retur
8f10: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
8f20: 20 50 72 65 70 61 72 65 20 61 20 53 45 4c 45 43   Prepare a SELEC
8f30: 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  T statement for 
8f40: 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20 64 6f  processing by do
8f50: 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
8f60: 67 0a 2a 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a 0a  g.** things:.**.
8f70: 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20  **    (1)  Make 
8f80: 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72  sure VDBE cursor
8f90: 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
8fa0: 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  en assigned to e
8fb0: 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  very.**         
8fc0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46  element of the F
8fd0: 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
8fe0: 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69  *    (2)  Fill i
8ff0: 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e  n the pTabList->
9000: 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20  a[].pTab fields 
9010: 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  in the SrcList t
9020: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  hat .**         
9030: 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61  defines FROM cla
9040: 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73  use.  When views
9050: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
9060: 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20  ROM clause,.**  
9070: 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62         fill pTab
9080: 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63  List->a[].pSelec
9090: 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  t with a copy of
90a0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
90b0: 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
90c0: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
90d0: 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f   the view.  A co
90e0: 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68  py is made of th
90f0: 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a  e view's SELECT.
9100: 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65  **         state
9110: 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20  ment so that we 
9120: 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66  can freely modif
9130: 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74  y or delete that
9140: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
9150: 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f        without wo
9160: 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73  rrying about mes
9170: 73 69 6e 67 20 75 70 20 74 68 65 20 70 72 65 73  sing up the pres
9180: 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74  istent represent
9190: 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20  ation.**        
91a0: 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a   of the view..**
91b0: 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20  .**    (3)  Add 
91c0: 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45  terms to the WHE
91d0: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63  RE clause to acc
91e0: 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55  omodate the NATU
91f0: 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20  RAL keyword.**  
9200: 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20         on joins 
9210: 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55  and the ON and U
9220: 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a  SING clause of j
9230: 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  oins..**.**    (
9240: 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73  4)  Scan the lis
9250: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  t of columns in 
9260: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28  the result set (
9270: 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a  pEList) looking.
9280: 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69  **         for i
9290: 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
92a0: 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  "*" operator or 
92b0: 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72  the TABLE.* oper
92c0: 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ator..**        
92d0: 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e   If found, expan
92e0: 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65  d each "*" to be
92f0: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
9300: 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20   every table.** 
9310: 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c          and TABL
9320: 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20  E.* to be every 
9330: 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e  column in TABLE.
9340: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  .**.** Return 0 
9350: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
9360: 74 68 65 72 65 20 61 72 65 20 70 72 6f 62 6c 65  there are proble
9370: 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ms, leave an err
9380: 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e  or message.** in
9390: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
93a0: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a  rn non-zero..*/.
93b0: 73 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 53  static int prepS
93c0: 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65 20  electStmt(Parse 
93d0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
93e0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  *p){.  int i, j,
93f0: 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69 73   k, rc;.  SrcLis
9400: 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45  t *pTabList;.  E
9410: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
9420: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
9430: 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a  t_item *pFrom;..
9440: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d    if( p==0 || p-
9450: 3e 70 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c 69  >pSrc==0 || sqli
9460: 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
9470: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
9480: 31 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73  1;.  }.  pTabLis
9490: 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  t = p->pSrc;.  p
94a0: 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
94b0: 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  t;..  /* Make su
94c0: 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  re cursor number
94d0: 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
94e0: 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72  gned to all entr
94f0: 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20  ies in.  ** the 
9500: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
9510: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
9520: 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ent..  */.  sqli
9530: 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
9540: 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
9550: 70 2d 3e 70 53 72 63 29 3b 0a 0a 20 20 2f 2a 20  p->pSrc);..  /* 
9560: 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61  Look up every ta
9570: 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65  ble named in the
9580: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
9590: 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a  the select.  If.
95a0: 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66    ** an entry of
95b0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
95c0: 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69   is a subquery i
95d0: 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c  nstead of a tabl
95e0: 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20  e or view,.  ** 
95f0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72  then create a tr
9600: 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74  ansient table st
9610: 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72  ructure to descr
9620: 69 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ibe the subquery
9630: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
9640: 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
9650: 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
9660: 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
9670: 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  m++){.    Table 
9680: 2a 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  *pTab;.    if( p
9690: 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b  From->pTab!=0 ){
96a0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73  .      /* This s
96b0: 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72  tatement has alr
96c0: 65 61 64 79 20 62 65 65 6e 20 70 72 65 70 61 72  eady been prepar
96d0: 65 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ed.  There is no
96e0: 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74   need.      ** t
96f0: 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f  o go further. */
9700: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
9710: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  ==0 );.      ret
9720: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
9730: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d   if( pFrom->zNam
9740: 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  e==0 ){.#ifndef 
9750: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
9760: 55 45 52 59 0a 20 20 20 20 20 20 2f 2a 20 41 20  UERY.      /* A 
9770: 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
9780: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
9790: 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
97a0: 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
97b0: 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20  >pSelect!=0 );. 
97c0: 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e       if( pFrom->
97d0: 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20  zAlias==0 ){.   
97e0: 20 20 20 20 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69       pFrom->zAli
97f0: 61 73 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73  as =.          s
9800: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 73  qlite3MPrintf("s
9810: 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79 5f 25  qlite_subquery_%
9820: 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70 46 72 6f  p_", (void*)pFro
9830: 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
9840: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
9850: 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
9860: 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  0 );.      pFrom
9870: 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
9880: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9890: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
98a0: 74 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 2d  t(pParse, pFrom-
98b0: 3e 7a 41 6c 69 61 73 2c 20 70 46 72 6f 6d 2d 3e  >zAlias, pFrom->
98c0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
98d0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
98e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
98f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
9900: 2a 20 54 68 65 20 69 73 45 70 68 65 6d 20 66 6c  * The isEphem fl
9910: 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
9920: 74 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  t the Table stru
9930: 63 74 75 72 65 20 68 61 73 20 62 65 65 6e 0a 20  cture has been. 
9940: 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61       ** dynamica
9950: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  lly allocated an
9960: 64 20 6d 61 79 20 62 65 20 66 72 65 65 64 20 61  d may be freed a
9970: 74 20 61 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20  t any time.  In 
9980: 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 20 20 20  other words,.   
9990: 20 20 20 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f     ** pTab is no
99a0: 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  t pointing to a 
99b0: 70 65 72 73 69 73 74 65 6e 74 20 74 61 62 6c 65  persistent table
99c0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
99d0: 64 65 66 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a  defines.      **
99e0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 63 68   part of the sch
99f0: 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54  ema. */.      pT
9a00: 61 62 2d 3e 69 73 45 70 68 65 6d 20 3d 20 31 3b  ab->isEphem = 1;
9a10: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
9a20: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f  e{.      /* An o
9a30: 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72  rdinary table or
9a40: 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68   view name in th
9a50: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
9a60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9a70: 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
9a80: 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
9a90: 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20  ab = pTab = .   
9aa0: 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61       sqlite3Loca
9ab0: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 70  teTable(pParse,p
9ac0: 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f  From->zName,pFro
9ad0: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
9ae0: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
9af0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
9b00: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
9b10: 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
9b20: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
9b30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
9b40: 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51   || !defined (SQ
9b50: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
9b60: 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66  LTABLE).      if
9b70: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
9b80: 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  || IsVirtual(pTa
9b90: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  b) ){.        /*
9ba0: 20 57 65 20 72 65 61 63 68 20 68 65 72 65 20 69   We reach here i
9bb0: 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
9bc0: 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20  e is a really a 
9bd0: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20  view */.        
9be0: 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47  if( sqlite3ViewG
9bf0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
9c00: 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20  arse, pTab) ){. 
9c10: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
9c20: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
9c30: 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72 6f 6d       /* If pFrom
9c40: 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 69 74 20  ->pSelect!=0 it 
9c50: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61  means we are dea
9c60: 6c 69 6e 67 20 77 69 74 68 20 61 0a 20 20 20 20  ling with a.    
9c70: 20 20 20 20 2a 2a 20 76 69 65 77 20 77 69 74 68      ** view with
9c80: 69 6e 20 61 20 76 69 65 77 2e 20 20 54 68 65 20  in a view.  The 
9c90: 53 45 4c 45 43 54 20 73 74 72 75 63 74 75 72 65  SELECT structure
9ca0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
9cb0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70  n.        ** cop
9cc0: 69 65 64 20 62 79 20 74 68 65 20 6f 75 74 65 72  ied by the outer
9cd0: 20 76 69 65 77 20 73 6f 20 77 65 20 63 61 6e 20   view so we can 
9ce0: 73 6b 69 70 20 74 68 65 20 63 6f 70 79 20 73 74  skip the copy st
9cf0: 65 70 20 68 65 72 65 0a 20 20 20 20 20 20 20 20  ep here.        
9d00: 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20  ** in the inner 
9d10: 76 69 65 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f  view..        */
9d20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72  .        if( pFr
9d30: 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  om->pSelect==0 )
9d40: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f  {.          pFro
9d50: 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
9d60: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 54  ite3SelectDup(pT
9d70: 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ab->pSelect);.  
9d80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9d90: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
9da0: 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e  ..  /* Process N
9db0: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c  ATURAL keywords,
9dc0: 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e   and ON and USIN
9dd0: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69  G clauses of joi
9de0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ns..  */.  if( s
9df0: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
9e00: 28 70 50 61 72 73 65 2c 20 70 29 20 29 20 72 65  (pParse, p) ) re
9e10: 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f  turn 1;..  /* Fo
9e20: 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74  r every "*" that
9e30: 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63   occurs in the c
9e40: 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65  olumn list, inse
9e50: 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  rt the names of.
9e60: 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73    ** all columns
9e70: 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20   in all tables. 
9e80: 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54   And for every T
9e90: 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68  ABLE.* insert th
9ea0: 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20  e names.  ** of 
9eb0: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54  all columns in T
9ec0: 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65  ABLE.  The parse
9ed0: 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65  r inserted a spe
9ee0: 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a  cial expression.
9ef0: 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b    ** with the TK
9f00: 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f  _ALL operator fo
9f10: 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20  r each "*" that 
9f20: 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  it found in the 
9f30: 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a  column list..  *
9f40: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
9f50: 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f  code just has to
9f60: 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41   locate the TK_A
9f70: 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  LL expressions a
9f80: 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65  nd expand.  ** e
9f90: 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c  ach one to the l
9fa0: 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d  ist of all colum
9fb0: 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
9fc0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
9fd0: 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20  first loop just 
9fe0: 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
9ff0: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22   there are any "
a000: 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a  *" operators.  *
a010: 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61  * that need expa
a020: 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  nding..  */.  fo
a030: 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
a040: 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
a050: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c    Expr *pE = pEL
a060: 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b  ist->a[k].pExpr;
a070: 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
a080: 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b  =TK_ALL ) break;
a090: 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
a0a0: 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70  =TK_DOT && pE->p
a0b0: 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69  Right && pE->pRi
a0c0: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a  ght->op==TK_ALL.
a0d0: 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e           && pE->
a0e0: 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65  pLeft && pE->pLe
a0f0: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20  ft->op==TK_ID ) 
a100: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20  break;.  }.  rc 
a110: 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c  = 0;.  if( k<pEL
a120: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
a130: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77    /*.    ** If w
a140: 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65  e get here it me
a150: 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  ans the result s
a160: 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  et contains one 
a170: 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20  or more "*".    
a180: 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  ** operators tha
a190: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
a1a0: 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72  anded.  Loop thr
a1b0: 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
a1c0: 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74  sion.    ** in t
a1d0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
a1e0: 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e  d expand them on
a1f0: 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f  e by one..    */
a200: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
a210: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70  List_item *a = p
a220: 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78  EList->a;.    Ex
a230: 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30  prList *pNew = 0
a240: 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  ;.    int flags 
a250: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  = pParse->db->fl
a260: 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e  ags;.    int lon
a270: 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20  gNames = (flags 
a280: 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
a290: 4e 61 6d 65 73 29 21 3d 30 20 26 26 0a 20 20 20  Names)!=0 &&.   
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2b0: 20 20 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49     (flags & SQLI
a2c0: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
a2d0: 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b  )==0;..    for(k
a2e0: 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
a2f0: 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  xpr; k++){.     
a300: 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d   Expr *pE = a[k]
a310: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
a320: 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ( pE->op!=TK_ALL
a330: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 28   &&.           (
a340: 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
a350: 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20  | pE->pRight==0 
a360: 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  || pE->pRight->o
a370: 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20  p!=TK_ALL) ){.  
a380: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61        /* This pa
a390: 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73  rticular express
a3a0: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
a3b0: 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
a3c0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
a3d0: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
a3e0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
a3f0: 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78  d(pNew, a[k].pEx
a400: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
a410: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
a420: 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
a430: 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
a440: 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
a450: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
a460: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
a470: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a480: 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d      a[k].pExpr =
a490: 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d   0;.        a[k]
a4a0: 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  .zName = 0;.    
a4b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a4c0: 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
a4d0: 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
a4e0: 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
a4f0: 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
a500: 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
a510: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
a520: 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
a530: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
a540: 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
a550: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  es */.        ch
a560: 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20  ar *zTName;     
a570: 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f         /* text o
a580: 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20  f name of TABLE 
a590: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
a5a0: 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
a5b0: 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20   pE->pLeft ){.  
a5c0: 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d          zTName =
a5d0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
a5e0: 54 6f 6b 65 6e 28 26 70 45 2d 3e 70 4c 65 66 74  Token(&pE->pLeft
a5f0: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
a600: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a610: 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20     zTName = 0;. 
a620: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a630: 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
a640: 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
a650: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
a660: 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
a670: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
a680: 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
a690: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  b;.          cha
a6a0: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46  r *zTabName = pF
a6b0: 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  rom->zAlias;.   
a6c0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
a6d0: 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61  ame==0 || zTabNa
a6e0: 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20  me[0]==0 ){ .   
a6f0: 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d           zTabNam
a700: 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
a710: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
a720: 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
a730: 65 20 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d  e && (zTabName==
a740: 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d  0 || zTabName[0]
a750: 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ==0 || .        
a760: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a770: 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20  StrICmp(zTName, 
a780: 7a 54 61 62 4e 61 6d 65 29 21 3d 30 29 20 29 7b  zTabName)!=0) ){
a790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
a7a0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
a7b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61 62   }.          tab
a7c0: 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  leSeen = 1;.    
a7d0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
a7e0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
a7f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  ){.            E
a800: 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 52 69  xpr *pExpr, *pRi
a810: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ght;.           
a820: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
a830: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
a840: 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  me;..           
a850: 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20   if( i>0 ){.    
a860: 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
a870: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
a880: 4c 65 66 74 20 3d 20 26 70 54 61 62 4c 69 73 74  Left = &pTabList
a890: 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20 20 20 20  ->a[i-1];.      
a8a0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 65          if( (pLe
a8b0: 66 74 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  ft[1].jointype &
a8c0: 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20   JT_NATURAL)!=0 
a8d0: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
a8e0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d             colum
a8f0: 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70 54  nIndex(pLeft->pT
a900: 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ab, zName)>=0 ){
a910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a920: 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c   /* In a NATURAL
a930: 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20   join, omit the 
a940: 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  join columns fro
a950: 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  m the .         
a960: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
a970: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
a980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a990: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
a9a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a9b0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
a9c0: 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
a9d0: 4c 65 66 74 5b 31 5d 2e 70 55 73 69 6e 67 2c 20  Left[1].pUsing, 
a9e0: 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
aa00: 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61  In a join with a
aa10: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f   USING clause, o
aa20: 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  mit columns in t
aa30: 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  he.             
aa40: 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75     ** using clau
aa50: 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  se from the tabl
aa60: 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20  e on the right. 
aa70: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
aa80: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
aa90: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
aaa0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
aab0: 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20         pRight = 
aac0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
aad0: 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
aae0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69           if( pRi
aaf0: 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ght==0 ) break;.
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54              setT
ab10: 6f 6b 65 6e 28 26 70 52 69 67 68 74 2d 3e 74 6f  oken(&pRight->to
ab20: 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ken, zName);.   
ab30: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
ab40: 62 4e 61 6d 65 20 26 26 20 28 6c 6f 6e 67 4e 61  bName && (longNa
ab50: 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d  mes || pTabList-
ab60: 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20  >nSrc>1) ){.    
ab70: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
ab80: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
ab90: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
aba0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
abb0: 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
abc0: 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70  e3Expr(TK_DOT, p
abd0: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29  Left, pRight, 0)
abe0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
abf0: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 62  if( pExpr==0 ) b
ac00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
ac10: 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 4c      setToken(&pL
ac20: 65 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62  eft->token, zTab
ac30: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
ac40: 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70       setToken(&p
ac50: 45 78 70 72 2d 3e 73 70 61 6e 2c 20 73 71 6c 69  Expr->span, sqli
ac60: 74 65 33 4d 50 72 69 6e 74 66 28 22 25 73 2e 25  te3MPrintf("%s.%
ac70: 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e  s", zTabName, zN
ac80: 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ame));.         
ac90: 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e       pExpr->span
aca0: 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  .dyn = 1;.      
acb0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
acc0: 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20  oken.z = 0;.    
acd0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
ace0: 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20  >token.n = 0;.  
acf0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
ad00: 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30  r->token.dyn = 0
ad10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
ad20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
ad30: 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68     pExpr = pRigh
ad40: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
ad50: 20 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70   pExpr->span = p
ad60: 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Expr->token;.   
ad70: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ad80: 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
ad90: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
ada0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
adb0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
adc0: 6e 64 28 70 4e 65 77 2c 20 70 45 78 70 72 2c 20  nd(pNew, pExpr, 
add0: 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20  &pExpr->span);. 
ade0: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
adf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
ae00: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
ae10: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65  prListAppend(pNe
ae20: 77 2c 20 70 45 78 70 72 2c 20 26 70 52 69 67 68  w, pExpr, &pRigh
ae30: 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  t->token);.     
ae40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ae50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
ae60: 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c         if( !tabl
ae70: 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  eSeen ){.       
ae80: 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b     if( zTName ){
ae90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
aea0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
aeb0: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
aec0: 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65  ble: %s", zTName
aed0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
aee0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
aef0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
af00: 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c  pParse, "no tabl
af10: 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  es specified");.
af20: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
af30: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
af40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
af50: 73 71 6c 69 74 65 46 72 65 65 28 7a 54 4e 61 6d  sqliteFree(zTNam
af60: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
af70: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
af80: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45 4c 69  rListDelete(pELi
af90: 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69  st);.    p->pELi
afa0: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  st = pNew;.  }. 
afb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
afc0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
afd0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
afe0: 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CT./*.** This ro
aff0: 75 74 69 6e 65 20 61 73 73 6f 63 69 61 74 65 73  utine associates
b000: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 6e 20 4f   entries in an O
b010: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
b020: 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20  on list with.** 
b030: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65 73  columns in a res
b040: 75 6c 74 2e 20 20 46 6f 72 20 65 61 63 68 20 4f  ult.  For each O
b050: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
b060: 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65 20 6f  on, the opcode o
b070: 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76  f.** the top-lev
b080: 65 6c 20 6e 6f 64 65 20 69 73 20 63 68 61 6e 67  el node is chang
b090: 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20  ed to TK_COLUMN 
b0a0: 61 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20  and the iColumn 
b0b0: 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
b0c0: 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69  top-level node i
b0d0: 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68  s filled in with
b0e0: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61   column number a
b0f0: 6e 64 20 74 68 65 20 69 54 61 62 6c 65 0a 2a 2a  nd the iTable.**
b100: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 6f   value of the to
b110: 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20  p-level node is 
b120: 66 69 6c 6c 65 64 20 77 69 74 68 20 69 54 61 62  filled with iTab
b130: 6c 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  le parameter..**
b140: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
b150: 20 70 72 69 6f 72 20 53 45 4c 45 43 54 20 63 6c   prior SELECT cl
b160: 61 75 73 65 73 2c 20 74 68 65 79 20 61 72 65 20  auses, they are 
b170: 70 72 6f 63 65 73 73 65 64 20 66 69 72 73 74 2e  processed first.
b180: 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e 20    A match.** in 
b190: 61 6e 20 65 61 72 6c 69 65 72 20 53 45 4c 45 43  an earlier SELEC
b1a0: 54 20 74 61 6b 65 73 20 70 72 65 63 65 64 65 6e  T takes preceden
b1b0: 63 65 20 6f 76 65 72 20 61 20 6c 61 74 65 72 20  ce over a later 
b1c0: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e  SELECT..**.** An
b1d0: 79 20 65 6e 74 72 79 20 74 68 61 74 20 64 6f 65  y entry that doe
b1e0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 69 73 20 66  s not match is f
b1f0: 6c 61 67 67 65 64 20 61 73 20 61 6e 20 65 72 72  lagged as an err
b200: 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a  or.  The number.
b210: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20 69 73 20  ** of errors is 
b220: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
b230: 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72 64  tic int matchOrd
b240: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20  erbyToColumn(.  
b250: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b260: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 6c 61          /* A pla
b270: 63 65 20 74 6f 20 6c 65 61 76 65 20 65 72 72 6f  ce to leave erro
b280: 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20  r messages */.  
b290: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
b2a0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68          /* Match
b2b0: 20 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   to result colum
b2c0: 6e 73 20 6f 66 20 74 68 69 73 20 53 45 4c 45 43  ns of this SELEC
b2d0: 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  T */.  ExprList 
b2e0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f  *pOrderBy,     /
b2f0: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 76  * The ORDER BY v
b300: 61 6c 75 65 73 20 74 6f 20 6d 61 74 63 68 20 61  alues to match a
b310: 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a  gainst columns *
b320: 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
b330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
b340: 6e 73 65 72 74 20 74 68 69 73 20 76 61 6c 75 65  nsert this value
b350: 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20   in iTable */.  
b360: 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65  int mustComplete
b370: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54 52          /* If TR
b380: 55 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 73  UE all ORDER BYs
b390: 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29   must match */.)
b3a0: 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  {.  int nErr = 0
b3b0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
b3c0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
b3d0: 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  ;..  if( pSelect
b3e0: 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d  ==0 || pOrderBy=
b3f0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
b400: 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74   if( mustComplet
b410: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
b420: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
b430: 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65  xpr; i++){ pOrde
b440: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d  rBy->a[i].done =
b450: 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20   0; }.  }.  if( 
b460: 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70  prepSelectStmt(p
b470: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20  Parse, pSelect) 
b480: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
b490: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65  .  }.  if( pSele
b4a0: 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20  ct->pPrior ){.  
b4b0: 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65 72    if( matchOrder
b4c0: 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  byToColumn(pPars
b4d0: 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  e, pSelect->pPri
b4e0: 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69 54  or, pOrderBy, iT
b4f0: 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  able, 0) ){.    
b500: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b510: 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d  }.  }.  pEList =
b520: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
b530: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
b540: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
b550: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
b560: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
b570: 70 49 74 65 6d 3b 0a 20 20 20 20 45 78 70 72 20  pItem;.    Expr 
b580: 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  *pE = pOrderBy->
b590: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
b5a0: 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20  int iCol = -1;. 
b5b0: 20 20 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c 3b     char *zLabel;
b5c0: 0a 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  ..    if( pOrder
b5d0: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20  By->a[i].done ) 
b5e0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
b5f0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
b600: 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c  nteger(pE, &iCol
b610: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ) ){.      if( i
b620: 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70  Col<=0 || iCol>p
b630: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
b640: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
b650: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
b660: 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52            "ORDER
b670: 20 42 59 20 70 6f 73 69 74 69 6f 6e 20 25 64 20   BY position %d 
b680: 73 68 6f 75 6c 64 20 62 65 20 62 65 74 77 65 65  should be betwee
b690: 6e 20 31 20 61 6e 64 20 25 64 22 2c 0a 20 20 20  n 1 and %d",.   
b6a0: 20 20 20 20 20 20 20 69 43 6f 6c 2c 20 70 45 4c         iCol, pEL
b6b0: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
b6c0: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
b6d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b6e0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 6d    }.      if( !m
b6f0: 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 20 63 6f  ustComplete ) co
b700: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 43  ntinue;.      iC
b710: 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ol--;.    }.    
b720: 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 28 7a  if( iCol<0 && (z
b730: 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 4e  Label = sqlite3N
b740: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70 45  ameFromToken(&pE
b750: 2d 3e 74 6f 6b 65 6e 29 29 21 3d 30 20 29 7b 0a  ->token))!=0 ){.
b760: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
b770: 49 74 65 6d 3d 70 45 4c 69 73 74 2d 3e 61 3b 20  Item=pEList->a; 
b780: 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  j<pEList->nExpr;
b790: 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
b7a0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
b7b0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ame;.        int
b7c0: 20 69 73 4d 61 74 63 68 3b 0a 20 20 20 20 20 20   isMatch;.      
b7d0: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61    if( pItem->zNa
b7e0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
b7f0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  zName = sqlite3S
b800: 74 72 44 75 70 28 70 49 74 65 6d 2d 3e 7a 4e 61  trDup(pItem->zNa
b810: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  me);.        }el
b820: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4e  se{.          zN
b830: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
b840: 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70 49 74 65  eFromToken(&pIte
b850: 6d 2d 3e 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 29  m->pExpr->token)
b860: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b870: 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 7a 4e      isMatch = zN
b880: 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74  ame && sqlite3St
b890: 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61  rICmp(zName, zLa
b8a0: 62 65 6c 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  bel)==0;.       
b8b0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
b8c0: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
b8d0: 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  isMatch ){.     
b8e0: 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20       iCol = j;. 
b8f0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b900: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b910: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  }.      sqliteFr
b920: 65 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20  ee(zLabel);.    
b930: 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d  }.    if( iCol>=
b940: 30 20 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e 6f  0 ){.      pE->o
b950: 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
b960: 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
b970: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70   = iCol;.      p
b980: 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  E->iTable = iTab
b990: 6c 65 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 41  le;.      pE->iA
b9a0: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  gg = -1;.      p
b9b0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f  OrderBy->a[i].do
b9c0: 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ne = 1;.    }els
b9d0: 65 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65  e if( mustComple
b9e0: 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  te ){.      sqli
b9f0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
ba00: 73 65 2c 0a 20 20 20 20 20 20 20 20 22 4f 52 44  se,.        "ORD
ba10: 45 52 20 42 59 20 74 65 72 6d 20 6e 75 6d 62 65  ER BY term numbe
ba20: 72 20 25 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61  r %d does not ma
ba30: 74 63 68 20 61 6e 79 20 72 65 73 75 6c 74 20 63  tch any result c
ba40: 6f 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20 20  olumn", i+1);.  
ba50: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
ba60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ba70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72   }.  return nErr
ba80: 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;  .}.#endif /* 
ba90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
baa0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
bab0: 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65  ECT */../*.** Ge
bac0: 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65  t a VDBE for the
bad0: 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f   given parser co
bae0: 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61  ntext.  Create a
baf0: 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65   new one if nece
bb00: 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20  ssary..** If an 
bb10: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
bb20: 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65  turn NULL and le
bb30: 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e  ave a message in
bb40: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65   pParse..*/.Vdbe
bb50: 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65   *sqlite3GetVdbe
bb60: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
bb70: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
bb80: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
bb90: 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20  ( v==0 ){.    v 
bba0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  = pParse->pVdbe 
bbb0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65  = sqlite3VdbeCre
bbc0: 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ate(pParse->db);
bbd0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b  .  }.  return v;
bbe0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
bbf0: 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
bc00: 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
bc10: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
bc20: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70  ased on the.** p
bc30: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
bc40: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  t expressions.  
bc50: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
bc60: 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  et hold the expr
bc70: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
bc80: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72  appear in the or
bc90: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
bca0: 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c  ment after the L
bcb0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
bcc0: 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  ** keywords.  Or
bcd0: 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b   NULL if those k
bce0: 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74  eywords are omit
bcf0: 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20  ted. iLimit and 
bd00: 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20  iOffset .** are 
bd10: 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
bd20: 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
bd30: 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73  ers for counters
bd40: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
bd50: 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61   .** the limit a
bd60: 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74  nd offset.  If t
bd70: 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74  here is no limit
bd80: 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20   and/or offset, 
bd90: 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20  then .** iLimit 
bda0: 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
bdb0: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
bdc0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
bdd0: 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
bde0: 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  of iLimit and iO
bdf0: 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
be00: 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
be10: 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
be20: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
be30: 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64  set.  iLimit and
be40: 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75  .** iOffset shou
be50: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
be60: 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
be70: 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
be80: 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75  s.** (usually bu
be90: 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29  t not always -1)
bea0: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
beb0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
bec0: 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69  ** Only if pLimi
bed0: 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21  t!=0 or pOffset!
bee0: 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  =0 do the limit 
bef0: 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
bf00: 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
bf10: 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
bf20: 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
bf30: 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
bf40: 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
bf50: 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
bf60: 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
bf70: 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
bf80: 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
bf90: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
bfa0: 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
bfb0: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
bfc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
bfd0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72  lect *p, int iBr
bfe0: 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  eak){.  Vdbe *v 
bff0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69  = 0;.  int iLimi
c000: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  t = 0;.  int iOf
c010: 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72  fset;.  int addr
c020: 31 2c 20 61 64 64 72 32 3b 0a 0a 20 20 2f 2a 20  1, addr2;..  /* 
c030: 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22  .  ** "LIMIT -1"
c040: 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c   always shows al
c050: 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69  l rows.  There i
c060: 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74  s some.  ** cont
c070: 72 61 76 65 72 73 79 20 61 62 6f 75 74 20 77 68  raversy about wh
c080: 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  at the correct b
c090: 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62  ehavior should b
c0a0: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72  e..  ** The curr
c0b0: 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
c0c0: 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c  on interprets "L
c0d0: 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a  IMIT 0" to mean.
c0e0: 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20    ** no rows..  
c0f0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  */.  if( p->pLim
c100: 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69  it ){.    p->iLi
c110: 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 70  mit = iLimit = p
c120: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
c130: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
c140: 20 32 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69   2;.    v = sqli
c150: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
c160: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
c170: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73   ) return;.    s
c180: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
c190: 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74  Parse, p->pLimit
c1a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
c1b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75  beAddOp(v, OP_Mu
c1c0: 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a  stBeInt, 0, 0);.
c1d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c1e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
c1f0: 6f 72 65 2c 20 69 4c 69 6d 69 74 2c 20 30 29 3b  ore, iLimit, 0);
c200: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
c210: 28 28 76 2c 20 22 23 20 4c 49 4d 49 54 20 63 6f  ((v, "# LIMIT co
c220: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 73 71  unter"));.    sq
c230: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c240: 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20  , OP_IfMemZero, 
c250: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
c260: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f  .  }.  if( p->pO
c270: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 70 2d 3e  ffset ){.    p->
c280: 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65  iOffset = iOffse
c290: 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  t = pParse->nMem
c2a0: 2b 2b 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  ++;.    v = sqli
c2b0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
c2c0: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
c2d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73   ) return;.    s
c2e0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
c2f0: 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65  Parse, p->pOffse
c300: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
c310: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
c320: 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b  ustBeInt, 0, 0);
c330: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c340: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
c350: 74 6f 72 65 2c 20 69 4f 66 66 73 65 74 2c 20 70  tore, iOffset, p
c360: 2d 3e 70 4c 69 6d 69 74 3d 3d 30 29 3b 0a 20 20  ->pLimit==0);.  
c370: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
c380: 2c 20 22 23 20 4f 46 46 53 45 54 20 63 6f 75 6e  , "# OFFSET coun
c390: 74 65 72 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ter"));.    addr
c3a0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
c3b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d  ddOp(v, OP_IfMem
c3c0: 50 6f 73 2c 20 69 4f 66 66 73 65 74 2c 20 30 29  Pos, iOffset, 0)
c3d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c3e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
c3f0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 1, 0);.    sql
c400: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c410: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
c420: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
c430: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
c440: 64 64 72 31 29 3b 0a 20 20 20 20 69 66 28 20 70  ddr1);.    if( p
c450: 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
c460: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c470: 4f 70 28 76 2c 20 4f 50 5f 41 64 64 2c 20 30 2c  Op(v, OP_Add, 0,
c480: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
c490: 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
c4a0: 7b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  {.    addr1 = sq
c4b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c4c0: 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69  , OP_IfMemPos, i
c4d0: 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73  Limit, 0);.    s
c4e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c4f0: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
c500: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c510: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
c520: 49 6e 74 2c 20 2d 31 2c 20 69 4c 69 6d 69 74 2b  Int, -1, iLimit+
c530: 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  1);.    addr2 = 
c540: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c550: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
c560: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
c570: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
c580: 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddr1);.    sqlit
c590: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c5a0: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4c 69 6d  P_MemStore, iLim
c5b0: 69 74 2b 31 2c 20 31 29 3b 0a 20 20 20 20 56 64  it+1, 1);.    Vd
c5c0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
c5d0: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29   LIMIT+OFFSET"))
c5e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c5f0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
c600: 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  r2);.  }.}../*.*
c610: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 76 69 72  * Allocate a vir
c620: 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73  tual index to us
c630: 65 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e 0a 2a  e for sorting..*
c640: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72  /.static void cr
c650: 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78  eateSortingIndex
c660: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
c670: 53 65 6c 65 63 74 20 2a 70 2c 20 45 78 70 72 4c  Select *p, ExprL
c680: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a  ist *pOrderBy){.
c690: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
c6a0: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  {.    int addr;.
c6b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 64      assert( pOrd
c6c0: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3d 3d  erBy->iECursor==
c6d0: 30 20 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42  0 );.    pOrderB
c6e0: 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50  y->iECursor = pP
c6f0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
c700: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
c710: 56 64 62 65 41 64 64 4f 70 28 70 50 61 72 73 65  VdbeAddOp(pParse
c720: 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4f 70 65 6e  ->pVdbe, OP_Open
c730: 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20  Ephemeral,.     
c740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c750: 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
c760: 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65  >iECursor, pOrde
c770: 72 42 79 2d 3e 6e 45 78 70 72 2b 31 29 3b 0a 20  rBy->nExpr+1);. 
c780: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
c790: 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 3d  drOpenEphm[2] ==
c7a0: 20 2d 31 20 29 3b 0a 20 20 20 20 70 2d 3e 61 64   -1 );.    p->ad
c7b0: 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
c7c0: 61 64 64 72 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  addr;.  }.}..#if
c7d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c7e0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
c7f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
c800: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
c810: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
c820: 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68   for the iCol-th
c830: 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
c840: 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72  e result set for
c850: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65   the compound-se
c860: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22  lect statement "
c870: 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  p".  Return NULL
c880: 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   if.** the colum
c890: 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74  n has no default
c8a0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
c8b0: 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  nce..**.** The c
c8c0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
c8d0: 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  e for the compou
c8e0: 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b  nd select is tak
c8f0: 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c  en from the.** l
c900: 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
c910: 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74   the select that
c920: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
c930: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74   sequence..*/.st
c940: 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75  atic CollSeq *mu
c950: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
c960: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
c970: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
c980: 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  Col){.  CollSeq 
c990: 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e  *pRet;.  if( p->
c9a0: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52  pPrior ){.    pR
c9b0: 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  et = multiSelect
c9c0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
c9d0: 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29  p->pPrior, iCol)
c9e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
c9f0: 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  Ret = 0;.  }.  i
ca00: 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20  f( pRet==0 ){.  
ca10: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
ca20: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
ca30: 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  se, p->pEList->a
ca40: 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20  [iCol].pExpr);. 
ca50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
ca60: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
ca70: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
ca80: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69  ND_SELECT */..#i
ca90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
caa0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
cab0: 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  T./*.** This rou
cac0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
cad0: 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75 65 72  o process a quer
cae0: 79 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c 79  y that is really
caf0: 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72   the union.** or
cb00: 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
cb10: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
cb20: 61 72 61 74 65 20 71 75 65 72 69 65 73 2e 0a 2a  arate queries..*
cb30: 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20  *.** "p" points 
cb40: 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
cb50: 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65  t of the two que
cb60: 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79  ries.  the query
cb70: 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20   on the.** left 
cb80: 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54  is p->pPrior.  T
cb90: 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f  he left query co
cba0: 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f  uld also be a co
cbb0: 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20  mpound query.** 
cbc0: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
cbd0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
cbe0: 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  be called recurs
cbf0: 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ively. .**.** Th
cc00: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
cc10: 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65   total query are
cc20: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
cc30: 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f  nto a destinatio
cc40: 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65  n.** of type eDe
cc50: 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  st with paramete
cc60: 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45  r iParm..**.** E
cc70: 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69  xample 1:  Consi
cc80: 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20  der a three-way 
cc90: 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61  compound SQL sta
cca0: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  tement..**.**   
ccb0: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
ccc0: 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t1 UNION SELECT 
ccd0: 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  b FROM t2 UNION 
cce0: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
ccf0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74  .**.** This stat
cd00: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20  ement is parsed 
cd10: 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  up as follows:.*
cd20: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
cd30: 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20  c FROM t3.**    
cd40: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d    |.**      `---
cd50: 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52  -->  SELECT b FR
cd60: 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20  OM t2.**        
cd70: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d              `---
cd90: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46  --->  SELECT a F
cda0: 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65  ROM t1.**.** The
cdb0: 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64   arrows in the d
cdc0: 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70  iagram above rep
cdd0: 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63  resent the Selec
cde0: 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72  t.pPrior pointer
cdf0: 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20  ..** So if this 
ce00: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
ce10: 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74  d with p equal t
ce20: 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20  o the t3 query, 
ce30: 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77  then.** pPrior w
ce40: 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75  ill be the t2 qu
ce50: 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c  ery.  p->op will
ce60: 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20   be TK_UNION in 
ce70: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
ce80: 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63   Notice that bec
ce90: 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20  ause of the way 
cea0: 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f  SQLite parses co
ceb0: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20  mpound SELECTs, 
cec0: 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
ced0: 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73  l selects always
cee0: 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74   group from left
cef0: 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74   to right..*/.st
cf00: 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
cf10: 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
cf20: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
cf30: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
cf40: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cf60: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
cf70: 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
cf80: 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 65 44  oded */.  int eD
cf90: 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  est,            
cfa0: 2f 2a 20 5c 5f 5f 5f 20 20 53 74 6f 72 65 20 71  /* \___  Store q
cfb0: 75 65 72 79 20 72 65 73 75 6c 74 73 20 61 73 20  uery results as 
cfc0: 73 70 65 63 69 66 69 65 64 20 2a 2f 0a 20 20 69  specified */.  i
cfd0: 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20  nt iParm,       
cfe0: 20 20 20 20 20 2f 2a 20 2f 20 20 20 20 20 62 79       /* /     by
cff0: 20 74 68 65 73 65 20 74 77 6f 20 70 61 72 61 6d   these two param
d000: 65 74 65 72 73 2e 20 20 20 20 20 20 20 20 20 2a  eters.         *
d010: 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20  /.  char *aff   
d020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
d030: 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69  eDest is SRT_Uni
d040: 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79  on, the affinity
d050: 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
d060: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d070: 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73  OK;   /* Success
d080: 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62   code from a sub
d090: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c  routine */.  Sel
d0a0: 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
d0b0: 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
d0c0: 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79  LECT immediately
d0d0: 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a   to our left */.
d0e0: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
d0f0: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
d100: 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73  ate code to this
d110: 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e   VDBE */.  int n
d120: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
d130: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
d140: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
d150: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70  ult set */.  Exp
d160: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
d170: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
d180: 42 59 20 63 6c 61 75 73 65 20 6f 6e 20 70 20 2a  BY clause on p *
d190: 2f 0a 20 20 69 6e 74 20 61 53 65 74 50 32 5b 32  /.  int aSetP2[2
d1a0: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ];        /* Set
d1b0: 20 50 32 20 76 61 6c 75 65 20 6f 66 20 74 68 65   P2 value of the
d1c0: 73 65 20 6f 70 20 74 6f 20 6e 75 6d 62 65 72 20  se op to number 
d1d0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  of columns */.  
d1e0: 69 6e 74 20 6e 53 65 74 50 32 20 3d 20 30 3b 20  int nSetP2 = 0; 
d1f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d200: 6f 66 20 73 6c 6f 74 73 20 69 6e 20 61 53 65 74  of slots in aSet
d210: 50 32 5b 5d 20 75 73 65 64 20 2a 2f 0a 0a 20 20  P2[] used */..  
d220: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
d230: 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
d240: 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73  Y or LIMIT claus
d250: 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43  e on prior SELEC
d260: 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74  Ts.  Only.  ** t
d270: 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d  he last (right-m
d280: 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74  ost) SELECT in t
d290: 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61  he series may ha
d2a0: 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  ve an ORDER BY o
d2b0: 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20  r LIMIT..  */.  
d2c0: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70  if( p==0 || p->p
d2d0: 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
d2e0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
d2f0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
d300: 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72 20  d;.  }.  pPrior 
d310: 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61  = p->pPrior;.  a
d320: 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
d330: 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f  Rightmost!=pPrio
d340: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
d350: 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73  Prior->pRightmos
d360: 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  t==p->pRightmost
d370: 20 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72   );.  if( pPrior
d380: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
d390: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
d3a0: 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20  g(pParse,"ORDER 
d3b0: 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  BY clause should
d3c0: 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
d3d0: 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
d3e0: 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
d3f0: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
d400: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
d410: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
d420: 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d   }.  if( pPrior-
d430: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >pLimit ){.    s
d440: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d450: 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61  Parse,"LIMIT cla
d460: 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
d470: 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
d480: 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
d490: 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
d4a0: 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
d4b0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
d4c0: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
d4d0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  /* Make sure we 
d4e0: 68 61 76 65 20 61 20 76 61 6c 69 64 20 71 75 65  have a valid que
d4f0: 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e  ry engine.  If n
d500: 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77  ot, create a new
d510: 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d   one..  */.  v =
d520: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
d530: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
d540: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
d550: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
d560: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
d570: 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  }..  /* Create t
d580: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
d590: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
d5a0: 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f  f necessary.  */
d5b0: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
d5c0: 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
d5d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
d5e0: 69 73 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ist );.    asser
d5f0: 74 28 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66  t( nSetP2<sizeof
d600: 28 61 53 65 74 50 32 29 2f 73 69 7a 65 6f 66 28  (aSetP2)/sizeof(
d610: 61 53 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20  aSetP2[0]) );.  
d620: 20 20 61 53 65 74 50 32 5b 6e 53 65 74 50 32 2b    aSetP2[nSetP2+
d630: 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  +] = sqlite3Vdbe
d640: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
d650: 45 70 68 65 6d 65 72 61 6c 2c 20 69 50 61 72 6d  Ephemeral, iParm
d660: 2c 20 30 29 3b 0a 20 20 20 20 65 44 65 73 74 20  , 0);.    eDest 
d670: 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d  = SRT_Table;.  }
d680: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
d690: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66  code for the lef
d6a0: 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45  t and right SELE
d6b0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  CT statements.. 
d6c0: 20 2a 2f 0a 20 20 70 4f 72 64 65 72 42 79 20 3d   */.  pOrderBy =
d6d0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
d6e0: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
d6f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
d700: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  : {.      if( pO
d710: 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
d720: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
d730: 30 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  0;.        asser
d740: 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  t( !pPrior->pLim
d750: 69 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  it );.        pP
d760: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rior->pLimit = p
d770: 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
d780: 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65    pPrior->pOffse
d790: 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
d7a0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
d7b0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
d7c0: 65 2c 20 70 50 72 69 6f 72 2c 20 65 44 65 73 74  e, pPrior, eDest
d7d0: 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30  , iParm, 0, 0, 0
d7e0: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  , aff);.        
d7f0: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
d800: 20 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65         p->pOffse
d810: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  t = 0;.        i
d820: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
d830: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
d840: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
d850: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70    }.        p->p
d860: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
d870: 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70     p->iLimit = p
d880: 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20  Prior->iLimit;. 
d890: 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65         p->iOffse
d8a0: 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66  t = pPrior->iOff
d8b0: 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  set;.        if(
d8c0: 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b   p->iLimit>=0 ){
d8d0: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 72 20  .          addr 
d8e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
d8f0: 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65  Op(v, OP_IfMemZe
d900: 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 30  ro, p->iLimit, 0
d910: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
d920: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
d930: 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49  Jump ahead if LI
d940: 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a  MIT reached"));.
d950: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d960: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
d970: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
d980: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c  eDest, iParm, 0,
d990: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
d9a0: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
d9b0: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20   pPrior;.       
d9c0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
d9d0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
d9e0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
d9f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
da00: 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20  ( addr ){.      
da10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
da20: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
da30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
da40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
da50: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20   }.      /* For 
da60: 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52  UNION ALL ... OR
da70: 44 45 52 20 42 59 20 66 61 6c 6c 20 74 68 72 6f  DER BY fall thro
da80: 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
da90: 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
daa0: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
dab0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e  :.    case TK_UN
dac0: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ION: {.      int
dad0: 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a   unionTab;    /*
dae0: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
daf0: 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  f the temporary 
db00: 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65  table holding re
db10: 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  sult */.      in
db20: 74 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 2f  t op = 0;      /
db30: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54  * One of the SRT
db40: 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  _ operations to 
db50: 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f  apply to self */
db60: 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72  .      int prior
db70: 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53  Op;     /* The S
db80: 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  RT_ operation to
db90: 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20   apply to prior 
dba0: 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20  selects */.     
dbb0: 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
dbc0: 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65  pOffset; /* Save
dbd0: 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e  d values of p->n
dbe0: 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66  Limit and p->nOf
dbf0: 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  fset */.      in
dc00: 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 70  t addr;..      p
dc10: 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d  riorOp = p->op==
dc20: 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62  TK_ALL ? SRT_Tab
dc30: 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a  le : SRT_Union;.
dc40: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
dc50: 3d 70 72 69 6f 72 4f 70 20 26 26 20 70 4f 72 64  =priorOp && pOrd
dc60: 65 72 42 79 3d 3d 30 20 26 26 20 21 70 2d 3e 70  erBy==0 && !p->p
dc70: 4c 69 6d 69 74 20 26 26 20 21 70 2d 3e 70 4f 66  Limit && !p->pOf
dc80: 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  fset ){.        
dc90: 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20  /* We can reuse 
dca0: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
dcb0: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  e generated by a
dcc0: 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20   SELECT to our. 
dcd0: 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e         ** right.
dce0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
dcf0: 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 69      unionTab = i
dd00: 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Parm;.      }els
dd10: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  e{.        /* We
dd20: 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72   will need to cr
dd30: 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d  eate our own tem
dd40: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
dd50: 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20  hold the.       
dd60: 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65   ** intermediate
dd70: 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20   results..      
dd80: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
dd90: 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  onTab = pParse->
dda0: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
ddb0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20  if( pOrderBy && 
ddc0: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
ddd0: 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c 20  lumn(pParse, p, 
dde0: 70 4f 72 64 65 72 42 79 2c 20 75 6e 69 6f 6e 54  pOrderBy, unionT
ddf0: 61 62 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ab,1) ){.       
de00: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
de10: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
de20: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
de30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64      }.        ad
de40: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
de50: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
de60: 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e  Ephemeral, union
de70: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
de80: 20 69 66 28 20 70 72 69 6f 72 4f 70 3d 3d 53 52   if( priorOp==SR
de90: 54 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  T_Table ){.     
dea0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 53 65       assert( nSe
deb0: 74 50 32 3c 73 69 7a 65 6f 66 28 61 53 65 74 50  tP2<sizeof(aSetP
dec0: 32 29 2f 73 69 7a 65 6f 66 28 61 53 65 74 50 32  2)/sizeof(aSetP2
ded0: 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20  [0]) );.        
dee0: 20 20 61 53 65 74 50 32 5b 6e 53 65 74 50 32 2b    aSetP2[nSetP2+
def0: 2b 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  +] = addr;.     
df00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
df10: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
df20: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
df30: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  = -1 );.        
df40: 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
df50: 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
df60: 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74         p->pRight
df70: 6d 6f 73 74 2d 3e 75 73 65 73 45 70 68 6d 20 3d  most->usesEphm =
df80: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
df90: 20 20 20 20 20 20 63 72 65 61 74 65 53 6f 72 74        createSort
dfa0: 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ingIndex(pParse,
dfb0: 20 70 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20   p, pOrderBy);. 
dfc0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
dfd0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
dfe0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
dff0: 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  de the SELECT st
e000: 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20  atements to our 
e010: 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  left.      */.  
e020: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
e030: 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b  ior->pOrderBy );
e040: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
e050: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
e060: 2c 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f  , pPrior, priorO
e070: 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20  p, unionTab, 0, 
e080: 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20  0, 0, aff);.    
e090: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
e0a0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
e0b0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
e0c0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
e0d0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
e0e0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20  LECT statement. 
e0f0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 77       */.      sw
e100: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
e110: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f          case TK_
e120: 45 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53 52  EXCEPT:  op = SR
e130: 54 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65 61  T_Except;   brea
e140: 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65  k;.         case
e150: 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20   TK_UNION:   op 
e160: 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20  = SRT_Union;    
e170: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
e180: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20  case TK_ALL:    
e190: 20 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b   op = SRT_Table;
e1a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e1b0: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69   }.      p->pPri
e1c0: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  or = 0;.      p-
e1d0: 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
e1e0: 20 20 20 20 20 70 2d 3e 64 69 73 61 6c 6c 6f 77       p->disallow
e1f0: 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
e200: 42 79 21 3d 30 3b 0a 20 20 20 20 20 20 70 4c 69  By!=0;.      pLi
e210: 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
e220: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
e230: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66   = 0;.      pOff
e240: 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
e250: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
e260: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  et = 0;.      rc
e270: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
e280: 28 70 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20  (pParse, p, op, 
e290: 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20  unionTab, 0, 0, 
e2a0: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70  0, aff);.      p
e2b0: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
e2c0: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  r;.      p->pOrd
e2d0: 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
e2e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
e2f0: 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d  prDelete(p->pLim
e300: 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  it);.      p->pL
e310: 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
e320: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
e330: 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  = pOffset;.     
e340: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b   p->iLimit = -1;
e350: 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
e360: 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 66  t = -1;.      if
e370: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
e380: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
e390: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
e3a0: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  .      /* Conver
e3b0: 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68  t the data in th
e3c0: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
e3d0: 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
e3e0: 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74  form.      ** it
e3f0: 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72   is that we curr
e400: 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20  ently need..    
e410: 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 20    */      .     
e420: 20 69 66 28 20 65 44 65 73 74 21 3d 70 72 69 6f   if( eDest!=prio
e430: 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21  rOp || unionTab!
e440: 3d 69 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20  =iParm ){.      
e450: 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
e460: 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
e470: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
e480: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
e490: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
e4a0: 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
e4b0: 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
e4c0: 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  First = p;.     
e4d0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
e4e0: 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
e4f0: 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
e500: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rior;.          
e510: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
e520: 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
e530: 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
e540: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e550: 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
e560: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
e570: 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e  v);.        iCon
e580: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
e590: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
e5a0: 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
e5b0: 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
e5c0: 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
e5d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e5e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
e5f0: 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  wind, unionTab, 
e600: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
e610: 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
e620: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
e630: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  (v);.        rc 
e640: 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  = selectInnerLoo
e650: 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
e660: 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62  pEList, unionTab
e670: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
e680: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
e690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6a0: 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65   pOrderBy, -1, e
e6b0: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20  Dest, iParm, .  
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6d0: 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74             iCont
e6e0: 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20  , iBreak, 0);.  
e6f0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
e700: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
e710: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
e720: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
e730: 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
e740: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e750: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
e760: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  iCont);.        
e770: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e780: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69  (v, OP_Next, uni
e790: 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a  onTab, iStart);.
e7a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e7b0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
e7c0: 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
e7d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e7e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
e7f0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
e800: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
e810: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
e820: 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
e830: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61  : {.      int ta
e840: 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20  b1, tab2;.      
e850: 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
e860: 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
e870: 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
e880: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  pOffset;.      i
e890: 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20  nt addr;..      
e8a0: 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20  /* INTERSECT is 
e8b0: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
e8c0: 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20  he others since 
e8d0: 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  it requires.    
e8e0: 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61    ** two tempora
e8f0: 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63  ry tables.  Henc
e900: 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e  e it has its own
e910: 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20   case.  Begin.  
e920: 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61      ** by alloca
e930: 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  ting the tables 
e940: 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20  we will need..  
e950: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62      */.      tab
e960: 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  1 = pParse->nTab
e970: 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d  ++;.      tab2 =
e980: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
e990: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
e9a0: 72 42 79 20 26 26 20 6d 61 74 63 68 4f 72 64 65  rBy && matchOrde
e9b0: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
e9c0: 73 65 2c 70 2c 70 4f 72 64 65 72 42 79 2c 74 61  se,p,pOrderBy,ta
e9d0: 62 31 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20  b1,1) ){.       
e9e0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
e9f0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
ea00: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
ea10: 20 20 20 20 20 20 63 72 65 61 74 65 53 6f 72 74        createSort
ea20: 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ingIndex(pParse,
ea30: 20 70 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 0a   p, pOrderBy);..
ea40: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
ea50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ea60: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
ea70: 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  l, tab1, 0);.   
ea80: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
ea90: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
eaa0: 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
eab0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
eac0: 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d  = addr;.      p-
ead0: 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65  >pRightmost->use
eae0: 73 45 70 68 6d 20 3d 20 31 3b 0a 20 20 20 20 20  sEphm = 1;.     
eaf0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
eb00: 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  st );..      /* 
eb10: 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73  Code the SELECTs
eb20: 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74   to our left int
eb30: 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
eb40: 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20  e "tab1"..      
eb50: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
eb60: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
eb70: 73 65 2c 20 70 50 72 69 6f 72 2c 20 53 52 54 5f  se, pPrior, SRT_
eb80: 55 6e 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c 20  Union, tab1, 0, 
eb90: 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20  0, 0, aff);.    
eba0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
ebb0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
ebc0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
ebd0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
ebe0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
ebf0: 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72  LECT into tempor
ec00: 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22  ary table "tab2"
ec10: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
ec20: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
ec30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
ec40: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62  enEphemeral, tab
ec50: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  2, 0);.      ass
ec60: 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
ec70: 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[1] == -1 );
ec80: 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
ec90: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72  enEphm[1] = addr
eca0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
ecb0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69  r = 0;.      pLi
ecc0: 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
ecd0: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
ece0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66   = 0;.      pOff
ecf0: 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
ed00: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
ed10: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  et = 0;.      rc
ed20: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
ed30: 28 70 50 61 72 73 65 2c 20 70 2c 20 53 52 54 5f  (pParse, p, SRT_
ed40: 55 6e 69 6f 6e 2c 20 74 61 62 32 2c 20 30 2c 20  Union, tab2, 0, 
ed50: 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20  0, 0, aff);.    
ed60: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
ed70: 72 69 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  rior;.      sqli
ed80: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d  te3ExprDelete(p-
ed90: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
eda0: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
edb0: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
edc0: 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
edd0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
ede0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
edf0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
ee00: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
ee10: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
ee20: 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72  o take the inter
ee30: 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  section of the t
ee40: 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  wo temporary.   
ee50: 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20     ** tables..  
ee60: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
ee70: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
ee80: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
ee90: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
eea0: 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63  ){.        Selec
eeb0: 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  t *pFirst = p;. 
eec0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46         while( pF
eed0: 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
eee0: 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
eef0: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
ef00: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
ef10: 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
ef20: 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
ef30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42        }.      iB
ef40: 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
ef50: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
ef60: 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
ef70: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
ef80: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d  el(v);.      com
ef90: 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
efa0: 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
efb0: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
efc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
efd0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31   OP_Rewind, tab1
efe0: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
eff0: 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
f000: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f010: 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 30  _RowKey, tab1, 0
f020: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f030: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f040: 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20  NotFound, tab2, 
f050: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 72 63  iCont);.      rc
f060: 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f   = selectInnerLo
f070: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
f080: 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70  >pEList, tab1, p
f090: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
f0a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
f0c0: 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73  rderBy, -1, eDes
f0d0: 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20  t, iParm, .     
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0f0: 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69          iCont, i
f100: 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Break, 0);.     
f110: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
f120: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
f130: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
f140: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
f150: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
f160: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
f170: 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
f180: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f190: 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61  p(v, OP_Next, ta
f1a0: 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  b1, iStart);.   
f1b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
f1c0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
f1d0: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
f1e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f1f0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c   OP_Close, tab2,
f200: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
f210: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f220: 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30  P_Close, tab1, 0
f230: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
f240: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
f250: 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45  Make sure all SE
f260: 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61  LECTs in the sta
f270: 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20  tement have the 
f280: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65  same number of e
f290: 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20  lements.  ** in 
f2a0: 74 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74  their result set
f2b0: 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
f2c0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
f2d0: 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b  Prior->pEList );
f2e0: 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
f2f0: 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d  ->nExpr!=pPrior-
f300: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
f310: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
f320: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53  orMsg(pParse, "S
f330: 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65  ELECTs to the le
f340: 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20  ft and right of 
f350: 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e  %s".      " do n
f360: 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ot have the same
f370: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
f380: 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65  t columns", sele
f390: 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
f3a0: 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
f3b0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
f3c0: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
f3d0: 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  /* Set the numbe
f3e0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
f3f0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
f400: 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20 70  .  */.  nCol = p
f410: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
f420: 0a 20 20 77 68 69 6c 65 28 20 6e 53 65 74 50 32  .  while( nSetP2
f430: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
f440: 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
f450: 53 65 74 50 32 5b 2d 2d 6e 53 65 74 50 32 5d 2c  SetP2[--nSetP2],
f460: 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f   nCol);.  }..  /
f470: 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74  * Compute collat
f480: 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73  ing sequences us
f490: 65 64 20 62 79 20 65 69 74 68 65 72 20 74 68 65  ed by either the
f4a0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
f4b0: 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61 6e 79 20   or.  ** by any 
f4c0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
f4d0: 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65   needed to imple
f4e0: 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e  ment the compoun
f4f0: 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41  d select..  ** A
f500: 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66  ttach the KeyInf
f510: 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61  o structure to a
f520: 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ll temporary tab
f530: 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65  les.  Invoke the
f540: 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 70  .  ** ORDER BY p
f550: 72 6f 63 65 73 73 69 6e 67 20 69 66 20 74 68 65  rocessing if the
f560: 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
f570: 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  Y clause..  **. 
f580: 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e   ** This section
f590: 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72   is run by the r
f5a0: 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  ight-most SELECT
f5b0: 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e   statement only.
f5c0: 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  .  ** SELECT sta
f5d0: 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c  tements to the l
f5e0: 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20  eft always skip 
f5f0: 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20  this part.  The 
f600: 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20  right-most.  ** 
f610: 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73  SELECT might als
f620: 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  o skip this part
f630: 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52   if it has no OR
f640: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
f650: 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74  d.  ** no temp t
f660: 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72  ables are requir
f670: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
f680: 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e 75 73  OrderBy || p->us
f690: 65 73 45 70 68 6d 20 29 7b 0a 20 20 20 20 69 6e  esEphm ){.    in
f6a0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
f6b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
f6c0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
f6d0: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
f6e0: 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
f6f0: 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
f700: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72  quence for the r
f710: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20  esult set */.   
f720: 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20   Select *pLoop; 
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f740: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
f750: 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61  rough SELECT sta
f760: 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69  tements */.    i
f770: 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20  nt nKeyCol;     
f780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f790: 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
f7a0: 73 20 69 6e 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  s in pKeyInfo->a
f7b0: 43 6f 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f 6c  Col[] */.    Col
f7c0: 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20  lSeq **apColl;  
f7d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
f7e0: 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
f7f0: 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  h pKeyInfo->aCol
f800: 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  l[] */.    CollS
f810: 65 71 20 2a 2a 61 43 6f 70 79 3b 20 20 20 20 20  eq **aCopy;     
f820: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
f830: 70 79 20 6f 66 20 70 4b 65 79 49 6e 66 6f 2d 3e  py of pKeyInfo->
f840: 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 0a 20 20 20 20  aColl[] */..    
f850: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
f860: 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20  tmost==p );.    
f870: 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2b  nKeyCol = nCol +
f880: 20 28 70 4f 72 64 65 72 42 79 20 3f 20 70 4f 72   (pOrderBy ? pOr
f890: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30  derBy->nExpr : 0
f8a0: 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  );.    pKeyInfo 
f8b0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73  = sqliteMalloc(s
f8c0: 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29  izeof(*pKeyInfo)
f8d0: 2b 6e 4b 65 79 43 6f 6c 2a 28 73 69 7a 65 6f 66  +nKeyCol*(sizeof
f8e0: 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 31 29 29  (CollSeq*) + 1))
f8f0: 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49  ;.    if( !pKeyI
f900: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nfo ){.      rc 
f910: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
f920: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
f930: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
f940: 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f   }..    pKeyInfo
f950: 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72  ->enc = ENC(pPar
f960: 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4b 65  se->db);.    pKe
f970: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20  yInfo->nField = 
f980: 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69  nCol;..    for(i
f990: 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49  =0, apColl=pKeyI
f9a0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43  nfo->aColl; i<nC
f9b0: 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  ol; i++, apColl+
f9c0: 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c  +){.      *apCol
f9d0: 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
f9e0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
f9f0: 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
fa00: 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20  0==*apColl ){.  
fa10: 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
fa20: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
fa30: 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
fa40: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c     }..    for(pL
fa50: 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c  oop=p; pLoop; pL
fa60: 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f  oop=pLoop->pPrio
fa70: 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  r){.      for(i=
fa80: 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
fa90: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
faa0: 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
fab0: 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Ephm[i];.       
fac0: 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
fad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b           /* If [
fae0: 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65  0] is unused the
faf0: 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e  n [1] is also un
fb00: 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e  used.  So we can
fb10: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  .          ** al
fb20: 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72  ways safely abor
fb30: 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65  t as soon as the
fb40: 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c   first unused sl
fb50: 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20  ot is found */. 
fb60: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
fb70: 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
fb80: 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20  Ephm[1]<0 );.   
fb90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
fba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
fbb0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
fbc0: 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f  eP2(v, addr, nCo
fbd0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
fbe0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
fbf0: 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29  v, addr, (char*)
fc00: 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  pKeyInfo, P3_KEY
fc10: 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70  INFO);.        p
fc20: 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
fc30: 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[i] = -1;.    
fc40: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
fc50: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
fc60: 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
fc70: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 54 65 72  List_item *pOTer
fc80: 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 3b  m = pOrderBy->a;
fc90: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64 65  .      int nOrde
fca0: 72 42 79 45 78 70 72 20 3d 20 70 4f 72 64 65 72  rByExpr = pOrder
fcb0: 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
fcc0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
fcd0: 20 75 38 20 2a 70 53 6f 72 74 4f 72 64 65 72 3b   u8 *pSortOrder;
fce0: 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 75 73 65  ..      /* Reuse
fcf0: 20 74 68 65 20 73 61 6d 65 20 70 4b 65 79 49 6e   the same pKeyIn
fd00: 66 6f 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52  fo for the ORDER
fd10: 20 42 59 20 61 73 20 77 61 73 20 75 73 65 64 20   BY as was used 
fd20: 61 62 6f 76 65 20 66 6f 72 0a 20 20 20 20 20 20  above for.      
fd30: 2a 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  ** the compound 
fd40: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
fd50: 73 2e 20 20 45 78 63 65 70 74 20 77 65 20 68 61  s.  Except we ha
fd60: 76 65 20 74 6f 20 63 68 61 6e 67 65 20 6f 75 74  ve to change out
fd70: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 4b   the.      ** pK
fd80: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20  eyInfo->aColl[] 
fd90: 76 61 6c 75 65 73 2e 20 20 53 6f 6d 65 20 6f 66  values.  Some of
fda0: 20 74 68 65 20 61 43 6f 6c 6c 5b 5d 20 76 61 6c   the aColl[] val
fdb0: 75 65 73 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ues will be.    
fdc0: 20 20 2a 2a 20 72 65 75 73 65 64 20 77 68 65 6e    ** reused when
fdd0: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68   constructing th
fde0: 65 20 70 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74  e pKeyInfo for t
fdf0: 68 65 20 4f 52 44 45 52 20 42 59 2c 20 73 6f 20  he ORDER BY, so 
fe00: 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 61 20  make.      ** a 
fe10: 63 6f 70 79 2e 20 20 53 75 66 66 69 63 69 65 6e  copy.  Sufficien
fe20: 74 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  t space to hold 
fe30: 62 6f 74 68 20 74 68 65 20 6e 43 6f 6c 20 65 6e  both the nCol en
fe40: 74 72 69 65 73 20 66 6f 72 0a 20 20 20 20 20 20  tries for.      
fe50: 2a 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  ** the compound 
fe60: 73 65 6c 65 63 74 20 61 6e 64 20 74 68 65 20 6e  select and the n
fe70: 4f 72 64 65 72 62 79 45 78 70 72 20 65 6e 74 72  OrderbyExpr entr
fe80: 69 65 73 20 66 6f 72 20 74 68 65 20 4f 52 44 45  ies for the ORDE
fe90: 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 77 61  R BY.      ** wa
fea0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76  s allocated abov
feb0: 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 20  e.  But we need 
fec0: 74 6f 20 6d 6f 76 65 20 74 68 65 20 63 6f 6d 70  to move the comp
fed0: 6f 75 6e 64 20 73 65 6c 65 63 74 0a 20 20 20 20  ound select.    
fee0: 20 20 2a 2a 20 65 6e 74 72 69 65 73 20 6f 75 74    ** entries out
fef0: 20 6f 66 20 74 68 65 20 77 61 79 20 62 65 66 6f   of the way befo
ff00: 72 65 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20  re constructing 
ff10: 74 68 65 20 4f 52 44 45 52 20 42 59 20 65 6e 74  the ORDER BY ent
ff20: 72 69 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4d  ries..      ** M
ff30: 6f 76 65 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  ove the compound
ff40: 20 73 65 6c 65 63 74 20 65 6e 74 72 69 65 73 20   select entries 
ff50: 69 6e 74 6f 20 61 43 6f 70 79 5b 5d 20 77 68 65  into aCopy[] whe
ff60: 72 65 20 74 68 65 79 20 63 61 6e 20 62 65 0a 20  re they can be. 
ff70: 20 20 20 20 20 2a 2a 20 61 63 63 65 73 73 65 64       ** accessed
ff80: 20 61 6e 64 20 72 65 75 73 65 64 20 77 68 65 6e   and reused when
ff90: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68   constructing th
ffa0: 65 20 4f 52 44 45 52 20 42 59 20 65 6e 74 72 69  e ORDER BY entri
ffb0: 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 63  es..      ** Bec
ffc0: 61 75 73 65 20 6e 43 6f 6c 20 6d 69 67 68 74 20  ause nCol might 
ffd0: 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
ffe0: 6f 72 20 6c 65 73 73 20 74 68 61 6e 20 6e 4f 72  or less than nOr
fff0: 64 65 72 42 79 45 78 70 72 0a 20 20 20 20 20 20  derByExpr.      
10000 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 75 73  ** we have to us
10010 65 20 6d 65 6d 6d 6f 76 65 28 29 20 77 68 65 6e  e memmove() when
10020 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 70 79 2e   doing the copy.
10030 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10040 61 43 6f 70 79 20 3d 20 26 70 4b 65 79 49 6e 66  aCopy = &pKeyInf
10050 6f 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42  o->aColl[nOrderB
10060 79 45 78 70 72 5d 3b 0a 20 20 20 20 20 20 70 53  yExpr];.      pS
10070 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b 65 79 49  ortOrder = pKeyI
10080 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
10090 3d 20 28 75 38 2a 29 26 61 43 6f 70 79 5b 6e 43  = (u8*)&aCopy[nC
100a0 6f 6c 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f  ol];.      memmo
100b0 76 65 28 61 43 6f 70 79 2c 20 70 4b 65 79 49 6e  ve(aCopy, pKeyIn
100c0 66 6f 2d 3e 61 43 6f 6c 6c 2c 20 6e 43 6f 6c 2a  fo->aColl, nCol*
100d0 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
100e0 29 3b 0a 0a 20 20 20 20 20 20 61 70 43 6f 6c 6c  );..      apColl
100f0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
10100 6c 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ll;.      for(i=
10110 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 45 78 70  0; i<nOrderByExp
10120 72 3b 20 69 2b 2b 2c 20 70 4f 54 65 72 6d 2b 2b  r; i++, pOTerm++
10130 2c 20 61 70 43 6f 6c 6c 2b 2b 2c 20 70 53 6f 72  , apColl++, pSor
10140 74 4f 72 64 65 72 2b 2b 29 7b 0a 20 20 20 20 20  tOrder++){.     
10150 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
10160 20 70 4f 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a   pOTerm->pExpr;.
10170 20 20 20 20 20 20 20 20 69 66 28 20 28 70 45 78          if( (pEx
10180 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  pr->flags & EP_E
10190 78 70 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20  xpCollate) ){.  
101a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
101b0 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 21 3d 30 20  pExpr->pColl!=0 
101c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 61 70  );.          *ap
101d0 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43  Coll = pExpr->pC
101e0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  oll;.        }el
101f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 61  se{.          *a
10200 70 43 6f 6c 6c 20 3d 20 61 43 6f 70 79 5b 70 45  pColl = aCopy[pE
10210 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a 20  xpr->iColumn];. 
10220 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10230 20 2a 70 53 6f 72 74 4f 72 64 65 72 20 3d 20 70   *pSortOrder = p
10240 4f 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  OTerm->sortOrder
10250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10260 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
10270 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20  tmost==p );.    
10280 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
10290 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 3e 3d 30 20  rOpenEphm[2]>=0 
102a0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
102b0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
102c0 32 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2];.      sqlite
102d0 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
102e0 20 61 64 64 72 2c 20 70 2d 3e 70 45 4c 69 73 74   addr, p->pEList
102f0 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a 20 20 20 20  ->nExpr+2);.    
10300 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65    pKeyInfo->nFie
10310 6c 64 20 3d 20 6e 4f 72 64 65 72 42 79 45 78 70  ld = nOrderByExp
10320 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
10330 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
10340 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65  addr, (char*)pKe
10350 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46  yInfo, P3_KEYINF
10360 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
10370 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a    pKeyInfo = 0;.
10380 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f        generateSo
10390 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70  rtTail(pParse, p
103a0 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  , v, p->pEList->
103b0 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50  nExpr, eDest, iP
103c0 61 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  arm);.    }..   
103d0 20 73 71 6c 69 74 65 46 72 65 65 28 70 4b 65 79   sqliteFree(pKey
103e0 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74  Info);.  }..mult
103f0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  i_select_end:.  
10400 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
10410 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
10420 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
10430 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CT */..#ifndef S
10440 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
10450 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75  /*.** Scan throu
10460 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  gh the expressio
10470 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63  n pExpr.  Replac
10480 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63  e every referenc
10490 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e  e to.** a column
104a0 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72   in table number
104b0 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63   iTable with a c
104c0 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75  opy of the iColu
104d0 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69  mn-th.** entry i
104e0 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20  n pEList.  (But 
104f0 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73  leave references
10500 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f   to the ROWID co
10510 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67  lumn .** unchang
10520 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ed.).**.** This 
10530 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20  routine is part 
10540 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e  of the flattenin
10550 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20  g procedure.  A 
10560 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73  subquery.** whos
10570 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20  e result set is 
10580 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73  defined by pELis
10590 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74  t appears as ent
105a0 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f  ry in the.** FRO
105b0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
105c0 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74  LECT such that t
105d0 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61  he VDBE cursor a
105e0 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a  ssigned to that.
105f0 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65  ** FORM clause e
10600 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20  ntry is iTable. 
10610 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
10620 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ke the necessary
10630 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
10640 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74  pExpr so that it
10650 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
10660 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74   to the source t
10670 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73  able.** of the s
10680 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74  ubquery rather t
10690 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
106a0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a   the subquery..*
106b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
106c0 62 73 74 45 78 70 72 4c 69 73 74 28 45 78 70 72  bstExprList(Expr
106d0 4c 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72 4c 69  List*,int,ExprLi
106e0 73 74 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72  st*);  /* Forwar
106f0 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69 63  d Decl */.static
10700 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
10710 74 28 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c  t(Select *, int,
10720 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 20 20 2f   ExprList *);  /
10730 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20 2a  * Forward Decl *
10740 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
10750 62 73 74 45 78 70 72 28 45 78 70 72 20 2a 70 45  bstExpr(Expr *pE
10760 78 70 72 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c  xpr, int iTable,
10770 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
10780 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  t){.  if( pExpr=
10790 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
107a0 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
107b0 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72  _COLUMN && pExpr
107c0 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
107d0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70   ){.    if( pExp
107e0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
107f0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
10800 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d  = TK_NULL;.    }
10810 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
10820 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73   *pNew;.      as
10830 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
10840 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
10850 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  n<pEList->nExpr 
10860 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10870 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
10880 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
10890 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
108a0 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  List==0 );.     
108b0 20 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e   pNew = pEList->
108c0 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  a[pExpr->iColumn
108d0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ].pExpr;.      a
108e0 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20 29  ssert( pNew!=0 )
108f0 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  ;.      pExpr->o
10900 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20  p = pNew->op;.  
10910 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
10920 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20  r->pLeft==0 );. 
10930 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66       pExpr->pLef
10940 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
10950 75 70 28 70 4e 65 77 2d 3e 70 4c 65 66 74 29 3b  up(pNew->pLeft);
10960 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10970 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
10980 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
10990 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
109a0 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 52  ExprDup(pNew->pR
109b0 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73 73  ight);.      ass
109c0 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73  ert( pExpr->pLis
109d0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45  t==0 );.      pE
109e0 78 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c  xpr->pList = sql
109f0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
10a00 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  pNew->pList);.  
10a10 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
10a20 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65  e = pNew->iTable
10a30 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
10a40 54 61 62 20 3d 20 70 4e 65 77 2d 3e 70 54 61 62  Tab = pNew->pTab
10a50 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
10a60 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69  Column = pNew->i
10a70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 45  Column;.      pE
10a80 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77  xpr->iAgg = pNew
10a90 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73 71  ->iAgg;.      sq
10aa0 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26  lite3TokenCopy(&
10ab0 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70  pExpr->token, &p
10ac0 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  New->token);.   
10ad0 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43     sqlite3TokenC
10ae0 6f 70 79 28 26 70 45 78 70 72 2d 3e 73 70 61 6e  opy(&pExpr->span
10af0 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a  , &pNew->span);.
10b00 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 53 65        pExpr->pSe
10b10 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
10b20 6c 65 63 74 44 75 70 28 70 4e 65 77 2d 3e 70 53  lectDup(pNew->pS
10b30 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 70 45  elect);.      pE
10b40 78 70 72 2d 3e 66 6c 61 67 73 20 3d 20 70 4e 65  xpr->flags = pNe
10b50 77 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  w->flags;.    }.
10b60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62    }else{.    sub
10b70 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 4c  stExpr(pExpr->pL
10b80 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  eft, iTable, pEL
10b90 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
10ba0 78 70 72 28 70 45 78 70 72 2d 3e 70 52 69 67 68  xpr(pExpr->pRigh
10bb0 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
10bc0 74 29 3b 0a 20 20 20 20 73 75 62 73 74 53 65 6c  t);.    substSel
10bd0 65 63 74 28 70 45 78 70 72 2d 3e 70 53 65 6c 65  ect(pExpr->pSele
10be0 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ct, iTable, pELi
10bf0 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
10c00 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c  prList(pExpr->pL
10c10 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
10c20 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  ist);.  }.}.stat
10c30 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
10c40 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
10c50 70 4c 69 73 74 2c 20 69 6e 74 20 69 54 61 62 6c  pList, int iTabl
10c60 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  e, ExprList *pEL
10c70 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
10c80 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
10c90 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
10ca0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
10cb0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62  r; i++){.    sub
10cc0 73 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b  stExpr(pList->a[
10cd0 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
10ce0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  , pEList);.  }.}
10cf0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
10d00 73 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20  stSelect(Select 
10d10 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  *p, int iTable, 
10d20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
10d30 29 7b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  ){.  if( !p ) re
10d40 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70  turn;.  substExp
10d50 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
10d60 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
10d70 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
10d80 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  t(p->pGroupBy, i
10d90 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
10da0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
10db0 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61  p->pOrderBy, iTa
10dc0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
10dd0 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61  substExpr(p->pHa
10de0 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70 45  ving, iTable, pE
10df0 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78  List);.  substEx
10e00 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 69 54  pr(p->pWhere, iT
10e10 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 7d  able, pEList);.}
10e20 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
10e30 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
10e40 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 6e 64 65  VIEW) */..#ifnde
10e50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10e60 45 57 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  EW./*.** This ro
10e70 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
10e80 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65  o flatten subque
10e90 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  ries in order to
10ea0 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74   speed.** execut
10eb0 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73  ion.  It returns
10ec0 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63   1 if it makes c
10ed0 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20  hanges and 0 if 
10ee0 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a  no flattening.**
10ef0 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
10f00 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65  o understand the
10f10 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74   concept of flat
10f20 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72  tening, consider
10f30 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
10f40 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  * query:.**.**  
10f50 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
10f60 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20   (SELECT x+y AS 
10f70 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
10f80 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35  z<100) WHERE a>5
10f90 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
10fa0 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d  lt way of implem
10fb0 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72  enting this quer
10fc0 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20  y is to execute 
10fd0 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  the.** subquery 
10fe0 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20  first and store 
10ff0 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  the results in a
11000 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
11010 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68  , then.** run th
11020 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e  e outer query on
11030 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
11040 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71  table.  This req
11050 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73  uires two.** pas
11060 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74  ses over the dat
11070 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  a.  Furthermore,
11080 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d   because the tem
11090 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20  porary table.** 
110a0 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20  has no indices, 
110b0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
110c0 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   on the outer qu
110d0 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ery cannot be.**
110e0 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a   optimized..**.*
110f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
11100 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69  ttempts to rewri
11110 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20  te queries such 
11120 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74  as the above int
11130 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c  o.** a single fl
11140 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20  at select, like 
11150 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
11160 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
11170 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
11180 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a  100 AND a>5.**.*
11190 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
111a0 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69  ated for this si
111b0 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65  mpification give
111c0 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  s the same resul
111d0 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61  t.** but only ha
111e0 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61  s to scan the da
111f0 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65  ta once.  And be
11200 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69  cause indices mi
11210 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e  ght .** exist on
11220 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61   the table t1, a
11230 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f   complete scan o
11240 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74  f the data might
11250 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a   be.** avoided..
11260 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67  **.** Flattening
11270 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74   is only attempt
11280 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ed if all of the
11290 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
112a0 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  rue:.**.**   (1)
112b0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
112c0 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
112d0 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
112e0 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  se aggregates..*
112f0 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20  *.**   (2)  The 
11300 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
11310 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
11320 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
11330 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
11340 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20  *.**   (3)  The 
11350 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
11360 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
11370 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65  d of a left oute
11380 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20  r join, or.**   
11390 20 20 20 20 20 74 68 65 20 73 75 62 71 75 65 72       the subquer
113a0 79 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20  y is not itself 
113b0 61 20 6a 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74  a join.  (Ticket
113c0 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28   #306).**.**   (
113d0 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
113e0 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54   is not DISTINCT
113f0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
11400 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
11410 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20  n..**.**   (5)  
11420 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
11430 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20  not DISTINCT or 
11440 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
11450 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  does not use.** 
11460 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65         aggregate
11470 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20  s..**.**   (6)  
11480 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
11490 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
114a0 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
114b0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a  r query is not.*
114c0 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
114d0 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20  T..**.**   (7)  
114e0 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  The subquery has
114f0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a   a FROM clause..
11500 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65  **.**   (8)  The
11510 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
11520 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
11530 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
11540 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
11550 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20  *.**   (9)  The 
11560 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
11570 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
11580 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
11590 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  oes not use.**  
115a0 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73        aggregates
115b0 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54  ..**.**  (10)  T
115c0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
115d0 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
115e0 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
115f0 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a   query does not.
11600 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c 49  **        use LI
11610 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29  MIT..**.**  (11)
11620 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
11630 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
11640 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68  ry do not both h
11650 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  ave ORDER BY cla
11660 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32  uses..**.**  (12
11670 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
11680 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
11690 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20   term of a LEFT 
116a0 4f 55 54 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68  OUTER JOIN or th
116b0 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71  e.**        subq
116c0 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52  uery has no WHER
116d0 45 20 63 6c 61 75 73 65 2e 20 20 28 61 64 64 65  E clause.  (adde
116e0 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35 30  d by ticket #350
116f0 29 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54  ).**.**  (13)  T
11700 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
11710 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
11720 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49  ot both use LIMI
11730 54 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54  T.**.**  (14)  T
11740 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
11750 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54 0a   not use OFFSET.
11760 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f  **.** In this ro
11770 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70  utine, the "p" p
11780 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
11790 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74  inter to the out
117a0 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65  er query..** The
117b0 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e   subquery is p->
117c0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20  pSrc->a[iFrom]. 
117d0 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69   isAgg is true i
117e0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
117f0 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67  y.** uses aggreg
11800 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65 72  ates and subquer
11810 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20 69  yIsAgg is true i
11820 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
11830 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a  ses aggregates..
11840 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  **.** If flatten
11850 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  ing is not attem
11860 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  pted, this routi
11870 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e  ne is a no-op an
11880 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20  d returns 0..** 
11890 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
118a0 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73 20   attempted this 
118b0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
118c0 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20  1..**.** All of 
118d0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
118e0 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63  nalysis must occ
118f0 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f  ur on both the o
11900 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a  uter query and.*
11910 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20 62  * the subquery b
11920 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
11930 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74  ne runs..*/.stat
11940 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75  ic int flattenSu
11950 62 71 75 65 72 79 28 0a 20 20 53 65 6c 65 63 74  bquery(.  Select
11960 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *p,           /
11970 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20  * The parent or 
11980 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61  outer SELECT sta
11990 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
119a0 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  iFrom,          
119b0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e   /* Index in p->
119c0 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65  pSrc->a[] of the
119d0 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20   inner subquery 
119e0 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20  */.  int isAgg, 
119f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
11a00 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43  e if outer SELEC
11a10 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  T uses aggregate
11a20 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
11a30 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67  int subqueryIsAg
11a40 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  g    /* True if 
11a50 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
11a60 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
11a70 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65  tions */.){.  Se
11a80 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20  lect *pSub;     
11a90 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71    /* The inner q
11aa0 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72  uery or "subquer
11ab0 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  y" */.  SrcList 
11ac0 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54  *pSrc;      /* T
11ad0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
11ae0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
11af0 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
11b00 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68  pSubSrc;   /* Th
11b10 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
11b20 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
11b30 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
11b40 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65  st;    /* The re
11b50 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
11b60 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
11b70 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20   int iParent;   
11b80 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72       /* VDBE cur
11b90 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
11ba0 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65  e pSub result se
11bb0 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a  t temp table */.
11bc0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
11bd0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
11be0 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20  unter */.  Expr 
11bf0 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
11c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11c10 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
11c20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
11c30 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74  ist_item *pSubit
11c40 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62  em;   /* The sub
11c50 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 43  query */..  /* C
11c60 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66  heck to see if f
11c70 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
11c80 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20  mitted.  Return 
11c90 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20  0 if not..  */. 
11ca0 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
11cb0 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70  rn 0;.  pSrc = p
11cc0 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
11cd0 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e  ( pSrc && iFrom>
11ce0 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63  =0 && iFrom<pSrc
11cf0 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62  ->nSrc );.  pSub
11d00 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  item = &pSrc->a[
11d10 69 46 72 6f 6d 5d 3b 0a 20 20 70 53 75 62 20 3d  iFrom];.  pSub =
11d20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
11d30 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ct;.  assert( pS
11d40 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  ub!=0 );.  if( i
11d50 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79  sAgg && subquery
11d60 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  IsAgg ) return 0
11d70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11d80 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
11d90 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73   (1)  */.  if( s
11da0 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20  ubqueryIsAgg && 
11db0 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72  pSrc->nSrc>1 ) r
11dc0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
11dd0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
11de0 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53   (2)  */.  pSubS
11df0 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
11e00 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53  .  assert( pSubS
11e10 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72  rc );.  /* Prior
11e20 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e   to version 3.1.
11e30 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e  2, when LIMIT an
11e40 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20  d OFFSET had to 
11e50 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61  be simple consta
11e60 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72  nts,.  ** not ar
11e70 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 73  bitrary expresss
11e80 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64  ions, we allowed
11e90 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20   some combining 
11ea0 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  of LIMIT and OFF
11eb0 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65  SET.  ** because
11ec0 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63   they could be c
11ed0 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69  omputed at compi
11ee0 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68  le-time.  But wh
11ef0 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
11f00 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20  SET.  ** became 
11f10 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
11f20 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66  sions, we were f
11f30 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73  orced to add res
11f40 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20  trictions (13). 
11f50 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f   ** and (14). */
11f60 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
11f70 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74  mit && p->pLimit
11f80 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
11f90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
11fa0 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f  triction (13) */
11fb0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66  .  if( pSub->pOf
11fc0 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b  fset ) return 0;
11fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
11ff0 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f  triction (14) */
12000 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
12010 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  nSrc==0 ) return
12020 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
12040 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f  triction (7)  */
12050 0a 20 20 69 66 28 20 28 70 53 75 62 2d 3e 69 73  .  if( (pSub->is
12060 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62  Distinct || pSub
12070 2d 3e 70 4c 69 6d 69 74 29 20 0a 20 20 20 20 20  ->pLimit) .     
12080 20 20 20 20 26 26 20 28 70 53 72 63 2d 3e 6e 53      && (pSrc->nS
12090 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
120a0 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  {          /* Re
120b0 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29 28 35  strictions (4)(5
120c0 29 28 38 29 28 39 29 20 2a 2f 0a 20 20 20 20 20  )(8)(9) */.     
120d0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
120e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 69 73  .  }.  if( p->is
120f0 44 69 73 74 69 6e 63 74 20 26 26 20 73 75 62 71  Distinct && subq
12100 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75  ueryIsAgg ) retu
12110 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
12120 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29   Restriction (6)
12130 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 64    */.  if( (p->d
12140 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20 7c  isallowOrderBy |
12150 7c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 20 26  | p->pOrderBy) &
12160 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
12170 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
12180 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
121b0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29  Restriction (11)
121c0 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   */.  }..  /* Re
121d0 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66  striction 3:  If
121e0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
121f0 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75   a join, make su
12200 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
12210 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65  is .  ** not use
12220 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20 6f  d as the right o
12230 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74  perand of an out
12240 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c  er join.  Exampl
12250 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  es of why this. 
12260 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77   ** is not allow
12270 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
12280 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
12290 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49  TER JOIN (t2 JOI
122a0 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  N t3).  **.  ** 
122b0 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
122c0 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
122d0 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
122e0 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
122f0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
12300 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a  JOIN t3.  **.  *
12310 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61  * which is not a
12320 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74  t all the same t
12330 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  hing..  */.  if(
12340 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31   pSubSrc->nSrc>1
12350 20 26 26 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a   && (pSubitem->j
12360 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
12370 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
12380 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
12390 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32  * Restriction 12
123a0 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
123b0 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
123c0 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
123d0 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69  t outer.  ** joi
123e0 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
123f0 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
12400 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
12410 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20   ** An examples 
12420 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
12430 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
12440 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
12450 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
12460 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
12470 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29  t2 WHERE t2.x>0)
12480 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
12490 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
124a0 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
124b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
124c0 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
124d0 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45  R JOIN t2) WHERE
124e0 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a   t2.x>0.  **.  *
124f0 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30  * But the t2.x>0
12500 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79   test will alway
12510 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c  s fail on a NULL
12520 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63   row of t2, whic
12530 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  h.  ** effective
12540 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20  ly converts the 
12550 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20  OUTER JOIN into 
12560 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20  an INNER JOIN.. 
12570 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69   */.  if( (pSubi
12580 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
12590 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 26 26 20  JT_OUTER)!=0 && 
125a0 70 53 75 62 2d 3e 70 57 68 65 72 65 21 3d 30 20  pSub->pWhere!=0 
125b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
125c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
125d0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
125e0 74 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c 61 74  t, it means flat
125f0 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
12600 74 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ted for the.  **
12610 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20   iFrom-th entry 
12620 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
12630 73 65 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  se in the outer 
12640 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  query..  */..  /
12650 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68  * Move all of th
12660 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20  e FROM elements 
12670 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
12680 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68  into the.  ** th
12690 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
126a0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
126b0 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  .  Before doing 
126c0 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20  this, remember. 
126d0 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e   ** the cursor n
126e0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72  umber for the or
126f0 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65  iginal outer que
12700 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20  ry FROM element 
12710 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e  in.  ** iParent.
12720 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75    The iParent cu
12730 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20  rsor will never 
12740 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71  be used.  Subseq
12750 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77  uent code.  ** w
12760 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73  ill scan express
12770 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ions looking for
12780 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e   iParent referen
12790 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a  ces and replace.
127a0 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72    ** those refer
127b0 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65  ences with expre
127c0 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f  ssions that reso
127d0 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75  lve to the subqu
127e0 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c  ery FROM.  ** el
127f0 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f  ements we are no
12800 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20  w copying in..  
12810 2a 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70  */.  iParent = p
12820 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72  Subitem->iCursor
12830 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53  ;.  {.    int nS
12840 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d  ubSrc = pSubSrc-
12850 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a  >nSrc;.    int j
12860 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74  ointype = pSubit
12870 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 0a 20  em->jointype;.. 
12880 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
12890 54 61 62 6c 65 28 70 53 75 62 69 74 65 6d 2d 3e  Table(pSubitem->
128a0 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
128b0 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e  eFree(pSubitem->
128c0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
128d0 73 71 6c 69 74 65 46 72 65 65 28 70 53 75 62 69  sqliteFree(pSubi
128e0 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
128f0 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 75 62   sqliteFree(pSub
12900 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  item->zAlias);. 
12910 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
12920 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78   ){.      int ex
12930 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d 20  tra = nSubSrc - 
12940 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  1;.      for(i=1
12950 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
12960 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 20  ){.        pSrc 
12970 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
12980 41 70 70 65 6e 64 28 70 53 72 63 2c 20 30 2c 20  Append(pSrc, 0, 
12990 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
129a0 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63    p->pSrc = pSrc
129b0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53  ;.      for(i=pS
129c0 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65 78  rc->nSrc-1; i-ex
129d0 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29  tra>=iFrom; i--)
129e0 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e  {.        pSrc->
129f0 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69  a[i] = pSrc->a[i
12a00 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20 20 7d  -extra];.      }
12a10 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
12a20 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69  =0; i<nSubSrc; i
12a30 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d  ++){.      pSrc-
12a40 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53  >a[i+iFrom] = pS
12a50 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  ubSrc->a[i];.   
12a60 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53     memset(&pSubS
12a70 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a  rc->a[i], 0, siz
12a80 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69  eof(pSubSrc->a[i
12a90 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ]));.    }.    p
12aa0 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f  Src->a[iFrom].jo
12ab0 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70  intype = jointyp
12ac0 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  e;.  }..  /* Now
12ad0 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74   begin substitut
12ae0 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73  ing subquery res
12af0 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
12b00 6f 6e 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72 65  ons for .  ** re
12b10 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
12b20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
12b30 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2a  uter query..  **
12b40 20 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a   .  ** Example:.
12b50 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c 45    **.  **   SELE
12b60 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f  CT a+5, b*10 FRO
12b70 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53  M (SELECT x*3 AS
12b80 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52   a, y+10 AS b FR
12b90 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62  OM t1) WHERE a>b
12ba0 3b 0a 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20  ;.  **   \      
12bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
12bc0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
12bd0 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
12be0 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
12bf0 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  **    \_________
12c00 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74  ____________ out
12c10 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  er query _______
12c20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
12c30 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20 20  _______/.  **.  
12c40 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
12c50 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
12c60 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
12c70 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
12c80 65 20 77 65 20 73 65 65 0a 20 20 2a 2a 20 22 61  e we see.  ** "a
12c90 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
12ca0 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20  "x*3" and every 
12cb0 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22  place we see "b"
12cc0 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
12cd0 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 70 4c  y+10"..  */.  pL
12ce0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
12cf0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
12d00 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
12d10 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
12d20 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  r;.    if( pList
12d30 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20  ->a[i].zName==0 
12d40 26 26 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73  && (pExpr = pLis
12d50 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e  t->a[i].pExpr)->
12d60 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  span.z!=0 ){.   
12d70 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a     pList->a[i].z
12d80 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
12d90 4e 44 75 70 28 28 63 68 61 72 2a 29 70 45 78 70  NDup((char*)pExp
12da0 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72  r->span.z, pExpr
12db0 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d  ->span.n);.    }
12dc0 0a 20 20 7d 0a 20 20 73 75 62 73 74 45 78 70 72  .  }.  substExpr
12dd0 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
12de0 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
12df0 45 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 69 73  EList);.  if( is
12e00 41 67 67 20 29 7b 0a 20 20 20 20 73 75 62 73 74  Agg ){.    subst
12e10 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
12e20 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70  upBy, iParent, p
12e30 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
12e40 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
12e50 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
12e60 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
12e70 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e    }.  if( pSub->
12e80 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
12e90 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
12ea0 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  rBy==0 );.    p-
12eb0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62  >pOrderBy = pSub
12ec0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
12ed0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pSub->pOrderBy =
12ee0 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
12ef0 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
12f00 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
12f10 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50  (p->pOrderBy, iP
12f20 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
12f30 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ist);.  }.  if( 
12f40 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a  pSub->pWhere ){.
12f50 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c      pWhere = sql
12f60 69 74 65 33 45 78 70 72 44 75 70 28 70 53 75 62  ite3ExprDup(pSub
12f70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 7d 65 6c  ->pWhere);.  }el
12f80 73 65 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  se{.    pWhere =
12f90 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 75   0;.  }.  if( su
12fa0 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20  bqueryIsAgg ){. 
12fb0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48     assert( p->pH
12fc0 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20  aving==0 );.    
12fd0 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  p->pHaving = p->
12fe0 70 57 68 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70  pWhere;.    p->p
12ff0 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
13000 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 2d      substExpr(p-
13010 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e  >pHaving, iParen
13020 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
13030 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67  ;.    p->pHaving
13040 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
13050 64 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 73 71  d(p->pHaving, sq
13060 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 53 75  lite3ExprDup(pSu
13070 62 2d 3e 70 48 61 76 69 6e 67 29 29 3b 0a 20 20  b->pHaving));.  
13080 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
13090 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  oupBy==0 );.    
130a0 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
130b0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
130c0 28 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29  (pSub->pGroupBy)
130d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
130e0 75 62 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65  ubstExpr(p->pWhe
130f0 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  re, iParent, pSu
13100 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
13110 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
13120 74 65 33 45 78 70 72 41 6e 64 28 70 2d 3e 70 57  te3ExprAnd(p->pW
13130 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20  here, pWhere);. 
13140 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c 61   }..  /* The fla
13150 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20  ttened query is 
13160 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68  distinct if eith
13170 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20  er the inner or 
13180 74 68 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20 71  the.  ** outer q
13190 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
131a0 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44  . .  */.  p->isD
131b0 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
131c0 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d  istinct || pSub-
131d0 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20  >isDistinct;..  
131e0 2f 2a 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e  /*.  ** SELECT .
131f0 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  .. FROM (SELECT 
13200 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53  ... LIMIT a OFFS
13210 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46  ET b) LIMIT x OF
13220 46 53 45 54 20 79 3b 0a 20 20 2a 2a 0a 20 20 2a  FSET y;.  **.  *
13230 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64  * One is tempted
13240 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61   to try to add a
13250 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e   and b to combin
13260 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42  e the limits.  B
13270 75 74 20 74 68 69 73 0a 20 20 2a 2a 20 64 6f 65  ut this.  ** doe
13280 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69  s not work if ei
13290 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65  ther limit is ne
132a0 67 61 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 69  gative..  */.  i
132b0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
132c0 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  ){.    p->pLimit
132d0 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b   = pSub->pLimit;
132e0 0a 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69  .    pSub->pLimi
132f0 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t = 0;.  }..  /*
13300 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74   Finially, delet
13310 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f  e what is left o
13320 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61  f the subquery a
13330 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73  nd return.  ** s
13340 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  uccess..  */.  s
13350 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
13360 74 65 28 70 53 75 62 29 3b 0a 20 20 72 65 74 75  te(pSub);.  retu
13370 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
13380 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
13390 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61  EW */../*.** Ana
133a0 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20  lyze the SELECT 
133b0 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
133c0 20 69 6e 20 61 73 20 61 6e 20 61 72 67 75 6d 65   in as an argume
133d0 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a  nt to see if it.
133e0 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d  ** is a simple m
133f0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
13400 65 72 79 2e 20 20 49 66 20 69 74 20 69 73 20 61  ery.  If it is a
13410 6e 64 20 74 68 69 73 20 71 75 65 72 79 20 63 61  nd this query ca
13420 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73 66 69 65  n be.** satisfie
13430 64 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65  d using a single
13440 20 73 65 65 6b 20 74 6f 20 74 68 65 20 62 65 67   seek to the beg
13450 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66  inning or end of
13460 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68   an index,.** th
13470 65 6e 20 67 65 6e 65 72 61 74 65 20 74 68 65 20  en generate the 
13480 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 53 45  code for this SE
13490 4c 45 43 54 20 61 6e 64 20 72 65 74 75 72 6e 20  LECT and return 
134a0 31 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 6e  1.  If this is n
134b0 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20  ot a .** simple 
134c0 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
134d0 75 65 72 79 2c 20 74 68 65 6e 20 72 65 74 75 72  uery, then retur
134e0 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d  n 0;.**.** A sim
134f0 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ply min() or max
13500 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c  () query looks l
13510 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
13520 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 61 29     SELECT min(a)
13530 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20   FROM table;.** 
13540 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 61 29     SELECT max(a)
13550 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a   FROM table;.**.
13560 2a 2a 20 54 68 65 20 71 75 65 72 79 20 6d 61 79  ** The query may
13570 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e   have only a sin
13580 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 69 74 73  gle table in its
13590 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20   FROM argument. 
135a0 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65   There.** can be
135b0 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f 72 20   no GROUP BY or 
135c0 48 41 56 49 4e 47 20 6f 72 20 57 48 45 52 45 20  HAVING or WHERE 
135d0 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 72 65  clauses.  The re
135e0 73 75 6c 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a  sult set must.**
135f0 20 62 65 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   be the min() or
13600 20 6d 61 78 28 29 20 6f 66 20 61 20 73 69 6e 67   max() of a sing
13610 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  le column of the
13620 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c   table.  The col
13630 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69  umn.** in the mi
13640 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e  n() or max() fun
13650 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e  ction must be in
13660 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dexed..**.** The
13670 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74   parameters to t
13680 68 69 73 20 72 6f 75 74 69 6e 65 20 61 72 65 20  his routine are 
13690 74 68 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20  the same as for 
136a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2e  sqlite3Select().
136b0 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61 64  .** See the head
136c0 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  er comment on th
136d0 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  at routine for a
136e0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
136f0 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
13700 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61   int simpleMinMa
13710 78 51 75 65 72 79 28 50 61 72 73 65 20 2a 70 50  xQuery(Parse *pP
13720 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
13730 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20   int eDest, int 
13740 69 50 61 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a  iParm){.  Expr *
13750 70 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f  pExpr;.  int iCo
13760 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  l;.  Table *pTab
13770 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
13780 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 56  .  int base;.  V
13790 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65  dbe *v;.  int se
137a0 65 6b 4f 70 3b 0a 20 20 45 78 70 72 4c 69 73 74  ekOp;.  ExprList
137b0 20 2a 70 45 4c 69 73 74 2c 20 2a 70 4c 69 73 74   *pEList, *pList
137c0 2c 20 65 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  , eList;.  struc
137d0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
137e0 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 53 72 63  eListItem;.  Src
137f0 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 69 6e  List *pSrc;.  in
13800 74 20 62 72 6b 3b 0a 20 20 69 6e 74 20 69 44 62  t brk;.  int iDb
13810 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
13820 20 73 65 65 20 69 66 20 74 68 69 73 20 71 75 65   see if this que
13830 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d  ry is a simple m
13840 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
13850 65 72 79 2e 20 20 52 65 74 75 72 6e 0a 20 20 2a  ery.  Return.  *
13860 2a 20 7a 65 72 6f 20 69 66 20 69 74 20 69 73 20  * zero if it is 
13870 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   not..  */.  if(
13880 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20   p->pGroupBy || 
13890 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c 20 70 2d  p->pHaving || p-
138a0 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
138b0 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
138c0 70 53 72 63 3b 0a 20 20 69 66 28 20 70 53 72 63  pSrc;.  if( pSrc
138d0 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
138e0 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d  rn 0;.  pEList =
138f0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
13900 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ( pEList->nExpr!
13910 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
13920 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   pExpr = pEList-
13930 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
13940 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
13950 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
13960 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4c 69 73  return 0;.  pLis
13970 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
13980 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
13990 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72   || pList->nExpr
139a0 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
139b0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
139c0 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75 72 6e  en.n!=3 ) return
139d0 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
139e0 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a  3StrNICmp((char*
139f0 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
13a00 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20  "min",3)==0 ){. 
13a10 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52     seekOp = OP_R
13a20 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69  ewind;.  }else i
13a30 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
13a40 6d 70 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d  mp((char*)pExpr-
13a50 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33  >token.z,"max",3
13a60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b  )==0 ){.    seek
13a70 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20 20  Op = OP_Last;.  
13a80 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
13a90 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72  n 0;.  }.  pExpr
13aa0 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70   = pList->a[0].p
13ab0 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70  Expr;.  if( pExp
13ac0 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
13ad0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
13ae0 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Col = pExpr->iCo
13af0 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20 3d 20 70  lumn;.  pTab = p
13b00 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
13b10 0a 20 20 2f 2a 20 54 68 69 73 20 6f 70 74 69 6d  .  /* This optim
13b20 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ization cannot b
13b30 65 20 75 73 65 64 20 77 69 74 68 20 76 69 72 74  e used with virt
13b40 75 61 6c 20 74 61 62 6c 65 73 2e 20 2a 2f 0a 20  ual tables. */. 
13b50 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
13b60 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
13b70 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
13b80 20 74 6f 20 68 65 72 65 2c 20 69 74 20 6d 65 61   to here, it mea
13b90 6e 73 20 74 68 65 20 71 75 65 72 79 20 69 73 20  ns the query is 
13ba0 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74 20 66  of the correct f
13bb0 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65 63 6b 20  orm..  ** Check 
13bc0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20  to make sure we 
13bd0 68 61 76 65 20 61 6e 20 69 6e 64 65 78 20 61 6e  have an index an
13be0 64 20 6d 61 6b 65 20 70 49 64 78 20 70 6f 69 6e  d make pIdx poin
13bf0 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 61 70  t to the.  ** ap
13c00 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78 2e  propriate index.
13c10 20 20 49 66 20 74 68 65 20 6d 69 6e 28 29 20 6f    If the min() o
13c20 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 61 6e  r max() is on an
13c30 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
13c40 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e  .  ** key column
13c50 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 6e 65  , no index is ne
13c60 63 65 73 73 61 72 79 20 73 6f 20 73 65 74 20 70  cessary so set p
13c70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66  Idx to NULL.  If
13c80 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62 6c 65 20   no.  ** usable 
13c90 69 6e 64 65 78 20 69 73 20 66 6f 75 6e 64 2c 20  index is found, 
13ca0 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20  return 0..  */. 
13cb0 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
13cc0 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d     pIdx = 0;.  }
13cd0 65 6c 73 65 7b 0a 20 20 20 20 43 6f 6c 6c 53 65  else{.    CollSe
13ce0 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
13cf0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
13d00 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
13d10 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29    if( pColl==0 )
13d20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66   return 0;.    f
13d30 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
13d40 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
13d50 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
13d60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
13d70 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b  x->nColumn>=1 );
13d80 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
13d90 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43  >aiColumn[0]==iC
13da0 6f 6c 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  ol && .         
13db0 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
13dc0 6d 70 28 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  mp(pIdx->azColl[
13dd0 30 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  0], pColl->zName
13de0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  ) ){.        bre
13df0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
13e00 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d  }.    if( pIdx==
13e10 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
13e20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79  }..  /* Identify
13e30 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69 66   column types if
13e40 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
13e50 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20  g the callback. 
13e60 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20   This.  ** step 
13e70 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
13e80 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e  e output is goin
13e90 67 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 72 20  g to a table or 
13ea0 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20  a memory cell.. 
13eb0 20 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e   ** The column n
13ec0 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ames have alread
13ed0 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64  y been generated
13ee0 20 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   in the calling 
13ef0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  function..  */. 
13f00 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
13f10 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
13f20 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
13f30 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   0;..  /* If the
13f40 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
13f50 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
13f60 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
13f70 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
13f80 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
13f90 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
13fa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13fb0 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  Op(v, OP_OpenEph
13fc0 65 6d 65 72 61 6c 2c 20 69 50 61 72 6d 2c 20 31  emeral, iParm, 1
13fd0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
13fe0 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74 6f 20  erating code to 
13ff0 66 69 6e 64 20 74 68 65 20 6d 69 6e 20 6f 72 20  find the min or 
14000 74 68 65 20 6d 61 78 2e 20 20 42 61 73 69 63 61  the max.  Basica
14010 6c 6c 79 20 61 6c 6c 20 77 65 20 68 61 76 65 0a  lly all we have.
14020 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 66 69    ** to do is fi
14030 6e 64 20 74 68 65 20 66 69 72 73 74 20 6f 72 20  nd the first or 
14040 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
14050 6e 20 74 68 65 20 63 68 6f 73 65 6e 20 69 6e 64  n the chosen ind
14060 65 78 2e 20 20 49 66 0a 20 20 2a 2a 20 74 68 65  ex.  If.  ** the
14070 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
14080 69 73 20 6f 6e 20 74 68 65 20 49 4e 54 45 47 45  is on the INTEGE
14090 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74  R PRIMARY KEY, t
140a0 68 65 6e 20 66 69 6e 64 20 74 68 65 20 66 69 72  hen find the fir
140b0 73 74 0a 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20  st.  ** or last 
140c0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6d 61 69  entry in the mai
140d0 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  n table..  */.  
140e0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
140f0 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
14100 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
14110 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28  hema);.  assert(
14120 20 69 44 62 3e 3d 30 20 7c 7c 20 70 54 61 62 2d   iDb>=0 || pTab-
14130 3e 69 73 45 70 68 65 6d 20 29 3b 0a 20 20 73 71  >isEphem );.  sq
14140 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
14150 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
14160 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62  b);.  sqlite3Tab
14170 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
14180 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
14190 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
141a0 0a 20 20 62 61 73 65 20 3d 20 70 53 72 63 2d 3e  .  base = pSrc->
141b0 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[0].iCursor;.  
141c0 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  brk = sqlite3Vdb
141d0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
141e0 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
141f0 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
14200 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28 20 70 53  , brk);.  if( pS
14210 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
14220 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
14230 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
14240 73 65 2c 20 62 61 73 65 2c 20 69 44 62 2c 20 70  se, base, iDb, p
14250 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
14260 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64  );.  }.  if( pId
14270 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x==0 ){.    sqli
14280 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14290 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29  seekOp, base, 0)
142a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
142b0 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68  * Even though th
142c0 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f  e cursor used to
142d0 20 6f 70 65 6e 20 74 68 65 20 69 6e 64 65 78 20   open the index 
142e0 68 65 72 65 20 69 73 20 63 6c 6f 73 65 64 0a 20  here is closed. 
142f0 20 20 20 2a 2a 20 61 73 20 73 6f 6f 6e 20 61 73     ** as soon as
14300 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 20   a single value 
14310 68 61 73 20 62 65 65 6e 20 72 65 61 64 20 66 72  has been read fr
14320 6f 6d 20 69 74 2c 20 61 6c 6c 6f 63 61 74 65 20  om it, allocate 
14330 69 74 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20  it.    ** using 
14340 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 29  (pParse->nTab++)
14350 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
14360 63 75 72 73 6f 72 20 69 64 20 66 72 6f 6d 20 62  cursor id from b
14370 65 69 6e 67 20 0a 20 20 20 20 2a 2a 20 72 65 75  eing .    ** reu
14380 73 65 64 2e 20 54 68 69 73 20 69 73 20 69 6d 70  sed. This is imp
14390 6f 72 74 61 6e 74 20 66 6f 72 20 73 74 61 74 65  ortant for state
143a0 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72  ments of the for
143b0 6d 20 0a 20 20 20 20 2a 2a 20 22 49 4e 53 45 52  m .    ** "INSER
143c0 54 20 49 4e 54 4f 20 78 20 53 45 4c 45 43 54 20  T INTO x SELECT 
143d0 6d 61 78 28 29 20 46 52 4f 4d 20 78 22 2e 0a 20  max() FROM x".. 
143e0 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49     */.    int iI
143f0 64 78 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20  dx;.    KeyInfo 
14400 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49  *pKey = sqlite3I
14410 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72  ndexKeyinfo(pPar
14420 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69  se, pIdx);.    i
14430 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
14440 61 62 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ab++;.    assert
14450 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d  ( pIdx->pSchema=
14460 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
14470 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14480 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
14490 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20  eger, iDb, 0);. 
144a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
144b0 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  3(v, OP_OpenRead
144c0 2c 20 69 49 64 78 2c 20 70 49 64 78 2d 3e 74 6e  , iIdx, pIdx->tn
144d0 75 6d 2c 20 0a 20 20 20 20 20 20 20 20 28 63 68  um, .        (ch
144e0 61 72 2a 29 70 4b 65 79 2c 20 50 33 5f 4b 45 59  ar*)pKey, P3_KEY
144f0 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
14500 20 20 20 69 66 28 20 73 65 65 6b 4f 70 3d 3d 4f     if( seekOp==O
14510 50 5f 52 65 77 69 6e 64 20 29 7b 0a 20 20 20 20  P_Rewind ){.    
14520 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14530 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  Op(v, OP_Null, 0
14540 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
14550 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14560 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31  OP_MakeRecord, 1
14570 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 65 65 6b  , 0);.      seek
14580 4f 70 20 3d 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a  Op = OP_MoveGt;.
14590 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
145a0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65  3VdbeAddOp(v, se
145b0 65 6b 4f 70 2c 20 69 49 64 78 2c 20 30 29 3b 0a  ekOp, iIdx, 0);.
145c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
145d0 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 6f  ddOp(v, OP_IdxRo
145e0 77 69 64 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20  wid, iIdx, 0);. 
145f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14600 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
14610 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 73   iIdx, 0);.    s
14620 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
14630 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 62 61  v, OP_MoveGe, ba
14640 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 65 4c  se, 0);.  }.  eL
14650 69 73 74 2e 6e 45 78 70 72 20 3d 20 31 3b 0a 20  ist.nExpr = 1;. 
14660 20 6d 65 6d 73 65 74 28 26 65 4c 69 73 74 49 74   memset(&eListIt
14670 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 65 4c  em, 0, sizeof(eL
14680 69 73 74 49 74 65 6d 29 29 3b 0a 20 20 65 4c 69  istItem));.  eLi
14690 73 74 2e 61 20 3d 20 26 65 4c 69 73 74 49 74 65  st.a = &eListIte
146a0 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b 30 5d 2e  m;.  eList.a[0].
146b0 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
146c0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
146d0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 65 4c 69  (pParse, p, &eLi
146e0 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c  st, 0, 0, 0, -1,
146f0 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 62   eDest, iParm, b
14700 72 6b 2c 20 62 72 6b 2c 20 30 29 3b 0a 20 20 73  rk, brk, 0);.  s
14710 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
14720 65 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a  eLabel(v, brk);.
14730 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14740 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
14750 62 61 73 65 2c 20 30 29 3b 0a 20 20 0a 20 20 72  base, 0);.  .  r
14760 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
14770 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 64 20 4f 52  * Analyze and OR
14780 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
14790 42 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20 53  BY clause in a S
147a0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
147b0 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
147c0 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
147d0 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20   seen..**.** An 
147e0 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
147f0 50 20 42 59 20 69 73 20 61 20 6c 69 73 74 20 6f  P BY is a list o
14800 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  f expressions.  
14810 49 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  If any expressio
14820 6e 0a 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67  n.** is an integ
14830 65 72 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65  er constant, the
14840 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  n that expressio
14850 6e 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79  n is replaced by
14860 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
14870 6e 64 69 6e 67 20 65 6e 74 72 79 20 69 6e 20 74  nding entry in t
14880 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a  he result set..*
14890 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
148a0 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79  cessOrderGroupBy
148b0 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
148c0 2a 70 4e 43 2c 20 20 20 20 20 2f 2a 20 4e 61 6d  *pNC,     /* Nam
148d0 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65  e context of the
148e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
148f0 74 2e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  t. */.  ExprList
14900 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
14910 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72   The ORDER BY or
14920 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
14930 20 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65 64   to be processed
14940 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
14950 20 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a 20 45   *zType     /* E
14960 69 74 68 65 72 20 22 4f 52 44 45 52 22 20 6f 72  ither "ORDER" or
14970 20 22 47 52 4f 55 50 22 2c 20 61 73 20 61 70 70   "GROUP", as app
14980 72 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b 0a 20  ropriate */.){. 
14990 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c 69   int i;.  ExprLi
149a0 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 4e 43  st *pEList = pNC
149b0 2d 3e 70 45 4c 69 73 74 3b 20 20 20 20 20 2f 2a  ->pEList;     /*
149c0 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
149d0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 2a 2f  of the SELECT */
149e0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
149f0 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 20   = pNC->pParse; 
14a00 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
14a10 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
14a20 45 43 54 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ECT */.  assert(
14a30 20 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 69 66   pEList );..  if
14a40 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ( pOrderBy==0 ) 
14a50 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28  return 0;.  for(
14a60 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
14a70 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
14a80 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20    int iCol;.    
14a90 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65  Expr *pE = pOrde
14aa0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
14ab0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14ac0 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
14ad0 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20  , &iCol) ){.    
14ae0 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 26 26 20    if( iCol>0 && 
14af0 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45  iCol<=pEList->nE
14b00 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 43  xpr ){.        C
14b10 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
14b20 70 45 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  pE->pColl;.     
14b30 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
14b40 45 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  E->flags & EP_Ex
14b50 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20  pCollate;.      
14b60 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
14b70 65 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20 20  ete(pE);.       
14b80 20 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e   pE = pOrderBy->
14b90 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c  a[i].pExpr = sql
14ba0 69 74 65 33 45 78 70 72 44 75 70 28 70 45 4c 69  ite3ExprDup(pELi
14bb0 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45  st->a[iCol-1].pE
14bc0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
14bd0 28 20 70 43 6f 6c 6c 20 26 26 20 66 6c 61 67 73  ( pColl && flags
14be0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45   ){.          pE
14bf0 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b  ->pColl = pColl;
14c00 0a 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 66  .          pE->f
14c10 6c 61 67 73 20 7c 3d 20 66 6c 61 67 73 3b 0a 20  lags |= flags;. 
14c20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14c30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
14c40 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14c50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
14c60 20 20 22 25 73 20 42 59 20 63 6f 6c 75 6d 6e 20    "%s BY column 
14c70 6e 75 6d 62 65 72 20 25 64 20 6f 75 74 20 6f 66  number %d out of
14c80 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20   range - should 
14c90 62 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  be ".           
14ca0 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25  "between 1 and %
14cb0 64 22 2c 20 7a 54 79 70 65 2c 20 69 43 6f 6c 2c  d", zType, iCol,
14cc0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
14cd0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
14ce0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
14cf0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14d00 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
14d10 28 70 4e 43 2c 20 70 45 29 20 29 7b 0a 20 20 20  (pNC, pE) ){.   
14d20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
14d30 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
14d40 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
14d50 20 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76 65   routine resolve
14d60 73 20 61 6e 79 20 6e 61 6d 65 73 20 75 73 65 64  s any names used
14d70 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
14d80 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 73 75 70  et of the.** sup
14d90 70 6c 69 65 64 20 53 45 4c 45 43 54 20 73 74 61  plied SELECT sta
14da0 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 53  tement. If the S
14db0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
14dc0 62 65 69 6e 67 20 72 65 73 6f 6c 76 65 64 0a 2a  being resolved.*
14dd0 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  * is a sub-selec
14de0 74 2c 20 74 68 65 6e 20 70 4f 75 74 65 72 4e 43  t, then pOuterNC
14df0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
14e00 20 74 68 65 20 4e 61 6d 65 43 6f 6e 74 65 78 74   the NameContext
14e10 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65   .** of the pare
14e20 6e 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 69 6e  nt SELECT..*/.in
14e30 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52  t sqlite3SelectR
14e40 65 73 6f 6c 76 65 28 0a 20 20 50 61 72 73 65 20  esolve(.  Parse 
14e50 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
14e60 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
14e70 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
14e80 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
14e90 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
14ea0 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
14eb0 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d   coded. */.  Nam
14ec0 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72  eContext *pOuter
14ed0 4e 43 20 20 2f 2a 20 54 68 65 20 6f 75 74 65 72  NC  /* The outer
14ee0 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 4d   name context. M
14ef0 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 29  ay be NULL. */.)
14f00 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  {.  ExprList *pE
14f10 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f  List;          /
14f20 2a 20 52 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f  * Result set. */
14f30 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
14f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14f50 20 46 6f 72 2d 6c 6f 6f 70 20 76 61 72 69 61 62   For-loop variab
14f60 6c 65 20 75 73 65 64 20 69 6e 20 6d 75 6c 74 69  le used in multi
14f70 70 6c 65 20 70 6c 61 63 65 73 20 2a 2f 0a 20 20  ple places */.  
14f80 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
14f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
14fa0 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  cal name-context
14fb0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
14fc0 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20 20 20  pGroupBy;       
14fd0 20 2f 2a 20 54 68 65 20 67 72 6f 75 70 20 62 79   /* The group by
14fe0 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a   clause */..  /*
14ff0 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
15000 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72 65 2c   has run before,
15010 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
15020 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ely. */.  if( p-
15030 3e 69 73 52 65 73 6f 6c 76 65 64 20 29 7b 0a 20  >isResolved ){. 
15040 20 20 20 61 73 73 65 72 74 28 20 21 70 4f 75 74     assert( !pOut
15050 65 72 4e 43 20 29 3b 0a 20 20 20 20 72 65 74 75  erNC );.    retu
15060 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15070 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65  }.  p->isResolve
15080 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20  d = 1;..  /* If 
15090 74 68 65 72 65 20 68 61 76 65 20 61 6c 72 65 61  there have alrea
150a0 64 79 20 62 65 65 6e 20 65 72 72 6f 72 73 2c 20  dy been errors, 
150b0 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20  do nothing. */. 
150c0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
150d0 72 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  r>0 ){.    retur
150e0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
150f0 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72    }..  /* Prepar
15100 65 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61  e the select sta
15110 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 63 61 6c  tement. This cal
15120 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74 65 20  l will allocate 
15130 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  all cursors.  **
15140 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e   required to han
15150 64 6c 65 20 74 68 65 20 74 61 62 6c 65 73 20 61  dle the tables a
15160 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  nd subqueries in
15170 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
15180 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65  ..  */.  if( pre
15190 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72  pSelectStmt(pPar
151a0 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65  se, p) ){.    re
151b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
151c0 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  R;.  }..  /* Res
151d0 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73 73  olve the express
151e0 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d 49  ions in the LIMI
151f0 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
15200 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20 2a 2a  uses. These.  **
15210 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
15220 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61 6e 79   to refer to any
15230 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73 73 20   names, so pass 
15240 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43 6f 6e  an empty NameCon
15250 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  text..  */.  mem
15260 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
15270 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43  eof(sNC));.  sNC
15280 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
15290 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
152a0 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
152b0 26 73 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  &sNC, p->pLimit)
152c0 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ||.      sqlite
152d0 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
152e0 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 66 66 73  s(&sNC, p->pOffs
152f0 65 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  et) ){.    retur
15300 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
15310 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70    }..  /* Set up
15320 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d   the local name-
15330 63 6f 6e 74 65 78 74 20 74 6f 20 70 61 73 73 20  context to pass 
15340 74 6f 20 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  to ExprResolveNa
15350 6d 65 73 28 29 20 74 6f 0a 20 20 2a 2a 20 72 65  mes() to.  ** re
15360 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73  solve the expres
15370 73 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  sion-list..  */.
15380 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d    sNC.allowAgg =
15390 20 31 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69   1;.  sNC.pSrcLi
153a0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
153b0 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4f 75 74  sNC.pNext = pOut
153c0 65 72 4e 43 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f  erNC;..  /* Reso
153d0 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74 68 65  lve names in the
153e0 20 72 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a   result set. */.
153f0 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
15400 4c 69 73 74 3b 0a 20 20 69 66 28 20 21 70 45 4c  List;.  if( !pEL
15410 69 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ist ) return SQL
15420 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72  ITE_ERROR;.  for
15430 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
15440 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
15450 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45 4c 69   Expr *pX = pELi
15460 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
15470 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
15480 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
15490 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a 20 20 20  &sNC, pX) ){.   
154a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
154b0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
154c0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
154d0 20 61 72 65 20 6e 6f 20 61 67 67 72 65 67 61 74   are no aggregat
154e0 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74  e functions in t
154f0 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c 20 61  he result-set, a
15500 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 0a  nd no GROUP BY .
15510 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c    ** expression,
15520 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 67   do not allow ag
15530 67 72 65 67 61 74 65 73 20 69 6e 20 61 6e 79 20  gregates in any 
15540 6f 66 20 74 68 65 20 6f 74 68 65 72 20 65 78 70  of the other exp
15550 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
15560 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69 73 41   assert( !p->isA
15570 67 67 20 29 3b 0a 20 20 70 47 72 6f 75 70 42 79  gg );.  pGroupBy
15580 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
15590 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 7c    if( pGroupBy |
155a0 7c 20 73 4e 43 2e 68 61 73 41 67 67 20 29 7b 0a  | sNC.hasAgg ){.
155b0 20 20 20 20 70 2d 3e 69 73 41 67 67 20 3d 20 31      p->isAgg = 1
155c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
155d0 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 30 3b  NC.allowAgg = 0;
155e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20  .  }..  /* If a 
155f0 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73  HAVING clause is
15600 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74   present, then t
15610 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 47  here must be a G
15620 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a  ROUP BY clause..
15630 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 48    */.  if( p->pH
15640 61 76 69 6e 67 20 26 26 20 21 70 47 72 6f 75 70  aving && !pGroup
15650 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
15660 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15670 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c  , "a GROUP BY cl
15680 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64  ause is required
15690 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22 29   before HAVING")
156a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
156b0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
156c0 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 78 70    /* Add the exp
156d0 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
156e0 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  the name-context
156f0 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e 67 20   before parsing 
15700 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 65  the.  ** other e
15710 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
15720 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
15730 6e 74 2e 20 54 68 69 73 20 69 73 20 73 6f 20 74  nt. This is so t
15740 68 61 74 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  hat.  ** express
15750 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52  ions in the WHER
15760 45 20 63 6c 61 75 73 65 20 28 65 74 63 2e 29 20  E clause (etc.) 
15770 63 61 6e 20 72 65 66 65 72 20 74 6f 20 65 78 70  can refer to exp
15780 72 65 73 73 69 6f 6e 73 20 62 79 0a 20 20 2a 2a  ressions by.  **
15790 20 61 6c 69 61 73 65 73 20 69 6e 20 74 68 65 20   aliases in the 
157a0 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2a  result set..  **
157b0 0a 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e  .  ** Minor poin
157c0 74 3a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  t: If this is th
157d0 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
157e0 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c   expression will
157f0 20 62 65 0a 20 20 2a 2a 20 72 65 2d 65 76 61 6c   be.  ** re-eval
15800 75 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 72  uated for each r
15810 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 0a  eference to it..
15820 20 20 2a 2f 0a 20 20 73 4e 43 2e 70 45 4c 69 73    */.  sNC.pELis
15830 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
15840 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
15850 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
15860 43 2c 20 70 2d 3e 70 57 68 65 72 65 29 20 7c 7c  C, p->pWhere) ||
15870 0a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  .     sqlite3Exp
15880 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73  rResolveNames(&s
15890 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 20  NC, p->pHaving) 
158a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
158b0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
158c0 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d    if( p->pPrior=
158d0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 72  =0 ){.    if( pr
158e0 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42  ocessOrderGroupB
158f0 79 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 72 64 65  y(&sNC, p->pOrde
15900 72 42 79 2c 20 22 4f 52 44 45 52 22 29 20 7c 7c  rBy, "ORDER") ||
15910 0a 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73  .        process
15920 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26 73 4e  OrderGroupBy(&sN
15930 43 2c 20 70 47 72 6f 75 70 42 79 2c 20 22 47 52  C, pGroupBy, "GR
15940 4f 55 50 22 29 20 29 7b 0a 20 20 20 20 20 20 72  OUP") ){.      r
15950 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
15960 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OR;.    }.  }.. 
15970 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
15980 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
15990 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  e does not conta
159a0 69 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  in aggregate fun
159b0 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ctions..  */.  i
159c0 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
159d0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
159e0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
159f0 20 20 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20    .    for(i=0, 
15a00 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e  pItem=pGroupBy->
15a10 61 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  a; i<pGroupBy->n
15a20 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
15a30 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 45  ++){.      if( E
15a40 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
15a50 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Item->pExpr, EP_
15a60 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Agg) ){.        
15a70 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15a80 70 50 61 72 73 65 2c 20 22 61 67 67 72 65 67 61  pParse, "aggrega
15a90 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  te functions are
15aa0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20   not allowed in 
15ab0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 74  ".            "t
15ac0 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
15ad0 73 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  se");.        re
15ae0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
15af0 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  R;.      }.    }
15b00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
15b10 69 73 20 69 73 20 6f 6e 65 20 53 45 4c 45 43 54  is is one SELECT
15b20 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2c 20   of a compound, 
15b30 62 65 20 73 75 72 65 20 74 6f 20 72 65 73 6f 6c  be sure to resol
15b40 76 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 69 6e  ve names.  ** in
15b50 20 74 68 65 20 6f 74 68 65 72 20 53 45 4c 45 43   the other SELEC
15b60 54 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  Ts..  */.  if( p
15b70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
15b80 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 65  return sqlite3Se
15b90 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72  lectResolve(pPar
15ba0 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 70  se, p->pPrior, p
15bb0 4f 75 74 65 72 4e 43 29 3b 0a 20 20 7d 65 6c 73  OuterNC);.  }els
15bc0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
15bd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
15be0 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20  /*.** Reset the 
15bf0 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
15c00 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lator..**.** The
15c10 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
15c20 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20  ulator is a set 
15c30 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  of memory cells 
15c40 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74  that hold.** int
15c50 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
15c60 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74  s while calculat
15c70 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65  ing an aggregate
15c80 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
15c90 6e 65 20 73 69 6d 70 6c 79 20 73 74 6f 72 65 73  ne simply stores
15ca0 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66   NULLs in all of
15cb0 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65   those memory ce
15cc0 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lls..*/.static v
15cd0 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c  oid resetAccumul
15ce0 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ator(Parse *pPar
15cf0 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
15d00 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
15d10 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
15d20 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
15d30 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
15d40 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28 20  c *pFunc;.  if( 
15d50 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b  pAggInfo->nFunc+
15d60 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
15d70 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  n==0 ){.    retu
15d80 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  rn;.  }.  for(i=
15d90 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
15da0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
15db0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15dc0 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c  Op(v, OP_MemNull
15dd0 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  , pAggInfo->aCol
15de0 5b 69 5d 2e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20  [i].iMem, 0);.  
15df0 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41  }.  for(pFunc=pA
15e00 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69  ggInfo->aFunc, i
15e10 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
15e20 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e  nFunc; i++, pFun
15e30 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  c++){.    sqlite
15e40 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15e50 5f 4d 65 6d 4e 75 6c 6c 2c 20 70 46 75 6e 63 2d  _MemNull, pFunc-
15e60 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 69  >iMem, 0);.    i
15e70 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  f( pFunc->iDisti
15e80 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
15e90 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63  Expr *pE = pFunc
15ea0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->pExpr;.      i
15eb0 66 28 20 70 45 2d 3e 70 4c 69 73 74 3d 3d 30 20  f( pE->pList==0 
15ec0 7c 7c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45  || pE->pList->nE
15ed0 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
15ee0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15ef0 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  g(pParse, "DISTI
15f00 4e 43 54 20 69 6e 20 61 67 67 72 65 67 61 74 65  NCT in aggregate
15f10 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65   must be followe
15f20 64 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  d ".           "
15f30 62 79 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  by an expression
15f40 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e  ");.        pFun
15f50 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  c->iDistinct = -
15f60 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
15f70 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
15f80 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49  *pKeyInfo = keyI
15f90 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
15fa0 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73  pParse, pE->pLis
15fb0 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
15fc0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
15fd0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
15fe0 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
15ff0 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
16000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16010 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
16020 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
16030 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OFF);.      }.  
16040 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
16050 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41   Invoke the OP_A
16060 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64  ggFinalize opcod
16070 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72  e for every aggr
16080 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  egate function.*
16090 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  * in the AggInfo
160a0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
160b0 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c  tatic void final
160c0 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
160d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
160e0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
160f0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
16100 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
16110 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
16120 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
16130 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
16140 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
16150 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
16160 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
16170 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
16180 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
16190 3e 70 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c 69  >pList;.    sqli
161a0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
161b0 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69  _AggFinal, pF->i
161c0 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69  Mem, pList ? pLi
161d0 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 0a 20  st->nExpr : 0,. 
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161f0 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e       (void*)pF->
16200 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43 44 45  pFunc, P3_FUNCDE
16210 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  F);.  }.}../*.**
16220 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75   Update the accu
16230 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63  mulator memory c
16240 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72  ells for an aggr
16250 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a  egate based on.*
16260 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  * the current cu
16270 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rsor position..*
16280 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70  /.static void up
16290 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
162a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
162b0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
162c0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
162d0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
162e0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
162f0 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
16300 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
16310 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70  fo_col *pC;..  p
16320 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
16330 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69  ode = 1;.  for(i
16340 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
16350 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
16360 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
16370 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e  pF++){.    int n
16380 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  Arg;.    int add
16390 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 45  rNext = 0;.    E
163a0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
163b0 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73   pF->pExpr->pLis
163c0 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  t;.    if( pList
163d0 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d   ){.      nArg =
163e0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
163f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
16400 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
16410 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  rse, pList);.   
16420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41   }else{.      nA
16430 72 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  rg = 0;.    }.  
16440 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69    if( pF->iDisti
16450 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
16460 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
16470 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
16480 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  v);.      assert
16490 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20  ( nArg==1 );.   
164a0 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
164b0 76 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  v, pF->iDistinct
164c0 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 29 3b 0a  , addrNext, 1);.
164d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
164e0 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c  ->pFunc->needCol
164f0 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20 43 6f  lSeq ){.      Co
16500 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
16510 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  ;.      struct E
16520 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
16530 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  tem;.      int j
16540 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16550 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20  pList!=0 );  /* 
16560 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e  pList!=0 if pF->
16570 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53  pFunc->needCollS
16580 65 71 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20  eq is true */.  
16590 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
165a0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43  em=pList->a; !pC
165b0 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a  oll && j<nArg; j
165c0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
165d0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
165e0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
165f0 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
16600 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
16610 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
16620 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
16630 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
16640 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
16650 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
16660 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  VdbeOp3(v, OP_Co
16670 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63 68  llSeq, 0, 0, (ch
16680 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43  ar *)pColl, P3_C
16690 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20  OLLSEQ);.    }. 
166a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
166b0 33 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c  3(v, OP_AggStep,
166c0 20 70 46 2d 3e 69 4d 65 6d 2c 20 6e 41 72 67 2c   pF->iMem, nArg,
166d0 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
166e0 63 2c 20 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P3_FUNCDEF);.
166f0 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
16700 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16710 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
16720 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  l(v, addrNext);.
16730 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
16740 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f  i=0, pC=pAggInfo
16750 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e  ->aCol; i<pAggIn
16760 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
16770 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20  ; i++, pC++){.  
16780 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
16790 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45  e(pParse, pC->pE
167a0 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
167b0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
167c0 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 43 2d 3e 69  _MemStore, pC->i
167d0 4d 65 6d 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 70  Mem, 1);.  }.  p
167e0 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
167f0 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  ode = 0;.}.../*.
16800 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
16810 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
16820 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
16830 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
16840 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74  ts are distribut
16850 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61  ed in various wa
16860 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ys depending on 
16870 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
16880 65 44 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e  eDest and iParm.
16890 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74  .**.**     eDest
168a0 20 56 61 6c 75 65 20 20 20 20 20 20 20 52 65 73   Value       Res
168b0 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d  ult.**     -----
168c0 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
168d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
168e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
168f0 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52  ------.**     SR
16900 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e  T_Callback    In
16910 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63  voke the callbac
16920 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  k for each row o
16930 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  f the result..**
16940 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20  .**     SRT_Mem 
16950 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 66 69          Store fi
16960 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65  rst result in me
16970 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a  mory cell iParm.
16980 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65  **.**     SRT_Se
16990 74 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20  t         Store 
169a0 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20  results as keys 
169b0 6f 66 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  of table iParm..
169c0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e  **.**     SRT_Un
169d0 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20  ion       Store 
169e0 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79  results as a key
169f0 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
16a00 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a  table iParm.**.*
16a10 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74  *     SRT_Except
16a20 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73        Remove res
16a30 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65  ults from the te
16a40 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
16a50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  arm..**.**     S
16a60 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53  RT_Table       S
16a70 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20  tore results in 
16a80 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
16a90 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iParm.**.** The 
16aa0 74 61 62 6c 65 20 61 62 6f 76 65 20 69 73 20 69  table above is i
16ab0 6e 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64 69  ncomplete.  Addi
16ac0 74 69 6f 6e 61 6c 20 65 44 69 73 74 20 76 61 6c  tional eDist val
16ad0 75 65 20 68 61 76 65 20 62 65 20 61 64 64 65 64  ue have be added
16ae0 0a 2a 2a 20 73 69 6e 63 65 20 74 68 69 73 20 63  .** since this c
16af0 6f 6d 6d 65 6e 74 20 77 61 73 20 77 72 69 74 74  omment was writt
16b00 65 6e 2e 20 20 53 65 65 20 74 68 65 20 73 65 6c  en.  See the sel
16b10 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66  ectInnerLoop() f
16b20 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61  unction for.** a
16b30 20 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e   complete listin
16b40 67 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65 64  g of the allowed
16b50 20 76 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74   values of eDest
16b60 20 61 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69   and their meani
16b70 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ngs..**.** This 
16b80 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
16b90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
16ba0 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72  rors.  If any er
16bb0 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f  rors are.** enco
16bc0 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e  untered, then an
16bd0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
16be0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
16bf0 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  ft in.** pParse-
16c00 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
16c10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
16c20 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53  s NOT free the S
16c30 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
16c40 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a  passed in.  The.
16c50 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  ** calling funct
16c60 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20  ion needs to do 
16c70 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  that..**.** The 
16c80 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54  pParent, parentT
16c90 61 62 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74  ab, and *pParent
16ca0 41 67 67 20 66 69 65 6c 64 73 20 61 72 65 20 66  Agg fields are f
16cb0 69 6c 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73  illed in if this
16cc0 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20  .** SELECT is a 
16cd0 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20  subquery.  This 
16ce0 72 6f 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20  routine may try 
16cf0 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20  to combine this 
16d00 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69  SELECT.** with i
16d10 74 73 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72  ts parent to for
16d20 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  m a single flat 
16d30 71 75 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f  query.  In so do
16d40 69 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a  ing, it might.**
16d50 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 72 65   change the pare
16d60 6e 74 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20  nt query from a 
16d70 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f  non-aggregate to
16d80 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75   an aggregate qu
16d90 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74  ery..** For that
16da0 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61   reason, the pPa
16db0 72 65 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20  rentAgg flag is 
16dc0 70 61 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e  passed as a poin
16dd0 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61  ter, so it.** ca
16de0 6e 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  n be changed..**
16df0 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
16e00 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   The meaning of 
16e10 74 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61  the pParent para
16e20 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  meter..**.**    
16e30 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
16e40 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c   JOIN (SELECT x,
16e50 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
16e60 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20  2) JOIN t3;.**  
16e70 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
16e80 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
16e90 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
16ea0 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20  __/        /.** 
16eb0 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20      \           
16ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 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 2f 0a 2a 2a 20             /.** 
16ef0 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
16f00 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
16f10 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
16f20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a  __________/.**.*
16f30 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
16f40 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  s called for the
16f50 20 6f 75 74 65 72 20 71 75 65 72 79 20 66 69 72   outer query fir
16f60 73 74 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63  st.   For that c
16f70 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20  all,.** pParent 
16f80 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44  will be NULL.  D
16f90 75 72 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73  uring the proces
16fa0 73 69 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65  sing of the oute
16fb0 72 20 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a  r query, this .*
16fc0 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
16fd0 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20  led recursively 
16fe0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75  to handle the su
16ff0 62 71 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65  bquery.  For the
17000 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61   recursive.** ca
17010 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c  ll, pParent will
17020 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75   point to the ou
17030 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 63 61  ter query.  Beca
17040 75 73 65 20 74 68 65 20 73 75 62 71 75 65 72 79  use the subquery
17050 20 69 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e   is.** the secon
17060 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74  d element in a t
17070 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74  hree-way join, t
17080 68 65 20 70 61 72 65 6e 74 54 61 62 20 70 61 72  he parentTab par
17090 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62  ameter will.** b
170a0 65 20 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c  e 1 (the 2nd val
170b0 75 65 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65  ue of a 0-indexe
170c0 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74  d array.).*/.int
170d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a   sqlite3Select(.
170e0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
170f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17100 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
17110 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
17120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
17130 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
17140 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
17150 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  */.  int eDest, 
17160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
17170 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
17180 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
17190 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20    int iParm,    
171a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 61           /* A pa
171b0 72 61 6d 65 74 65 72 20 75 73 65 64 20 62 79 20  rameter used by 
171c0 74 68 65 20 65 44 65 73 74 20 64 69 73 70 6f 73  the eDest dispos
171d0 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53  al method */.  S
171e0 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20  elect *pParent, 
171f0 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
17200 20 53 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63   SELECT for whic
17210 68 20 74 68 69 73 20 69 73 20 61 20 73 75 62 2d  h this is a sub-
17220 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70  query */.  int p
17230 61 72 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20  arentTab,       
17240 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50    /* Index in pP
17250 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74  arent->pSrc of t
17260 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  his query */.  i
17270 6e 74 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20  nt *pParentAgg, 
17280 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
17290 20 70 50 61 72 65 6e 74 20 75 73 65 73 20 61 67   pParent uses ag
172a0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
172b0 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66  s */.  char *aff
172c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
172d0 20 49 66 20 65 44 65 73 74 20 69 73 20 53 52 54   If eDest is SRT
172e0 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69  _Union, the affi
172f0 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29  nity string */.)
17300 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
17310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
17320 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
17330 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
17340 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72  fo;     /* Retur
17350 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68  n from sqlite3Wh
17360 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20  ereBegin() */.  
17370 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
17380 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
17390 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e  rtual machine un
173a0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
173b0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b   */.  int isAgg;
173c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
173d0 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
173e0 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
173f0 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
17400 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
17410 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
17420 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
17430 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
17440 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
17450 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
17460 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
17470 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
17480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17490 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
174a0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
174b0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
174c0 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rBy;    /* The O
174d0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
174e0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
174f0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
17500 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  upBy;    /* The 
17510 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
17520 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
17530 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
17540 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
17550 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20   HAVING clause. 
17560 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
17570 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74    int isDistinct
17580 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
17590 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
175a0 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
175b0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  ent */.  int dis
175c0 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20  tinct;          
175d0 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20  /* Table to use 
175e0 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
175f0 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63   set */.  int rc
17600 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
17610 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
17620 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75  urn from this fu
17630 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  nction */.  int 
17640 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20  addrSortIndex;  
17650 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
17660 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   an OP_OpenEphem
17670 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
17680 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41   */.  AggInfo sA
17690 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20  ggInfo;      /* 
176a0 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64  Information used
176b0 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75   by aggregate qu
176c0 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  eries */.  int i
176d0 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
176e0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
176f0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71  the end of the q
17700 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70  uery */..  if( p
17710 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61  ==0 || sqlite3Ma
17720 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 7c 7c 20  llocFailed() || 
17730 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
17740 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
17750 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  }.  if( sqlite3A
17760 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
17770 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
17780 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
17790 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  n 1;.  memset(&s
177a0 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  AggInfo, 0, size
177b0 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a  of(sAggInfo));..
177c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
177d0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
177e0 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  ECT.  /* If ther
177f0 65 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65  e is are a seque
17800 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20  nce of queries, 
17810 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f  do the earlier o
17820 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a  nes first..  */.
17830 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
17840 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52  ){.    if( p->pR
17850 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20  ightmost==0 ){. 
17860 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f       Select *pLo
17870 6f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4c  op;.      for(pL
17880 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c  oop=p; pLoop; pL
17890 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f  oop=pLoop->pPrio
178a0 72 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f  r){.        pLoo
178b0 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  p->pRightmost = 
178c0 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
178d0 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
178e0 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
178f0 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  p, eDest, iParm,
17900 20 61 66 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69   aff);.  }.#endi
17910 66 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  f..  pOrderBy = 
17920 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
17930 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
17940 72 62 79 28 65 44 65 73 74 29 20 29 7b 0a 20 20  rby(eDest) ){.  
17950 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
17960 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
17970 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
17980 65 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 20  e(pParse, p, 0) 
17990 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
179a0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d  ct_end;.  }.  p-
179b0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
179c0 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  erBy;..  /* Make
179d0 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f 66   local copies of
179e0 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   the parameters 
179f0 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e 0a  for this query..
17a00 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 20    */.  pTabList 
17a10 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68  = p->pSrc;.  pWh
17a20 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
17a30 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
17a40 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
17a50 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
17a60 67 3b 0a 20 20 69 73 41 67 67 20 3d 20 70 2d 3e  g;.  isAgg = p->
17a70 69 73 41 67 67 3b 0a 20 20 69 73 44 69 73 74 69  isAgg;.  isDisti
17a80 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
17a90 6e 63 74 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  nct;.  pEList = 
17aa0 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
17ab0 20 70 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74   pEList==0 ) got
17ac0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
17ad0 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74   /* .  ** Do not
17ae0 20 65 76 65 6e 20 61 74 74 65 6d 70 74 20 74 6f   even attempt to
17af0 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20 63 6f   generate any co
17b00 64 65 20 69 66 20 77 65 20 68 61 76 65 20 61 6c  de if we have al
17b10 72 65 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20  ready seen.  ** 
17b20 65 72 72 6f 72 73 20 62 65 66 6f 72 65 20 74 68  errors before th
17b30 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74  is routine start
17b40 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  s..  */.  if( pP
17b50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67  arse->nErr>0 ) g
17b60 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
17b70 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67  .  /* If writing
17b80 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65   to memory or ge
17b90 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20  nerating a set. 
17ba0 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   ** only a singl
17bb0 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20  e column may be 
17bc0 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66  output..  */.#if
17bd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17be0 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
17bf0 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20  (eDest==SRT_Mem 
17c00 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65  || eDest==SRT_Se
17c10 74 29 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  t) && pEList->nE
17c20 78 70 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c  xpr>1 ){.    sql
17c30 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17c40 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e  rse, "only a sin
17c50 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77  gle result allow
17c60 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20  ed for ".       
17c70 22 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  "a SELECT that i
17c80 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
17c90 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 67  ression");.    g
17ca0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
17cb0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
17cc0 20 4f 52 44 45 52 20 42 59 20 69 73 20 69 67 6e   ORDER BY is ign
17cd0 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65  ored for some de
17ce0 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f  stinations..  */
17cf0 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65  .  if( Ignorable
17d00 4f 72 64 65 72 62 79 28 65 44 65 73 74 29 20 29  Orderby(eDest) )
17d10 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d  {.    pOrderBy =
17d20 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65   0;.  }..  /* Be
17d30 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63  gin generating c
17d40 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ode..  */.  v = 
17d50 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
17d60 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
17d70 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
17d80 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  _end;..  /* Gene
17d90 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c  rate code for al
17da0 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e  l sub-queries in
17db0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
17dc0 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  .  */.#if !defin
17dd0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
17de0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
17df0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
17e00 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30  _VIEW).  for(i=0
17e10 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
17e20 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  rc; i++){.    co
17e30 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64  nst char *zSaved
17e40 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 30 3b  AuthContext = 0;
17e50 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 52 65 73  .    int needRes
17e60 74 6f 72 65 43 6f 6e 74 65 78 74 3b 0a 20 20 20  toreContext;.   
17e70 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
17e80 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
17e90 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 0a  TabList->a[i];..
17ea0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
17eb0 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 49 74  Select==0 || pIt
17ec0 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20  em->isPopulated 
17ed0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
17ee0 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  if( pItem->zName
17ef0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 61  !=0 ){.      zSa
17f00 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
17f10 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
17f20 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61  ntext;.      pPa
17f30 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
17f40 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  t = pItem->zName
17f50 3b 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73 74  ;.      needRest
17f60 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a  oreContext = 1;.
17f70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17f80 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
17f90 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
17fa0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
17fb0 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
17fc0 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 45 70 68  pSelect, SRT_Eph
17fd0 65 6d 54 61 62 2c 20 0a 20 20 20 20 20 20 20 20  emTab, .        
17fe0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
17ff0 69 43 75 72 73 6f 72 2c 20 70 2c 20 69 2c 20 26  iCursor, p, i, &
18000 69 73 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 69  isAgg, 0);.    i
18010 66 28 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f  f( needRestoreCo
18020 6e 74 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  ntext ){.      p
18030 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
18040 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68  ext = zSavedAuth
18050 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20  Context;.    }. 
18060 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
18070 3e 70 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72  >pSrc;.    pWher
18080 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
18090 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c     if( !Ignorabl
180a0 65 4f 72 64 65 72 62 79 28 65 44 65 73 74 29 20  eOrderby(eDest) 
180b0 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  ){.      pOrderB
180c0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
180d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72 6f 75  .    }.    pGrou
180e0 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
180f0 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67 20 3d  y;.    pHaving =
18100 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20   p->pHaving;.   
18110 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d   isDistinct = p-
18120 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d  >isDistinct;.  }
18130 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68  .#endif..  /* Ch
18140 65 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63  eck for the spec
18150 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69  ial case of a mi
18160 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e  n() or max() fun
18170 63 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a  ction by itself.
18180 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
18190 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  lt set..  */.  i
181a0 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51  f( simpleMinMaxQ
181b0 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
181c0 65 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b  eDest, iParm) ){
181d0 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20  .    rc = 0;.   
181e0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
181f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
18200 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  k to see if this
18210 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 74   is a subquery t
18220 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74  hat can be "flat
18230 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20  tened" into its 
18240 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  parent..  ** If 
18250 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20  flattening is a 
18260 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73  possiblity, do s
18270 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d  o and return imm
18280 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f  ediately.  .  */
18290 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
182a0 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20  OMIT_VIEW.  if( 
182b0 70 50 61 72 65 6e 74 20 26 26 20 70 50 61 72 65  pParent && pPare
182c0 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20 20 66  ntAgg &&.      f
182d0 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70  lattenSubquery(p
182e0 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61  Parent, parentTa
182f0 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20  b, *pParentAgg, 
18300 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66  isAgg) ){.    if
18310 28 20 69 73 41 67 67 20 29 20 2a 70 50 61 72 65  ( isAgg ) *pPare
18320 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 67  ntAgg = 1;.    g
18330 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
18340 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
18350 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
18360 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
18370 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69   then this sorti
18380 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69  ng.  ** index mi
18390 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67  ght end up being
183a0 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64   unused if the d
183b0 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a  ata can be .  **
183c0 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72   extracted in pr
183d0 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20  e-sorted order. 
183e0 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20   If that is the 
183f0 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  case, then the. 
18400 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   ** OP_OpenEphem
18410 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
18420 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
18430 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f   to an OP_Noop o
18440 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75  nce.  ** we figu
18450 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20  re out that the 
18460 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73  sorting index is
18470 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68   not needed.  Th
18480 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a  e addrSortIndex.
18490 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73    ** variable is
184a0 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74   used to facilit
184b0 61 74 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e  ate that change.
184c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
184d0 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49  erBy ){.    KeyI
184e0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
184f0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
18500 45 72 72 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Err ){.      got
18510 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
18520 20 20 7d 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f    }.    pKeyInfo
18530 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
18540 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
18550 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 4f  OrderBy);.    pO
18560 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
18570 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
18580 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  +;.    p->addrOp
18590 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72  enEphm[2] = addr
185a0 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20  SortIndex =.    
185b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
185c0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
185d0 65 72 61 6c 2c 20 70 4f 72 64 65 72 42 79 2d 3e  eral, pOrderBy->
185e0 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72  iECursor, pOrder
185f0 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 20 20 20  By->nExpr+2,    
18600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18610 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
18620 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P3_KEYINFO_HAN
18630 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DOFF);.  }else{.
18640 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e 64 65      addrSortInde
18650 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  x = -1;.  }..  /
18660 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
18670 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
18680 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
18690 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
186a0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  le..  */.  if( e
186b0 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
186c0 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
186d0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
186e0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
186f0 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e  iParm, pEList->n
18700 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Expr);.  }..  /*
18710 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
18720 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20  ..  */.  iEnd = 
18730 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
18740 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75  abel(v);.  compu
18750 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
18760 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64  (pParse, p, iEnd
18770 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20  );..  /* Open a 
18780 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
18790 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
187a0 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a  tinct set..  */.
187b0 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74    if( isDistinct
187c0 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
187d0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 64  *pKeyInfo;.    d
187e0 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
187f0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 4b  ->nTab++;.    pK
18800 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
18810 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
18820 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  rse, p->pEList);
18830 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18840 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op3(v, OP_OpenEp
18850 68 65 6d 65 72 61 6c 2c 20 64 69 73 74 69 6e 63  hemeral, distinc
18860 74 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  t, 0, .         
18870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
18880 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
18890 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
188a0 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  FF);.  }else{.  
188b0 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b    distinct = -1;
188c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65  .  }..  /* Aggre
188d0 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67  gate and non-agg
188e0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 61  regate queries a
188f0 72 65 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65  re handled diffe
18900 72 65 6e 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20  rently */.  if( 
18910 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75 70  !isAgg && pGroup
18920 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  By==0 ){.    /* 
18930 54 68 69 73 20 63 61 73 65 20 69 73 20 66 6f 72  This case is for
18940 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71   non-aggregate q
18950 75 65 72 69 65 73 0a 20 20 20 20 2a 2a 20 42 65  ueries.    ** Be
18960 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  gin the database
18970 20 73 63 61 6e 0a 20 20 20 20 2a 2f 0a 20 20 20   scan.    */.   
18980 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
18990 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
189a0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
189b0 68 65 72 65 2c 20 26 70 4f 72 64 65 72 42 79 29  here, &pOrderBy)
189c0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
189d0 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
189e0 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 49  t_end;..    /* I
189f0 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  f sorting index 
18a00 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64  that was created
18a10 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f   by a prior OP_O
18a20 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20  penEphemeral .  
18a30 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
18a40 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65   ended up not be
18a50 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e  ing needed, then
18a60 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f   change the OP_O
18a70 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20  penEphemeral.   
18a80 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e   ** into an OP_N
18a90 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
18aa0 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e 64 65  if( addrSortInde
18ab0 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79  x>=0 && pOrderBy
18ac0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
18ad0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
18ae0 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74  Noop(v, addrSort
18af0 49 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20 20 20  Index, 1);.     
18b00 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
18b10 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  [2] = -1;.    }.
18b20 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20  .    /* Use the 
18b30 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c  standard inner l
18b40 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oop.    */.    i
18b50 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  f( selectInnerLo
18b60 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45  op(pParse, p, pE
18b70 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64  List, 0, 0, pOrd
18b80 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20  erBy, distinct, 
18b90 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  eDest,.         
18ba0 20 20 20 20 20 20 20 20 20 20 20 69 50 61 72 6d             iParm
18bb0 2c 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69  , pWInfo->iConti
18bc0 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  nue, pWInfo->iBr
18bd0 65 61 6b 2c 20 61 66 66 29 20 29 7b 0a 20 20 20  eak, aff) ){.   
18be0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
18bf0 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  end;.    }..    
18c00 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
18c10 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  ase scan loop.. 
18c20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
18c30 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
18c40 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
18c50 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 70  /* This is the p
18c60 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67  rocessing for ag
18c70 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
18c80 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
18c90 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61  xt sNC;    /* Na
18ca0 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
18cb0 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
18cc0 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ate information 
18cd0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d  */.    int iAMem
18ce0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
18cf0 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
18d00 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72  for storing curr
18d10 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ent GROUP BY */.
18d20 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20      int iBMem;  
18d30 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
18d40 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
18d50 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20   previous GROUP 
18d60 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55  BY */.    int iU
18d70 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  seFlag;       /*
18d80 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c   Mem address hol
18d90 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61  ding flag indica
18da0 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61  ting that at lea
18db0 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  st.             
18dc0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
18dd0 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70  e row of the inp
18de0 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ut to the aggreg
18df0 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20  ator has been.  
18e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e10 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
18e20 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  ed */.    int iA
18e30 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a  bortFlag;     /*
18e40 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69   Mem address whi
18e50 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20  ch causes query 
18e60 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76  abort if positiv
18e70 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f  e */.    int gro
18e80 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20  upBySort;    /* 
18e90 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73  Rows come from s
18ea0 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42  ource in GROUP B
18eb0 59 20 6f 72 64 65 72 20 2a 2f 0a 0a 0a 20 20 20  Y order */...   
18ec0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
18ed0 67 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64  g variables hold
18ee0 20 61 64 64 72 65 73 73 65 73 20 6f 72 20 6c 61   addresses or la
18ef0 62 65 6c 73 20 66 6f 72 20 70 61 72 74 73 20 6f  bels for parts o
18f00 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 69 72  f the.    ** vir
18f10 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 70 72 6f  tual machine pro
18f20 67 72 61 6d 20 77 65 20 61 72 65 20 70 75 74 74  gram we are putt
18f30 69 6e 67 20 74 6f 67 65 74 68 65 72 20 2a 2f 0a  ing together */.
18f40 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70      int addrOutp
18f50 75 74 52 6f 77 3b 20 20 20 20 20 20 2f 2a 20 53  utRow;      /* S
18f60 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69  tart of subrouti
18f70 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
18f80 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a  a result row */.
18f90 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74 41      int addrSetA
18fa0 62 6f 72 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  bort;       /* S
18fb0 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61  et the abort fla
18fc0 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  g and return */.
18fd0 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74      int addrInit
18fe0 69 61 6c 69 7a 65 4c 6f 6f 70 3b 20 2f 2a 20 53  ializeLoop; /* S
18ff0 74 61 72 74 20 6f 66 20 63 6f 64 65 20 74 68 61  tart of code tha
19000 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  t initializes th
19010 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a  e input loop */.
19020 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f      int addrTopO
19030 66 4c 6f 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54  fLoop;      /* T
19040 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  op of the input 
19050 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20  loop */.    int 
19060 61 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67  addrGroupByChang
19070 65 3b 20 20 2f 2a 20 43 6f 64 65 20 74 68 61 74  e;  /* Code that
19080 20 72 75 6e 73 20 77 68 65 6e 20 61 6e 79 20 47   runs when any G
19090 52 4f 55 50 20 42 59 20 74 65 72 6d 20 63 68 61  ROUP BY term cha
190a0 6e 67 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  nges */.    int 
190b0 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77 3b 20  addrProcessRow; 
190c0 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 70      /* Code to p
190d0 72 6f 63 65 73 73 20 61 20 73 69 6e 67 6c 65 20  rocess a single 
190e0 69 6e 70 75 74 20 72 6f 77 20 2a 2f 0a 20 20 20  input row */.   
190f0 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20   int addrEnd;   
19100 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
19110 6f 66 20 61 6c 6c 20 70 72 6f 63 65 73 73 69 6e  of all processin
19120 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  g */.    int add
19130 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 20 20 20  rSortingIdx;    
19140 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45   /* The OP_OpenE
19150 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65  phemeral for the
19160 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a   sorting index *
19170 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 52 65  /.    int addrRe
19180 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  set;          /*
19190 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   Subroutine for 
191a0 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63  resetting the ac
191b0 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 0a 20 20  cumulator */..  
191c0 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69    addrEnd = sqli
191d0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
191e0 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  (v);..    /* Con
191f0 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e  vert TK_COLUMN n
19200 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47  odes into TK_AGG
19210 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65  _COLUMN and make
19220 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20   entries in.    
19230 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20  ** sAggInfo for 
19240 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  all TK_AGG_FUNCT
19250 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70  ION nodes in exp
19260 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a  ressions of the.
19270 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74      ** SELECT st
19280 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a  atement..    */.
19290 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c      memset(&sNC,
192a0 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
192b0 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65  ;.    sNC.pParse
192c0 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73   = pParse;.    s
192d0 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
192e0 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e  abList;.    sNC.
192f0 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67  pAggInfo = &sAgg
19300 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e  Info;.    sAggIn
19310 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
19320 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70  n = pGroupBy ? p
19330 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31  GroupBy->nExpr+1
19340 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e   : 0;.    sAggIn
19350 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  fo.pGroupBy = pG
19360 72 6f 75 70 42 79 3b 0a 20 20 20 20 69 66 28 20  roupBy;.    if( 
19370 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
19380 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
19390 70 45 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  pEList) ){.     
193a0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
193b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
193c0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
193d0 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
193e0 70 4f 72 64 65 72 42 79 29 20 29 7b 0a 20 20 20  pOrderBy) ){.   
193f0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
19400 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
19410 28 20 70 48 61 76 69 6e 67 20 26 26 20 73 71 6c  ( pHaving && sql
19420 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
19430 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20  ggregates(&sNC, 
19440 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20  pHaving) ){.    
19450 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
19460 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67  d;.    }.    sAg
19470 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74  gInfo.nAccumulat
19480 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43  or = sAggInfo.nC
19490 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69  olumn;.    for(i
194a0 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
194b0 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
194c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
194d0 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
194e0 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61  &sNC, sAggInfo.a
194f0 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 70  Func[i].pExpr->p
19500 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  List) ){.       
19510 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
19520 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19530 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d      if( sqlite3M
19540 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20  allocFailed() ) 
19550 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
19560 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73  ..    /* Process
19570 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
19580 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59  es with GROUP BY
19590 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65   is very differe
195a0 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75  nt and.    ** mu
195b0 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20  ch more complex 
195c0 74 68 61 20 61 67 67 72 65 67 61 74 65 73 20 77  tha aggregates w
195d0 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42  ithout a GROUP B
195e0 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  Y..    */.    if
195f0 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
19600 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
19610 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e  yInfo;  /* Keyin
19620 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
19630 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63  r the group by c
19640 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 20 20 20 20  lause */..      
19650 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73  /* Create labels
19660 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65   that we will be
19670 20 6e 65 65 64 69 6e 67 0a 20 20 20 20 20 20 2a   needing.      *
19680 2f 0a 20 20 20 20 20 0a 20 20 20 20 20 20 61 64  /.     .      ad
19690 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70  drInitializeLoop
196a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
196b0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
196c0 20 20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61    addrGroupByCha
196d0 6e 67 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nge = sqlite3Vdb
196e0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
196f0 20 20 20 20 20 61 64 64 72 50 72 6f 63 65 73 73       addrProcess
19700 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
19710 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
19720 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
19730 65 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20  e is a GROUP BY 
19740 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20  clause we might 
19750 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69  need a sorting i
19760 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ndex to.      **
19770 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20   implement it.  
19780 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f  Allocate that so
19790 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e  rting index now.
197a0 20 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75    If it turns ou
197b0 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  t.      ** that 
197c0 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69  we do not need i
197d0 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65  t after all, the
197e0 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69   OpenEphemeral i
197f0 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20  nstruction.     
19800 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76   ** will be conv
19810 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f  erted into a Noo
19820 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  p.  .      */.  
19830 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
19840 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65  tingIdx = pParse
19850 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
19860 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
19870 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
19880 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29  Parse, pGroupBy)
19890 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74  ;.      addrSort
198a0 69 6e 67 49 64 78 20 3d 0a 20 20 20 20 20 20 20  ingIdx =.       
198b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
198c0 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  3(v, OP_OpenEphe
198d0 6d 65 72 61 6c 2c 20 73 41 67 67 49 6e 66 6f 2e  meral, sAggInfo.
198e0 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20  sortingIdx,.    
198f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19900 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53       sAggInfo.nS
19910 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 0a 20 20  ortingColumn,.  
19920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19930 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
19940 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
19950 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20  FO_HANDOFF);..  
19960 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
19970 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  e memory locatio
19980 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50  ns used by GROUP
19990 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72   BY aggregate pr
199a0 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a  ocessing.      *
199b0 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67  /.      iUseFlag
199c0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
199d0 2b 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46  +;.      iAbortF
199e0 6c 61 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  lag = pParse->nM
199f0 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69 41 4d 65  em++;.      iAMe
19a00 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
19a10 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
19a20 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
19a30 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->nExpr;.      i
19a40 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  BMem = pParse->n
19a50 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73  Mem;.      pPars
19a60 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
19a70 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
19a80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19a90 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c  Op(v, OP_MemInt,
19aa0 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   0, iAbortFlag);
19ab0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
19ac0 6e 74 28 28 76 2c 20 22 23 20 63 6c 65 61 72 20  nt((v, "# clear 
19ad0 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
19ae0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19af0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
19b00 6e 74 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29  nt, 0, iUseFlag)
19b10 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
19b20 65 6e 74 28 28 76 2c 20 22 23 20 69 6e 64 69 63  ent((v, "# indic
19b30 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
19b40 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20  empty"));.      
19b50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19b60 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
19b70 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f  addrInitializeLo
19b80 6f 70 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  op);..      /* G
19b90 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
19ba0 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
19bb0 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
19bc0 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  f the result.   
19bd0 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73     ** set.  This
19be0 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73   subroutine firs
19bf0 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69  t looks at the i
19c00 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73  UseFlag.  If iUs
19c10 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69  eFlag.      ** i
19c20 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
19c30 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68  qual to zero, th
19c40 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20  e subroutine is 
19c50 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20  a no-op.  If.   
19c60 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
19c70 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74  sing calls for t
19c80 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72  he query to abor
19c90 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  t, this subrouti
19ca0 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72  ne.      ** incr
19cb0 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72  ements the iAbor
19cc0 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63  tFlag memory loc
19cd0 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74  ation before ret
19ce0 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20  urning in.      
19cf0 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e  ** order to sign
19d00 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  al the caller to
19d10 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f   abort..      */
19d20 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62  .      addrSetAb
19d30 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ort = sqlite3Vdb
19d40 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
19d50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19d60 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
19d70 6d 49 6e 74 2c 20 31 2c 20 69 41 62 6f 72 74 46  mInt, 1, iAbortF
19d80 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
19d90 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73  Comment((v, "# s
19da0 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  et abort flag"))
19db0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19dc0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
19dd0 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  eturn, 0, 0);.  
19de0 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
19df0 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  w = sqlite3VdbeC
19e00 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
19e10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19e20 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65  AddOp(v, OP_IfMe
19e30 6d 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20  mPos, iUseFlag, 
19e40 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29  addrOutputRow+2)
19e50 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
19e60 65 6e 74 28 28 76 2c 20 22 23 20 47 72 6f 75 70  ent((v, "# Group
19e70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
19e80 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22  tor entry point"
19e90 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
19ea0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
19eb0 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a  _Return, 0, 0);.
19ec0 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
19ed0 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
19ee0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
19ef0 20 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67       if( pHaving
19f00 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
19f10 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
19f20 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
19f30 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
19f40 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
19f50 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e     rc = selectIn
19f60 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
19f70 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c  p, p->pEList, 0,
19f80 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20   0, pOrderBy,.  
19f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fa0 20 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63           distinc
19fb0 74 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  t, eDest, iParm,
19fc0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
19fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64               add
19fe0 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64  rOutputRow+1, ad
19ff0 64 72 53 65 74 41 62 6f 72 74 2c 20 61 66 66 29  drSetAbort, aff)
1a000 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
1a010 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  {.        goto s
1a020 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
1a030 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1a040 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1a050 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20  Return, 0, 0);. 
1a060 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1a070 28 28 76 2c 20 22 23 20 65 6e 64 20 67 72 6f 75  ((v, "# end grou
1a080 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
1a090 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
1a0a0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
1a0b0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
1a0c0 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f  ll reset the gro
1a0d0 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f  up-by accumulato
1a0e0 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  r.      */.     
1a0f0 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c   addrReset = sql
1a100 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1a110 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 72 65  ddr(v);.      re
1a120 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
1a130 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
1a140 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a150 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1a160 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 0a  Return, 0, 0);..
1a170 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61        /* Begin a
1a180 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
1a190 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72  extract all sour
1a1a0 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50  ce rows in GROUP
1a1b0 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20   BY order..     
1a1c0 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69   ** This might i
1a1d0 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72  nvolve two separ
1a1e0 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61  ate loops with a
1a1f0 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74  n OP_Sort in bet
1a200 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a  ween, or.      *
1a210 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20  * it might be a 
1a220 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74  single loop that
1a230 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74   uses an index t
1a240 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d  o extract inform
1a250 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ation.      ** i
1a260 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65  n the right orde
1a270 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e  r to begin with.
1a280 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1a290 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1a2a0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 49  veLabel(v, addrI
1a2b0 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a  nitializeLoop);.
1a2c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a2d0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73  eAddOp(v, OP_Gos
1a2e0 75 62 2c 20 30 2c 20 61 64 64 72 52 65 73 65 74  ub, 0, addrReset
1a2f0 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
1a300 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
1a310 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
1a320 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70  List, pWhere, &p
1a330 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20  GroupBy);.      
1a340 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
1a350 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1a360 0a 20 20 20 20 20 20 69 66 28 20 70 47 72 6f 75  .      if( pGrou
1a370 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBy==0 ){.      
1a380 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a    /* The optimiz
1a390 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65  er is able to de
1a3a0 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72  liver rows in gr
1a3b0 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a  oup by order so.
1a3c0 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f          ** we do
1a3d0 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72   not have to sor
1a3e0 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45  t.  The OP_OpenE
1a3f0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
1a400 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
1a410 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65  * cancelled late
1a420 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69  r because we sti
1a430 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74  ll need to use t
1a440 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20  he pKeyInfo.    
1a450 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
1a460 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
1a470 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 67  oupBy;.        g
1a480 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a  roupBySort = 0;.
1a490 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a4a0 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65       /* Rows are
1a4b0 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75   coming out in u
1a4c0 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65  ndetermined orde
1a4d0 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70  r.  We have to p
1a4e0 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  ush.        ** e
1a4f0 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73  ach row into a s
1a500 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65  orting index, te
1a510 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73  rminate the firs
1a520 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  t loop,.        
1a530 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65  ** then loop ove
1a540 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
1a550 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  dex in order to 
1a560 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20  get the output. 
1a570 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72         ** in sor
1a580 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ted order.      
1a590 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f    */.        gro
1a5a0 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20  upBySort = 1;.  
1a5b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a5c0 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
1a5d0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b  arse, pGroupBy);
1a5e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a5f0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1a600 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e  Sequence, sAggIn
1a610 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 30  fo.sortingIdx, 0
1a620 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70  );.        j = p
1a630 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31  GroupBy->nExpr+1
1a640 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
1a650 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
1a660 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
1a670 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
1a680 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
1a690 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  = &sAggInfo.aCol
1a6a0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
1a6b0 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
1a6c0 43 6f 6c 75 6d 6e 3c 6a 20 29 20 63 6f 6e 74 69  Column<j ) conti
1a6d0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 73  nue;.          s
1a6e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1a6f0 74 43 6f 6c 75 6d 6e 28 76 2c 20 70 43 6f 6c 2d  tColumn(v, pCol-
1a700 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f  >pTab, pCol->iCo
1a710 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62  lumn, pCol->iTab
1a720 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a  le);.          j
1a730 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
1a740 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a750 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
1a760 65 52 65 63 6f 72 64 2c 20 6a 2c 20 30 29 3b 0a  eRecord, j, 0);.
1a770 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1a780 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
1a790 64 78 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e  dxInsert, sAggIn
1a7a0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 30  fo.sortingIdx, 0
1a7b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1a7c0 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
1a7d0 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
1a7e0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1a7f0 4f 50 5f 53 6f 72 74 2c 20 73 41 67 67 49 6e 66  OP_Sort, sAggInf
1a800 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
1a810 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  drEnd);.        
1a820 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1a830 22 23 20 47 52 4f 55 50 20 42 59 20 73 6f 72 74  "# GROUP BY sort
1a840 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67  "));.        sAg
1a850 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67  gInfo.useSorting
1a860 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Idx = 1;.      }
1a870 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75  ..      /* Evalu
1a880 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ate the current 
1a890 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61  GROUP BY terms a
1a8a0 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20  nd store in b0, 
1a8b0 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20  b1, b2....      
1a8c0 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79  ** (b0 is memory
1a8d0 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b   location iBMem+
1a8e0 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31  0, b1 is iBMem+1
1a8f0 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a  , and so forth).
1a900 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f        ** Then co
1a910 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e  mpare the curren
1a920 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  t GROUP BY terms
1a930 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f   against the GRO
1a940 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20  UP BY terms.    
1a950 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72    ** from the pr
1a960 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65  evious row curre
1a970 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61  ntly stored in a
1a980 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20  0, a1, a2....   
1a990 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
1a9a0 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69  TopOfLoop = sqli
1a9b0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1a9c0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72  dr(v);.      for
1a9d0 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79  (j=0; j<pGroupBy
1a9e0 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
1a9f0 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70         if( group
1aa00 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
1aa10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1aa20 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
1aa30 6e 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  n, sAggInfo.sort
1aa40 69 6e 67 49 64 78 2c 20 6a 29 3b 0a 20 20 20 20  ingIdx, j);.    
1aa50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1aa60 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69       sAggInfo.di
1aa70 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
1aa80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1aa90 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1aaa0 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70  pGroupBy->a[j].p
1aab0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
1aac0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1aad0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1aae0 4d 65 6d 53 74 6f 72 65 2c 20 69 42 4d 65 6d 2b  MemStore, iBMem+
1aaf0 6a 2c 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  j, j<pGroupBy->n
1ab00 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 7d  Expr-1);.      }
1ab10 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 47 72  .      for(j=pGr
1ab20 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20  oupBy->nExpr-1; 
1ab30 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20  j>=0; j--){.    
1ab40 20 20 20 20 69 66 28 20 6a 3c 70 47 72 6f 75 70      if( j<pGroup
1ab50 42 79 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20  By->nExpr-1 ){. 
1ab60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ab70 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1ab80 4d 65 6d 4c 6f 61 64 2c 20 69 42 4d 65 6d 2b 6a  MemLoad, iBMem+j
1ab90 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
1aba0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1abb0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
1abc0 65 6d 4c 6f 61 64 2c 20 69 41 4d 65 6d 2b 6a 2c  emLoad, iAMem+j,
1abd0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
1abe0 20 6a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   j==0 ){.       
1abf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ac00 64 4f 70 28 76 2c 20 4f 50 5f 45 71 2c 20 30 78  dOp(v, OP_Eq, 0x
1ac10 32 30 30 2c 20 61 64 64 72 50 72 6f 63 65 73 73  200, addrProcess
1ac20 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Row);.        }e
1ac30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
1ac40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1ac50 76 2c 20 4f 50 5f 4e 65 2c 20 30 78 32 30 30 2c  v, OP_Ne, 0x200,
1ac60 20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e   addrGroupByChan
1ac70 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
1ac80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1ac90 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
1aca0 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66  , (void*)pKeyInf
1acb0 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 2c 20 50 33 5f  o->aColl[j], P3_
1acc0 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
1acd0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  }..      /* Gene
1ace0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72  rate code that r
1acf0 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65  uns whenever the
1ad00 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65   GROUP BY change
1ad10 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e  s..      ** Chan
1ad20 67 65 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20  ge in the GROUP 
1ad30 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20  BY are detected 
1ad40 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
1ad50 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c  code.      ** bl
1ad60 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77  ock.  If there w
1ad70 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20  ere no changes, 
1ad80 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b  this block is sk
1ad90 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ipped..      **.
1ada0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f        ** This co
1adb0 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e  de copies curren
1adc0 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73  t group by terms
1add0 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e   in b0,b1,b2,...
1ade0 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  .      ** over t
1adf0 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20  o a0,a1,a2.  It 
1ae00 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f  then calls the o
1ae10 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
1ae20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
1ae30 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61  sets the aggrega
1ae40 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  te accumulator r
1ae50 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70  egisters in prep
1ae60 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  aration.      **
1ae70 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52   for the next GR
1ae80 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20  OUP BY batch..  
1ae90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
1aea0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1aeb0 61 62 65 6c 28 76 2c 20 61 64 64 72 47 72 6f 75  abel(v, addrGrou
1aec0 70 42 79 43 68 61 6e 67 65 29 3b 0a 20 20 20 20  pByChange);.    
1aed0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72    for(j=0; j<pGr
1aee0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b  oupBy->nExpr; j+
1aef0 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
1af00 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1af10 4f 50 5f 4d 65 6d 4d 6f 76 65 2c 20 69 41 4d 65  OP_MemMove, iAMe
1af20 6d 2b 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  m+j, iBMem+j);. 
1af30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1af40 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1af50 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64   OP_Gosub, 0, ad
1af60 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
1af70 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1af80 28 76 2c 20 22 23 20 6f 75 74 70 75 74 20 6f 6e  (v, "# output on
1af90 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20  e row"));.      
1afa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1afb0 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c  (v, OP_IfMemPos,
1afc0 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64   iAbortFlag, add
1afd0 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 56 64 62  rEnd);.      Vdb
1afe0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
1aff0 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67  check abort flag
1b000 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
1b010 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1b020 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72  P_Gosub, 0, addr
1b030 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  Reset);.      Vd
1b040 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
1b050 20 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74   reset accumulat
1b060 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
1b070 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72   Update the aggr
1b080 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
1b090 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  rs based on the 
1b0a0 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20  content of.     
1b0b0 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
1b0c0 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  row.      */.   
1b0d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1b0e0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
1b0f0 64 72 50 72 6f 63 65 73 73 52 6f 77 29 3b 0a 20  drProcessRow);. 
1b100 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
1b110 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
1b120 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
1b130 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b140 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20  p(v, OP_MemInt, 
1b150 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  1, iUseFlag);.  
1b160 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1b170 28 76 2c 20 22 23 20 69 6e 64 69 63 61 74 65 20  (v, "# indicate 
1b180 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61  data in accumula
1b190 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
1b1a0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  * End of the loo
1b1b0 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  p.      */.     
1b1c0 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
1b1d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1b1e0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1b1f0 4f 50 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e 66  OP_Next, sAggInf
1b200 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
1b210 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20  drTopOfLoop);.  
1b220 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b230 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
1b240 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
1b250 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1b260 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
1b270 64 64 72 53 6f 72 74 69 6e 67 49 64 78 2c 20 31  ddrSortingIdx, 1
1b280 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
1b290 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
1b2a0 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73  final row of res
1b2b0 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ult.      */.   
1b2c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b2d0 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  dOp(v, OP_Gosub,
1b2e0 20 30 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f   0, addrOutputRo
1b2f0 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
1b300 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 6f 75 74  mment((v, "# out
1b310 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29  put final row"))
1b320 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 7d 20 2f  ;.      .    } /
1b330 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79  * endif pGroupBy
1b340 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20   */.    else {. 
1b350 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73       /* This cas
1b360 65 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67  e runs if the ag
1b370 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47  gregate has no G
1b380 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
1b390 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 72   The.      ** pr
1b3a0 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68  ocessing is much
1b3b0 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74   simpler since t
1b3c0 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73  here is only a s
1b3d0 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20  ingle row.      
1b3e0 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20  ** of output..  
1b3f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 73      */.      res
1b400 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
1b410 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
1b420 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d  ;.      pWInfo =
1b430 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1b440 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
1b450 69 73 74 2c 20 70 57 68 65 72 65 2c 20 30 29 3b  ist, pWhere, 0);
1b460 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
1b470 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
1b480 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 75 70  ct_end;.      up
1b490 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
1b4a0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
1b4b0 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
1b4c0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
1b4d0 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  );.      finaliz
1b4e0 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
1b4f0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
1b500 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  ;.      pOrderBy
1b510 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
1b520 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
1b530 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1b540 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
1b550 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20  aving, addrEnd, 
1b560 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
1b570 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
1b580 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
1b590 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c  pEList, 0, 0, 0,
1b5a0 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20   -1, .          
1b5b0 20 20 20 20 20 20 20 20 20 20 20 20 65 44 65 73              eDes
1b5c0 74 2c 20 69 50 61 72 6d 2c 20 61 64 64 72 45 6e  t, iParm, addrEn
1b5d0 64 2c 20 61 64 64 72 45 6e 64 2c 20 61 66 66 29  d, addrEnd, aff)
1b5e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1b5f0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1b600 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b  bel(v, addrEnd);
1b610 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64  .    .  } /* end
1b620 69 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65  if aggregate que
1b630 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  ry */..  /* If t
1b640 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
1b650 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
1b660 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74   we need to sort
1b670 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a   the results.  *
1b680 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20  * and send them 
1b690 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
1b6a0 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f  one by one..  */
1b6b0 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
1b6c0 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53  ){.    generateS
1b6d0 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20  ortTail(pParse, 
1b6e0 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  p, v, pEList->nE
1b6f0 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72  xpr, eDest, iPar
1b700 6d 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  m);.  }..#ifndef
1b710 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1b720 51 55 45 52 59 0a 20 20 2f 2a 20 49 66 20 74 68  QUERY.  /* If th
1b730 69 73 20 77 61 73 20 61 20 73 75 62 71 75 65 72  is was a subquer
1b740 79 2c 20 77 65 20 68 61 76 65 20 6e 6f 77 20 63  y, we have now c
1b750 6f 6e 76 65 72 74 65 64 20 74 68 65 20 73 75 62  onverted the sub
1b760 71 75 65 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a  query into a.  *
1b770 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  * temporary tabl
1b780 65 2e 20 20 53 6f 20 73 65 74 20 74 68 65 20 53  e.  So set the S
1b790 72 63 4c 69 73 74 5f 69 74 65 6d 2e 69 73 50 6f  rcList_item.isPo
1b7a0 70 75 6c 61 74 65 64 20 66 6c 61 67 20 74 6f 20  pulated flag to 
1b7b0 70 72 65 76 65 6e 74 0a 20 20 2a 2a 20 74 68 69  prevent.  ** thi
1b7c0 73 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20  s subquery from 
1b7d0 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20  being evaluated 
1b7e0 61 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72  again and to for
1b7f0 63 65 20 74 68 65 20 75 73 65 20 6f 66 0a 20 20  ce the use of.  
1b800 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ** the temporary
1b810 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
1b820 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20  f( pParent ){.  
1b830 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
1b840 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61  t->pSrc->nSrc>pa
1b850 72 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61  rentTab );.    a
1b860 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1b870 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61  pSrc->a[parentTa
1b880 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b  b].pSelect==p );
1b890 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53  .    pParent->pS
1b8a0 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d  rc->a[parentTab]
1b8b0 2e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 31  .isPopulated = 1
1b8c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1b8d0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
1b8e0 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a  skip this query.
1b8f0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1b900 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1b910 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54  , iEnd);..  /* T
1b920 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75  he SELECT was su
1b930 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64  ccessfully coded
1b940 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75  .   Set the retu
1b950 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a  rn code to 0.  *
1b960 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f  * to indicate no
1b970 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20   errors..  */.  
1b980 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  rc = 0;..  /* Co
1b990 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68  ntrol jumps to h
1b9a0 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ere if an error 
1b9b0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  is encountered a
1b9c0 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20  bove, or upon.  
1b9d0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f  ** successful co
1b9e0 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45  ding of the SELE
1b9f0 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f  CT..  */.select_
1ba00 65 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  end:..  /* Ident
1ba10 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ify column names
1ba20 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75   if we will be u
1ba30 73 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63  sing them in a c
1ba40 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20  allback.  This. 
1ba50 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70   ** step is skip
1ba60 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75  ped if the outpu
1ba70 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f  t is going to so
1ba80 6d 65 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61  me other destina
1ba90 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tion..  */.  if(
1baa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1bab0 26 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  & eDest==SRT_Cal
1bac0 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e  lback ){.    gen
1bad0 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
1bae0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
1baf0 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t, pEList);.  }.
1bb00 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 73 41  .  sqliteFree(sA
1bb10 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20  ggInfo.aCol);.  
1bb20 73 71 6c 69 74 65 46 72 65 65 28 73 41 67 67 49  sqliteFree(sAggI
1bb30 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65  nfo.aFunc);.  re
1bb40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
1bb50 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1bb60 45 42 55 47 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a  EBUG)./*.*******
1bb70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bb80 2a 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 0a 2a 2a 20 54 68 65 20  ********.** The 
1bbc0 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 69  following code i
1bbd0 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
1bbe0 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
1bbf0 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 64 65   only.  The code
1bc00 0a 2a 2a 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  .** that follows
1bc10 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72   does not appear
1bc20 20 69 6e 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64   in normal build
1bc30 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  s..**.** These r
1bc40 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
1bc50 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 74 68   to print out th
1bc60 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6c 6c  e content of all
1bc70 20 6f 72 20 70 61 72 74 20 6f 66 20 61 20 0a 2a   or part of a .*
1bc80 2a 20 70 61 72 73 65 20 73 74 72 75 63 74 75 72  * parse structur
1bc90 65 73 20 73 75 63 68 20 61 73 20 53 65 6c 65 63  es such as Selec
1bca0 74 20 6f 72 20 45 78 70 72 2e 20 20 53 75 63 68  t or Expr.  Such
1bcb0 20 70 72 69 6e 74 6f 75 74 73 20 61 72 65 20 75   printouts are u
1bcc0 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c  seful.** for hel
1bcd0 70 69 6e 67 20 74 6f 20 75 6e 64 65 72 73 74 61  ping to understa
1bce0 6e 64 20 77 68 61 74 20 69 73 20 68 61 70 70 65  nd what is happe
1bcf0 6e 69 6e 67 20 69 6e 73 69 64 65 20 74 68 65 20  ning inside the 
1bd00 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a  code generator.*
1bd10 2a 20 64 75 72 69 6e 67 20 74 68 65 20 65 78 65  * during the exe
1bd20 63 75 74 69 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65  cution of comple
1bd30 78 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  x SELECT stateme
1bd40 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  nts..**.** These
1bd50 20 72 6f 75 74 69 6e 65 20 61 72 65 20 6e 6f 74   routine are not
1bd60 20 63 61 6c 6c 65 64 20 61 6e 79 77 68 65 72 65   called anywhere
1bd70 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
1bd80 20 6e 6f 72 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20   normal.** code 
1bd90 62 61 73 65 2e 20 20 54 68 65 6e 20 61 72 65 20  base.  Then are 
1bda0 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 63  intended to be c
1bdb0 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
1bdc0 6e 20 74 68 65 20 64 65 62 75 67 67 65 72 0a 2a  n the debugger.*
1bdd0 2a 20 6f 72 20 66 72 6f 6d 20 74 65 6d 70 6f 72  * or from tempor
1bde0 61 72 79 20 22 70 72 69 6e 74 66 22 20 73 74 61  ary "printf" sta
1bdf0 74 65 6d 65 6e 74 73 20 69 6e 73 65 72 74 65 64  tements inserted
1be00 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0a   for debugging..
1be10 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
1be20 72 69 6e 74 45 78 70 72 28 45 78 70 72 20 2a 70  rintExpr(Expr *p
1be30 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65  ){.  if( p->toke
1be40 6e 2e 7a 20 26 26 20 70 2d 3e 74 6f 6b 65 6e 2e  n.z && p->token.
1be50 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  n>0 ){.    sqlit
1be60 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28  e3DebugPrintf("(
1be70 25 2e 2a 73 22 2c 20 70 2d 3e 74 6f 6b 65 6e 2e  %.*s", p->token.
1be80 6e 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a  n, p->token.z);.
1be90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1bea0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1beb0 22 28 25 64 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20  "(%d", p->op);. 
1bec0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 65 66   }.  if( p->pLef
1bed0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
1bee0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 22 29  DebugPrintf(" ")
1bef0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
1bf00 6e 74 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 29  ntExpr(p->pLeft)
1bf10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
1bf20 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  Right ){.    sql
1bf30 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1bf40 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  " ");.    sqlite
1bf50 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 52  3PrintExpr(p->pR
1bf60 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ight);.  }.  sql
1bf70 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1bf80 22 29 22 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  ")");.}.void sql
1bf90 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
1bfa0 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  t(ExprList *pLis
1bfb0 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  t){.  int i;.  f
1bfc0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1bfd0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1bfe0 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
1bff0 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pr(pList->a[i].p
1c000 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 69  Expr);.    if( i
1c010 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20  <pList->nExpr-1 
1c020 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1c030 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c 20 22  DebugPrintf(", "
1c040 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76  );.    }.  }.}.v
1c050 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74  oid sqlite3Print
1c060 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70  Select(Select *p
1c070 2c 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20  , int indent){. 
1c080 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1c090 6e 74 66 28 22 25 2a 73 53 45 4c 45 43 54 28 25  ntf("%*sSELECT(%
1c0a0 70 29 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  p) ", indent, ""
1c0b0 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  , p);.  sqlite3P
1c0c0 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  rintExprList(p->
1c0d0 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  pEList);.  sqlit
1c0e0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
1c0f0 6e 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53  n");.  if( p->pS
1c100 72 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  rc ){.    char *
1c110 7a 50 72 65 66 69 78 3b 0a 20 20 20 20 69 6e 74  zPrefix;.    int
1c120 20 69 3b 0a 20 20 20 20 7a 50 72 65 66 69 78 20   i;.    zPrefix 
1c130 3d 20 22 46 52 4f 4d 22 3b 0a 20 20 20 20 66 6f  = "FROM";.    fo
1c140 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63  r(i=0; i<p->pSrc
1c150 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
1c160 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
1c170 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
1c180 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b   &p->pSrc->a[i];
1c190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
1c1a0 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 22  bugPrintf("%*s "
1c1b0 2c 20 69 6e 64 65 6e 74 2b 36 2c 20 7a 50 72 65  , indent+6, zPre
1c1c0 66 69 78 29 3b 0a 20 20 20 20 20 20 7a 50 72 65  fix);.      zPre
1c1d0 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  fix = "";.      
1c1e0 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
1c1f0 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
1c200 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1c210 28 22 28 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ("(\n");.       
1c220 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c   sqlite3PrintSel
1c230 65 63 74 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65  ect(pItem->pSele
1c240 63 74 2c 20 69 6e 64 65 6e 74 2b 31 30 29 3b 0a  ct, indent+10);.
1c250 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
1c260 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 29  ebugPrintf("%*s)
1c270 22 2c 20 69 6e 64 65 6e 74 2b 38 2c 20 22 22 29  ", indent+8, "")
1c280 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1c290 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29  ( pItem->zName )
1c2a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c2b0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 73  3DebugPrintf("%s
1c2c0 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  ", pItem->zName)
1c2d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c2e0 69 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20  if( pItem->pTab 
1c2f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1c300 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28  e3DebugPrintf("(
1c310 74 61 62 6c 65 3a 20 25 73 29 22 2c 20 70 49 74  table: %s)", pIt
1c320 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
1c330 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c340 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  if( pItem->zAlia
1c350 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  s ){.        sql
1c360 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1c370 22 20 41 53 20 25 73 22 2c 20 70 49 74 65 6d 2d  " AS %s", pItem-
1c380 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20  >zAlias);.      
1c390 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 70 2d  }.      if( i<p-
1c3a0 3e 70 53 72 63 2d 3e 6e 53 72 63 2d 31 20 29 7b  >pSrc->nSrc-1 ){
1c3b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c3c0 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c 22 29  DebugPrintf(",")
1c3d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c3e0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1c3f0 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a  tf("\n");.    }.
1c400 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68    }.  if( p->pWh
1c410 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ere ){.    sqlit
1c420 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
1c430 2a 73 20 57 48 45 52 45 20 22 2c 20 69 6e 64 65  *s WHERE ", inde
1c440 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c  nt, "");.    sql
1c450 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d  ite3PrintExpr(p-
1c460 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71  >pWhere);.    sq
1c470 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1c480 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66  ("\n");.  }.  if
1c490 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b  ( p->pGroupBy ){
1c4a0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
1c4b0 67 50 72 69 6e 74 66 28 22 25 2a 73 20 47 52 4f  gPrintf("%*s GRO
1c4c0 55 50 20 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c  UP BY ", indent,
1c4d0 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   "");.    sqlite
1c4e0 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70  3PrintExprList(p
1c4f0 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
1c500 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1c510 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ntf("\n");.  }. 
1c520 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20   if( p->pHaving 
1c530 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
1c540 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 48  bugPrintf("%*s H
1c550 41 56 49 4e 47 20 22 2c 20 69 6e 64 65 6e 74 2c  AVING ", indent,
1c560 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   "");.    sqlite
1c570 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 48  3PrintExpr(p->pH
1c580 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
1c590 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1c5a0 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  \n");.  }.  if( 
1c5b0 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
1c5c0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1c5d0 72 69 6e 74 66 28 22 25 2a 73 20 4f 52 44 45 52  rintf("%*s ORDER
1c5e0 20 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22   BY ", indent, "
1c5f0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ");.    sqlite3P
1c600 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  rintExprList(p->
1c610 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73  pOrderBy);.    s
1c620 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1c630 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f  f("\n");.  }.}./
1c640 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72  * End of the str
1c650 75 63 74 75 72 65 20 64 65 62 75 67 20 70 72 69  ucture debug pri
1c660 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a  nting code.*****
1c670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f 0a 23 65 6e 64 69 66  ********/.#endif
1c6c0 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
1c6d0 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
1c6e0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
1c6f0 29 20 2a 2f 0a                                   ) */.