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

Artifact 3f563bb096c5768ac99d4b762084e86d5b227230:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 33 34 35  select.c,v 1.345
0200: 20 32 30 30 37 2f 30 35 2f 31 34 20 31 31 3a 33   2007/05/14 11:3
0210: 34 3a 34 37 20 64 72 68 20 45 78 70 20 24 0a 2a  4:47 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 2f 2a 0a 2a 2a  ab, 0);.}../*.**
36c0: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72   Generate an err
36d0: 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20  or message when 
36e0: 61 20 53 45 4c 45 43 54 20 69 73 20 75 73 65 64  a SELECT is used
36f0: 20 77 69 74 68 69 6e 20 61 20 73 75 62 65 78 70   within a subexp
3700: 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d  ression.** (exam
3710: 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53 45 4c  ple:  "a IN (SEL
3720: 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65  ECT * FROM table
3730: 29 22 29 20 62 75 74 20 69 74 20 68 61 73 20 6d  )") but it has m
3740: 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73 75 6c  ore than 1 resul
3750: 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65  t.** column.  We
3760: 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75   do this in a su
3770: 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75 73 65  broutine because
3780: 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72   the error occur
3790: 73 20 69 6e 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  s in multiple.**
37a0: 20 70 6c 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74   places..*/.stat
37b0: 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 4d  ic int checkForM
37c0: 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74  ultiColumnSelect
37d0: 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61  Error(Parse *pPa
37e0: 72 73 65 2c 20 69 6e 74 20 65 44 65 73 74 2c 20  rse, int eDest, 
37f0: 69 6e 74 20 6e 45 78 70 72 29 7b 0a 20 20 69 66  int nExpr){.  if
3800: 28 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44  ( nExpr>1 && (eD
3810: 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20  est==SRT_Mem || 
3820: 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20  eDest==SRT_Set) 
3830: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
3840: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3850: 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65  only a single re
3860: 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72  sult allowed for
3870: 20 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c   ".       "a SEL
3880: 45 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74  ECT that is part
3890: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
38a0: 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n");.    return 
38b0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
38c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a  return 0;.  }.}.
38d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
38e0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
38f0: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69  e code for the i
3900: 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e  nside of the inn
3910: 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20  er loop.** of a 
3920: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  SELECT..**.** If
3930: 20 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c   srcTab and nCol
3940: 75 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72  umn are both zer
3950: 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69  o, then the pELi
3960: 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  st expressions.*
3970: 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  * are evaluated 
3980: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
3990: 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69  the data for thi
39a0: 73 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75  s row.  If nColu
39b0: 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74  mn>0.** then dat
39c0: 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d  a is pulled from
39d0: 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69   srcTab and pELi
39e0: 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  st is used only 
39f0: 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61  to get the.** da
3a00: 74 61 74 79 70 65 73 20 66 6f 72 20 65 61 63 68  tatypes for each
3a10: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74   column..*/.stat
3a20: 69 63 20 69 6e 74 20 73 65 6c 65 63 74 49 6e 6e  ic int selectInn
3a30: 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20  erLoop(.  Parse 
3a40: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
3a50: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
3a60: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
3a70: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
3a80: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
3a90: 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74  lete select stat
3aa0: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
3ab0: 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
3ac0: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
3ad0: 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  * List of values
3ae0: 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64   being extracted
3af0: 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62   */.  int srcTab
3b00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
3b10: 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20   Pull data from 
3b20: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
3b30: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
3b40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3b50: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
3b60: 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
3b70: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
3b80: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
3b90: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f   If not NULL, so
3ba0: 72 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67  rt results using
3bb0: 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69   this key */.  i
3bc0: 6e 74 20 64 69 73 74 69 6e 63 74 2c 20 20 20 20  nt distinct,    
3bd0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30         /* If >=0
3be0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65 73 75  , make sure resu
3bf0: 6c 74 73 20 61 72 65 20 64 69 73 74 69 6e 63 74  lts are distinct
3c00: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c   */.  int eDest,
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c20: 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20   How to dispose 
3c30: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a  of the results *
3c40: 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20  /.  int iParm,  
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
3c60: 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  n argument to th
3c70: 65 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f  e disposal metho
3c80: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  d */.  int iCont
3c90: 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f  inue,          /
3ca0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63  * Jump here to c
3cb0: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78  ontinue with nex
3cc0: 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  t row */.  int i
3cd0: 42 72 65 61 6b 2c 20 20 20 20 20 20 20 20 20 20  Break,          
3ce0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
3cf0: 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
3d00: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a  the inner loop *
3d10: 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20  /.  char *aff   
3d20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
3d30: 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 69  ffinity string i
3d40: 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55  f eDest is SRT_U
3d50: 6e 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  nion */.){.  Vdb
3d60: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
3d70: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
3d80: 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74   int hasDistinct
3d90: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
3da0: 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
3db0: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
3dc0: 65 6e 74 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d  ent */..  if( v=
3dd0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3de0: 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
3df0: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  =0 );..  /* If t
3e00: 68 65 72 65 20 77 61 73 20 61 20 4c 49 4d 49 54  here was a LIMIT
3e10: 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 53   clause on the S
3e20: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
3e30: 20 74 68 65 6e 20 64 6f 20 74 68 65 20 63 68 65   then do the che
3e40: 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69  ck.  ** to see i
3e50: 66 20 74 68 69 73 20 72 6f 77 20 73 68 6f 75 6c  f this row shoul
3e60: 64 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  d be output..  *
3e70: 2f 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20  /.  hasDistinct 
3e80: 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30 20 26 26  = distinct>=0 &&
3e90: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30   pEList->nExpr>0
3ea0: 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
3eb0: 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74 69  ==0 && !hasDisti
3ec0: 6e 63 74 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f  nct ){.    codeO
3ed0: 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e  ffset(v, p, iCon
3ee0: 74 69 6e 75 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a  tinue, 0);.  }..
3ef0: 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65    /* Pull the re
3f00: 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e  quested columns.
3f10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43 6f 6c  .  */.  if( nCol
3f20: 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72  umn>0 ){.    for
3f30: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
3f40: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
3f50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3f60: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54   OP_Column, srcT
3f70: 61 62 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  ab, i);.    }.  
3f80: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 75  }else{.    nColu
3f90: 6d 6e 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  mn = pEList->nEx
3fa0: 70 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  pr;.    sqlite3E
3fb0: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
3fc0: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 29 3b  pParse, pEList);
3fd0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
3fe0: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
3ff0: 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f  rd was present o
4000: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
4010: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20  tement.  ** and 
4020: 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65  this row has bee
4030: 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74  n seen before, t
4040: 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20  hen do not make 
4050: 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61  this row.  ** pa
4060: 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
4070: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73  ..  */.  if( has
4080: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
4090: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
40a0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
40b0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
40c0: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 63  nColumn );.    c
40d0: 6f 64 65 44 69 73 74 69 6e 63 74 28 76 2c 20 64  odeDistinct(v, d
40e0: 69 73 74 69 6e 63 74 2c 20 69 43 6f 6e 74 69 6e  istinct, iContin
40f0: 75 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ue, nColumn);.  
4100: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
4110: 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f  0 ){.      codeO
4120: 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e  ffset(v, p, iCon
4130: 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  tinue, nColumn);
4140: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
4150: 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  ( checkForMultiC
4160: 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
4170: 28 70 50 61 72 73 65 2c 20 65 44 65 73 74 2c 20  (pParse, eDest, 
4180: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
4190: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
41a0: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65    }..  switch( e
41b0: 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Dest ){.    /* I
41c0: 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69  n this mode, wri
41d0: 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65  te each query re
41e0: 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20  sult to the key 
41f0: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
4200: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50  .    ** table iP
4210: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  arm..    */.#ifn
4220: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4230: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
4240: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
4250: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  on: {.      sqli
4260: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4270: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e  OP_MakeRecord, n
4280: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
4290: 20 20 69 66 28 20 61 66 66 20 29 7b 0a 20 20 20    if( aff ){.   
42a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
42b0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
42c0: 61 66 66 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  aff, P3_STATIC);
42d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
42e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
42f0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
4300: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
4310: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
4320: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
4330: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
4340: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
4350: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
4360: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
4370: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
4380: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
4390: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
43a0: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
43b0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
43c0: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
43d0: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
43e0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
43f0: 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  r;.      addr = 
4400: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4410: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
4420: 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  d, nColumn, 0);.
4430: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4440: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
4450: 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49 43 29   aff, P3_STATIC)
4460: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4470: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
4480: 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20  otFound, iParm, 
4490: 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73  addr+3);.      s
44a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
44b0: 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50  v, OP_Delete, iP
44c0: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  arm, 0);.      b
44d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
44e0: 69 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65  if..    /* Store
44f0: 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
4500: 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
4510: 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
4520: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
4530: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
4540: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
4550: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4560: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
4570: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  ord, nColumn, 0)
4580: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
4590: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
45a0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
45b0: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
45c0: 20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   p);.      }else
45d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
45e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
45f0: 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d  _NewRowid, iParm
4600: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
4610: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4620: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
4630: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4640: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4650: 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
4660: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
4670: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
4680: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
4690: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
46a0: 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
46b0: 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
46c0: 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
46d0: 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
46e0: 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
46f0: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
4700: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
4710: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
4720: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
4730: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
4740: 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
4750: 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
4760: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
4770: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
4780: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31  .      int addr1
4790: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
47a0: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
47b0: 20 20 20 20 69 6e 74 20 61 64 64 72 32 3b 0a 0a      int addr2;..
47c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
47d0: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
47e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
47f0: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  Op(v, OP_NotNull
4800: 2c 20 2d 31 2c 20 61 64 64 72 31 2b 33 29 3b 0a  , -1, addr1+3);.
4810: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4820: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
4830: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  , 1, 0);.      a
4840: 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
4850: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
4860: 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  to, 0, 0);.     
4870: 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73   p->affinity = s
4880: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
4890: 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b  inity(pEList->a[
48a0: 30 5d 2e 70 45 78 70 72 2c 28 69 50 61 72 6d 3e  0].pExpr,(iParm>
48b0: 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20 20 20  >16)&0xff);.    
48c0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
48d0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
48e0: 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75  first glance you
48f0: 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20   would think we 
4900: 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f  could optimize o
4910: 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ut the.        *
4920: 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68  * ORDER BY in th
4930: 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74 68  is case since th
4940: 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69  e order of entri
4950: 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20  es in the set.  
4960: 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f        ** does no
4970: 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74  t matter.  But t
4980: 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61 20  here might be a 
4990: 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e  LIMIT clause, in
49a0: 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a   which.        *
49b0: 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65 72  * case the order
49c0: 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a   does matter */.
49d0: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
49e0: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
49f0: 4f 72 64 65 72 42 79 2c 20 70 29 3b 0a 20 20 20  OrderBy, p);.   
4a00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4a10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
4a20: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
4a30: 64 2c 20 31 2c 20 30 2c 20 26 70 2d 3e 61 66 66  d, 1, 0, &p->aff
4a40: 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20  inity, 1);.     
4a50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4a60: 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  dOp(v, OP_IdxIns
4a70: 65 72 74 2c 20 28 69 50 61 72 6d 26 30 78 30 30  ert, (iParm&0x00
4a80: 30 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20 20  00FFFF), 0);.   
4a90: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
4aa0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
4ab0: 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 20 20  , addr2);.      
4ac0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
4ad0: 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
4ae0: 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
4af0: 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
4b00: 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
4b10: 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
4b20: 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
4b30: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
4b40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4b50: 4d 65 6d 49 6e 74 2c 20 31 2c 20 69 50 61 72 6d  MemInt, 1, iParm
4b60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4b70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4b80: 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  Pop, nColumn, 0)
4b90: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
4ba0: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
4bb0: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
4bc0: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
4bd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4be0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
4bf0: 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
4c00: 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
4c10: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
4c20: 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
4c30: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
4c40: 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
4c50: 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
4c60: 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
4c70: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
4c80: 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
4c90: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
4ca0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
4cb0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
4cc0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
4cd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
4ce0: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
4cf0: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 29 3b  e, pOrderBy, p);
4d00: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4d10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4d20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
4d30: 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29  Store, iParm, 1)
4d40: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
4d50: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
4d60: 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
4d70: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
4d80: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
4d90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
4da0: 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
4db0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
4dc0: 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ERY */..    /* S
4dd0: 65 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f 20  end the data to 
4de0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  the callback fun
4df0: 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75  ction or to a su
4e00: 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74 68  broutine.  In th
4e10: 65 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 6f 66  e.    ** case of
4e20: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2c 20 74   a subroutine, t
4e30: 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74  he subroutine it
4e40: 73 65 6c 66 20 69 73 20 72 65 73 70 6f 6e 73 69  self is responsi
4e50: 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70  ble for.    ** p
4e60: 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 20  opping the data 
4e70: 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a  from the stack..
4e80: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
4e90: 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 0a  SRT_Subroutine:.
4ea0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c      case SRT_Cal
4eb0: 6c 62 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20 69  lback: {.      i
4ec0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
4ed0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4ee0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
4ef0: 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d  keRecord, nColum
4f00: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  n, 0);.        p
4f10: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
4f20: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
4f30: 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  p);.      }else 
4f40: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  if( eDest==SRT_S
4f50: 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  ubroutine ){.   
4f60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4f70: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75  AddOp(v, OP_Gosu
4f80: 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20  b, 0, iParm);.  
4f90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4fa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4fb0: 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61  dOp(v, OP_Callba
4fc0: 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  ck, nColumn, 0);
4fd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
4fe0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
4ff0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
5000: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20  _OMIT_TRIGGER). 
5010: 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
5020: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73  e results.  This
5030: 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c   is used for SEL
5040: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
5050: 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  nside.    ** the
5060: 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47   body of a TRIGG
5070: 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65  ER.  The purpose
5080: 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73   of such selects
5090: 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20   is to call.    
50a0: 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ** user-defined 
50b0: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68  functions that h
50c0: 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73  ave side effects
50d0: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72  .  We do not car
50e0: 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74  e.    ** about t
50f0: 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74  he actual result
5100: 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  s of the select.
5110: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
5120: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
5130: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
5140: 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20  Discard );.     
5150: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5160: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f  p(v, OP_Pop, nCo
5170: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
5180: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
5190: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  dif.  }..  /* Ju
51a0: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
51b0: 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
51c0: 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
51d0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
51e0: 3e 69 4c 69 6d 69 74 3e 3d 30 20 26 26 20 70 4f  >iLimit>=0 && pO
51f0: 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
5200: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5210: 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c  p(v, OP_MemIncr,
5220: 20 2d 31 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b   -1, p->iLimit);
5230: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5240: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65  AddOp(v, OP_IfMe
5250: 6d 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  mZero, p->iLimit
5260: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 20  , iBreak);.  }. 
5270: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
5280: 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70  .** Given an exp
5290: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65  ression list, ge
52a0: 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f  nerate a KeyInfo
52b0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
52c0: 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63  records.** the c
52d0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
52e0: 65 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65  e for each expre
52f0: 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78  ssion in that ex
5300: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
5310: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72  *.** If the Expr
5320: 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52  List is an ORDER
5330: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
5340: 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20  clause then the 
5350: 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79  resulting.** Key
5360: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
5370: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
5380: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
5390: 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
53a0: 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74  o.** implement t
53b0: 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20  hat clause.  If 
53c0: 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20  the ExprList is 
53d0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
53e0: 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68  f a SELECT.** th
53f0: 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  en the KeyInfo s
5400: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72  tructure is appr
5410: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74  opriate for init
5420: 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75  ializing a virtu
5430: 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69  al.** index to i
5440: 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49  mplement a DISTI
5450: 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20  NCT test..**.** 
5460: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
5470: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
5480: 75 72 65 20 69 73 20 6f 62 74 61 69 6e 20 66 72  ure is obtain fr
5490: 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20  om malloc.  The 
54a0: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
54b0: 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ion is responsib
54c0: 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68  le for seeing th
54d0: 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72  at this structur
54e0: 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a  e is eventually.
54f0: 2a 2a 20 66 72 65 65 64 2e 20 20 41 64 64 20 74  ** freed.  Add t
5500: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
5510: 74 75 72 65 20 74 6f 20 74 68 65 20 50 33 20 66  ture to the P3 f
5520: 69 65 6c 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64  ield of an opcod
5530: 65 20 75 73 69 6e 67 0a 2a 2a 20 50 33 5f 4b 45  e using.** P3_KE
5540: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73  YINFO_HANDOFF is
5550: 20 74 68 65 20 75 73 75 61 6c 20 77 61 79 20 6f   the usual way o
5560: 66 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 74  f dealing with t
5570: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b  his..*/.static K
5580: 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46  eyInfo *keyInfoF
5590: 72 6f 6d 45 78 70 72 4c 69 73 74 28 50 61 72 73  romExprList(Pars
55a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c  e *pParse, ExprL
55b0: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73  ist *pList){.  s
55c0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
55d0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  rse->db;.  int n
55e0: 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Expr;.  KeyInfo 
55f0: 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  *pInfo;.  struct
5600: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
5610: 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
5620: 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74  .  nExpr = pList
5630: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f  ->nExpr;.  pInfo
5640: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
5650: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20   sizeof(*pInfo) 
5660: 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28  + nExpr*(sizeof(
5670: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a  CollSeq*)+1) );.
5680: 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20    if( pInfo ){. 
5690: 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f     pInfo->aSortO
56a0: 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49 6e  rder = (u8*)&pIn
56b0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d  fo->aColl[nExpr]
56c0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69  ;.    pInfo->nFi
56d0: 65 6c 64 20 3d 20 6e 45 78 70 72 3b 0a 20 20 20  eld = nExpr;.   
56e0: 20 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e   pInfo->enc = EN
56f0: 43 28 64 62 29 3b 0a 20 20 20 20 66 6f 72 28 69  C(db);.    for(i
5700: 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
5710: 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  >a; i<nExpr; i++
5720: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
5730: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
5740: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ;.      pColl = 
5750: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
5760: 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
5770: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
5780: 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
5790: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62        pColl = db
57a0: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
57b0: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f     }.      pInfo
57c0: 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f  ->aColl[i] = pCo
57d0: 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  ll;.      pInfo-
57e0: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
57f0: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
5800: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
5810: 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a  eturn pInfo;.}..
5820: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
5830: 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e  ner loop was gen
5840: 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e  erated using a n
5850: 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79  on-null pOrderBy
5860: 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68   argument,.** th
5870: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77  en the results w
5880: 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20  ere placed in a 
5890: 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74  sorter.  After t
58a0: 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69  he loop is termi
58b0: 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64  nated.** we need
58c0: 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74   to run the sort
58d0: 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  er and output th
58e0: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20  e results.  The 
58f0: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75  following.** rou
5900: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
5910: 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74  he code needed t
5920: 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74  o do that..*/.st
5930: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
5940: 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61  teSortTail(.  Pa
5950: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
5960: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
5970: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
5980: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53  ,       /* The S
5990: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
59a0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  */.  Vdbe *v,   
59b0: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
59c0: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
59d0: 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e   VDBE */.  int n
59e0: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 4e  Column,     /* N
59f0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
5a00: 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e   of data */.  in
5a10: 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 2f  t eDest,       /
5a20: 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72 74  * Write the sort
5a30: 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ed results here 
5a40: 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 20  */.  int iParm  
5a50: 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61        /* Optiona
5a60: 6c 20 70 61 72 61 6d 65 74 65 72 20 61 73 73 6f  l parameter asso
5a70: 63 69 61 74 65 64 20 77 69 74 68 20 65 44 65 73  ciated with eDes
5a80: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 72  t */.){.  int br
5a90: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
5aa0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69  akeLabel(v);.  i
5ab0: 6e 74 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65  nt cont = sqlite
5ac0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
5ad0: 29 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  );.  int addr;. 
5ae0: 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e 74   int iTab;.  int
5af0: 20 70 73 65 75 64 6f 54 61 62 20 3d 20 30 3b 0a   pseudoTab = 0;.
5b00: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
5b10: 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
5b20: 42 79 3b 0a 0a 20 20 69 54 61 62 20 3d 20 70 4f  By;..  iTab = pO
5b30: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
5b40: 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  ;.  if( eDest==S
5b50: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c 20 65  RT_Callback || e
5b60: 44 65 73 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75  Dest==SRT_Subrou
5b70: 74 69 6e 65 20 29 7b 0a 20 20 20 20 70 73 65 75  tine ){.    pseu
5b80: 64 6f 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  doTab = pParse->
5b90: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  nTab++;.    sqli
5ba0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5bb0: 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70  OP_OpenPseudo, p
5bc0: 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20  seudoTab, 0);.  
5bd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5be0: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  Op(v, OP_SetNumC
5bf0: 6f 6c 75 6d 6e 73 2c 20 70 73 65 75 64 6f 54 61  olumns, pseudoTa
5c00: 62 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 7d  b, nColumn);.  }
5c10: 0a 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71  .  addr = 1 + 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 53 6f 72 74 2c 20 69 54 61 62 2c  , OP_Sort, iTab,
5c40: 20 62 72 6b 29 3b 0a 20 20 63 6f 64 65 4f 66 66   brk);.  codeOff
5c50: 73 65 74 28 76 2c 20 70 2c 20 63 6f 6e 74 2c 20  set(v, p, cont, 
5c60: 30 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  0);.  if( eDest=
5c70: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c  =SRT_Callback ||
5c80: 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75 62 72   eDest==SRT_Subr
5c90: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 73 71  outine ){.    sq
5ca0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5cb0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
5cc0: 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
5cd0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5ce0: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20  P_Column, iTab, 
5cf0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
5d00: 2b 20 31 29 3b 0a 20 20 73 77 69 74 63 68 28 20  + 1);.  switch( 
5d10: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73  eDest ){.    cas
5d20: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
5d30: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
5d40: 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ab: {.      sqli
5d50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5d60: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
5d70: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  rm, 0);.      sq
5d80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5d90: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
5da0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5db0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
5dc0: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 4f 50  nsert, iParm, OP
5dd0: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
5de0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5df0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5e00: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
5e10: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
5e20: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
5e30: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
5e40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5e50: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  ddOp(v, OP_NotNu
5e60: 6c 6c 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 56  ll, -1, sqlite3V
5e70: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
5e80: 29 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  )+3);.      sqli
5e90: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5ea0: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
5eb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5ec0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
5ed0: 2c 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65  , 0, sqlite3Vdbe
5ee0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33  CurrentAddr(v)+3
5ef0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5f00: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  VdbeOp3(v, OP_Ma
5f10: 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20  keRecord, 1, 0, 
5f20: 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29  &p->affinity, 1)
5f30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5f40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
5f50: 64 78 49 6e 73 65 72 74 2c 20 28 69 50 61 72 6d  dxInsert, (iParm
5f60: 26 30 78 30 30 30 30 46 46 46 46 29 2c 20 30 29  &0x0000FFFF), 0)
5f70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5f80: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52     }.    case SR
5f90: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
5fa0: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
5fb0: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
5fc0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5fd0: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72  P_MemStore, iPar
5fe0: 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20  m, 1);.      /* 
5ff0: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
6000: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
6010: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
6020: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
6030: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
6040: 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61   case SRT_Callba
6050: 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ck:.    case SRT
6060: 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20  _Subroutine: {. 
6070: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
6080: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6090: 4f 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  Op(v, OP_Insert,
60a0: 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a   pseudoTab, 0);.
60b0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
60c0: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
60d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
60e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
60f0: 6f 6c 75 6d 6e 2c 20 70 73 65 75 64 6f 54 61 62  olumn, pseudoTab
6100: 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
6110: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
6120: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
6130: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6140: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61  beAddOp(v, OP_Ca
6150: 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c  llback, nColumn,
6160: 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
6170: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6180: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
6190: 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d  _Gosub, 0, iParm
61a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
61b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
61c0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
61d0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
61e0: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
61f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
6200: 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   Jump to the end
6210: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 68 65   of the loop whe
6220: 6e 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  n the LIMIT is r
6230: 65 61 63 68 65 64 0a 20 20 2a 2f 0a 20 20 69 66  eached.  */.  if
6240: 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29  ( p->iLimit>=0 )
6250: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
6260: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
6270: 49 6e 63 72 2c 20 2d 31 2c 20 70 2d 3e 69 4c 69  Incr, -1, p->iLi
6280: 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mit);.    sqlite
6290: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
62a0: 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69  _IfMemZero, p->i
62b0: 4c 69 6d 69 74 2c 20 62 72 6b 29 3b 0a 20 20 7d  Limit, brk);.  }
62c0: 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f  ..  /* The botto
62d0: 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  m of the loop.  
62e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
62f0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
6300: 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  cont);.  sqlite3
6310: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6320: 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
6330: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
6340: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
6350: 62 72 6b 29 3b 0a 20 20 69 66 28 20 65 44 65 73  brk);.  if( eDes
6360: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
6370: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75  || eDest==SRT_Su
6380: 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  broutine ){.    
6390: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
63a0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 73  (v, OP_Close, ps
63b0: 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20 7d  eudoTab, 0);.  }
63c0: 0a 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ..}../*.** Retur
63d0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
63e0: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
63f0: 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74  ng the 'declarat
6400: 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65  ion type' of the
6410: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
6420: 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67  Expr. The string
6430: 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20   may be treated 
6440: 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65  as static by the
6450: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   caller..**.** T
6460: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
6470: 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74  ype is the exact
6480: 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69   datatype defini
6490: 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66  tion extracted f
64a0: 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69  rom the.** origi
64b0: 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45  nal CREATE TABLE
64c0: 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68   statement if th
64d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
64e0: 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a  a column. The.**
64f0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
6500: 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69  e for a ROWID fi
6510: 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20  eld is INTEGER. 
6520: 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20  Exactly when an 
6530: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
6540: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f   considered a co
6550: 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70  lumn can be comp
6560: 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65 73 65  lex in the prese
6570: 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72 69 65  nce of subquerie
6580: 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74  s. The.** result
6590: 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20  -set expression 
65a0: 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  in all of the fo
65b0: 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73  llowing SELECT s
65c0: 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a  tatements is .**
65d0: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f   considered a co
65e0: 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e  lumn by this fun
65f0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53  ction..**.**   S
6600: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
6610: 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  bl;.**   SELECT 
6620: 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d  (SELECT col FROM
6630: 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43   tbl;.**   SELEC
6640: 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52  T (SELECT col FR
6650: 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45  OM tbl);.**   SE
6660: 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53  LECT abc FROM (S
6670: 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63  ELECT col AS abc
6680: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a   FROM tbl);.** .
6690: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
66a0: 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20  on type for any 
66b0: 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72  expression other
66c0: 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69   than a column i
66d0: 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  s NULL..*/.stati
66e0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  c const char *co
66f0: 6c 75 6d 6e 54 79 70 65 28 0a 20 20 4e 61 6d 65  lumnType(.  Name
6700: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20  Context *pNC, . 
6710: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20   Expr *pExpr,.  
6720: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
6730: 72 69 67 69 6e 44 62 2c 0a 20 20 63 6f 6e 73 74  riginDb,.  const
6740: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e   char **pzOrigin
6750: 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Tab,.  const cha
6760: 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 0a  r **pzOriginCol.
6770: 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ){.  char const 
6780: 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68  *zType = 0;.  ch
6790: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69  ar const *zOrigi
67a0: 6e 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  nDb = 0;.  char 
67b0: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 54 61  const *zOriginTa
67c0: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  b = 0;.  char co
67d0: 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 43 6f 6c 20  nst *zOriginCol 
67e0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  = 0;.  int j;.  
67f0: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20  if( pExpr==0 || 
6800: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30  pNC->pSrcList==0
6810: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
6820: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
6830: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
6840: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
6850: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
6860: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
6870: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
6880: 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74  column. Locate t
6890: 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c  he table the col
68a0: 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20  umn is being.   
68b0: 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20     ** extracted 
68c0: 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74  from in NameCont
68d0: 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68  ext.pSrcList. Th
68e0: 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20  is table may be 
68f0: 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61  real.      ** da
6900: 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20  tabase table or 
6910: 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  a subquery..    
6920: 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
6930: 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
6940: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
6950: 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e  structure column
6960: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
6970: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65  om */.      Sele
6980: 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20  ct *pS = 0;     
6990: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
69a0: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  t the column is 
69b0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a  extracted from *
69c0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  /.      int iCol
69d0: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
69e0: 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20  n;  /* Index of 
69f0: 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a  column in pTab *
6a00: 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  /.      while( p
6a10: 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20  NC && !pTab ){. 
6a20: 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a         SrcList *
6a30: 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pTabList = pNC->
6a40: 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20  pSrcList;.      
6a50: 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62    for(j=0;j<pTab
6a60: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
6a70: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
6a80: 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61  rsor!=pExpr->iTa
6a90: 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20  ble;j++);.      
6aa0: 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74    if( j<pTabList
6ab0: 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ->nSrc ){.      
6ac0: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
6ad0: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
6ae0: 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70            pS = p
6af0: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53  TabList->a[j].pS
6b00: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d  elect;.        }
6b10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6b20: 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74  pNC = pNC->pNext
6b30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6b40: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
6b50: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
6b60: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 0a 20 20 20    /* FIX ME:.   
6b70: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 6e       ** This can
6b80: 20 6f 63 63 75 72 73 20 69 66 20 79 6f 75 20 68   occurs if you h
6b90: 61 76 65 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69  ave something li
6ba0: 6b 65 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78  ke "SELECT new.x
6bb0: 3b 22 20 69 6e 73 69 64 65 0a 20 20 20 20 20 20  ;" inside.      
6bc0: 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2e 20    ** a trigger. 
6bd0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
6be0: 20 69 66 20 79 6f 75 20 72 65 66 65 72 65 6e 63   if you referenc
6bf0: 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 22 6e  e the special "n
6c00: 65 77 22 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ew".        ** t
6c10: 61 62 6c 65 20 69 6e 20 74 68 65 20 72 65 73 75  able in the resu
6c20: 6c 74 20 73 65 74 20 6f 66 20 61 20 73 65 6c 65  lt set of a sele
6c30: 63 74 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 68  ct.  We do not h
6c40: 61 76 65 20 61 20 67 6f 6f 64 20 77 61 79 0a 20  ave a good way. 
6c50: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 66 69 6e         ** to fin
6c60: 64 20 74 68 65 20 61 63 74 75 61 6c 20 74 61 62  d the actual tab
6c70: 6c 65 20 74 79 70 65 2c 20 73 6f 20 63 61 6c 6c  le type, so call
6c80: 20 69 74 20 22 54 45 58 54 22 2e 20 20 54 68 69   it "TEXT".  Thi
6c90: 73 20 69 73 20 72 65 61 6c 6c 79 0a 20 20 20 20  s is really.    
6ca0: 20 20 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67      ** something
6cb0: 20 6f 66 20 61 20 62 75 67 2c 20 62 75 74 20 49   of a bug, but I
6cc0: 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77   do not know how
6cd0: 20 74 6f 20 66 69 78 20 69 74 2e 0a 20 20 20 20   to fix it..    
6ce0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
6cf0: 2a 20 54 68 69 73 20 63 6f 64 65 20 64 6f 65 73  * This code does
6d00: 20 6e 6f 74 20 70 72 6f 64 75 63 65 20 74 68 65   not produce the
6d10: 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   correct answer 
6d20: 2d 20 69 74 20 6a 75 73 74 20 70 72 65 76 65 6e  - it just preven
6d30: 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ts.        ** a 
6d40: 73 65 67 66 61 75 6c 74 2e 20 20 53 65 65 20 74  segfault.  See t
6d50: 69 63 6b 65 74 20 23 31 32 32 39 2e 0a 20 20 20  icket #1229..   
6d60: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
6d70: 7a 54 79 70 65 20 3d 20 22 54 45 58 54 22 3b 0a  zType = "TEXT";.
6d80: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6d90: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
6da0: 73 65 72 74 28 20 70 54 61 62 20 29 3b 0a 20 20  sert( pTab );.  
6db0: 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20      if( pS ){.  
6dc0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61        /* The "ta
6dd0: 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79  ble" is actually
6de0: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72   a sub-select or
6df0: 20 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46   a view in the F
6e00: 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20  ROM clause.     
6e10: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c     ** of the SEL
6e20: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52  ECT statement. R
6e30: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
6e40: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f  ation type and o
6e50: 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  rigin.        **
6e60: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65   data for the re
6e70: 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20  sult-set column 
6e80: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
6e90: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
6ea0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
6eb0: 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45  0 && iCol<pS->pE
6ec0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
6ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69           /* If i
6ee0: 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  Col is less than
6ef0: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
6f00: 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65  expression reque
6f10: 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  sts the.        
6f20: 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68    ** rowid of th
6f30: 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  e sub-select or 
6f40: 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65  view. This expre
6f50: 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28  ssion is legal (
6f60: 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  see .          *
6f70: 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63  * test case misc
6f80: 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61  2.2.2) - it alwa
6f90: 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  ys evaluates to 
6fa0: 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20  NULL..          
6fb0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d  */.          Nam
6fc0: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
6fd0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20          Expr *p 
6fe0: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
6ff0: 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20  iCol].pExpr;.   
7000: 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c         sNC.pSrcL
7010: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
7020: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e            sNC.pN
7030: 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
7040: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
7050: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
7060: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63         zType = c
7070: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
7080: 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26  p, &zOriginDb, &
7090: 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72  zOriginTab, &zOr
70a0: 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20  iginCol); .     
70b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
70c0: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 63 68 65   if( pTab->pSche
70d0: 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ma ){.        /*
70e0: 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f   A real table */
70f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7100: 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20   !pS );.        
7110: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
7120: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
7130: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7140: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
7150: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
7160: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
7170: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
7180: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
7190: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
71a0: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69            zOrigi
71b0: 6e 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  nCol = "rowid";.
71c0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
71d0: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
71e0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
71f0: 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20  ].zType;.       
7200: 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20     zOriginCol = 
7210: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
7220: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
7230: 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69  }.        zOrigi
7240: 6e 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  nTab = pTab->zNa
7250: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
7260: 70 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20  pNC->pParse ){. 
7270: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62           int iDb
7280: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
7290: 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61  ToIndex(pNC->pPa
72a0: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
72b0: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
72c0: 20 20 20 7a 4f 72 69 67 69 6e 44 62 20 3d 20 70     zOriginDb = p
72d0: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e  NC->pParse->db->
72e0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
72f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7300: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
7310: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
7320: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
7330: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  Y.    case TK_SE
7340: 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LECT: {.      /*
7350: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
7360: 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e  is a sub-select.
7370: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
7380: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
7390: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e  .      ** origin
73a0: 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69   info for the si
73b0: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ngle column in t
73c0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
73d0: 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
73e0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a    ** statement..
73f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e        */.      N
7400: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
7410: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
7420: 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63   = pExpr->pSelec
7430: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
7440: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
7450: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
7460: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
7470: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
7480: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
7490: 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73  .      sNC.pPars
74a0: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
74b0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63  .      zType = c
74c0: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
74d0: 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26  p, &zOriginDb, &
74e0: 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72  zOriginTab, &zOr
74f0: 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20  iginCol); .     
7500: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
7510: 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 69 66  ndif.  }.  .  if
7520: 28 20 70 7a 4f 72 69 67 69 6e 44 62 20 29 7b 0a  ( pzOriginDb ){.
7530: 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72      assert( pzOr
7540: 69 67 69 6e 54 61 62 20 26 26 20 70 7a 4f 72 69  iginTab && pzOri
7550: 67 69 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70  ginCol );.    *p
7560: 7a 4f 72 69 67 69 6e 44 62 20 3d 20 7a 4f 72 69  zOriginDb = zOri
7570: 67 69 6e 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  ginDb;.    *pzOr
7580: 69 67 69 6e 54 61 62 20 3d 20 7a 4f 72 69 67 69  iginTab = zOrigi
7590: 6e 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  nTab;.    *pzOri
75a0: 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69 67 69 6e  ginCol = zOrigin
75b0: 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Col;.  }.  retur
75c0: 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zType;.}../*.*
75d0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
75e0: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
75f0: 68 65 20 56 44 42 45 20 74 68 65 20 64 65 63 6c  he VDBE the decl
7600: 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66  aration types of
7610: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
7620: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a  he result set..*
7630: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
7640: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
7650: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
7660: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
7670: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
7680: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
7690: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  t,  /* List of t
76a0: 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  ables */.  ExprL
76b0: 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
76c0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65  * Expressions de
76d0: 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  fining the resul
76e0: 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  t set */.){.  Vd
76f0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
7700: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
7710: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
7720: 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  C;.  sNC.pSrcLis
7730: 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
7740: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
7750: 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  rse;.  for(i=0; 
7760: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
7770: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
7780: 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  *p = pEList->a[i
7790: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e  ].pExpr;.    con
77a0: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62  st char *zOrigDb
77b0: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
77c0: 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d  char *zOrigTab =
77d0: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
77e0: 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  ar *zOrigCol = 0
77f0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
7800: 20 2a 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e   *zType = column
7810: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a  Type(&sNC, p, &z
7820: 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61  OrigDb, &zOrigTa
7830: 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a  b, &zOrigCol);..
7840: 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20      /* The vdbe 
7850: 6d 75 73 74 20 6d 61 6b 65 20 69 74 27 73 20 6f  must make it's o
7860: 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  wn copy of the c
7870: 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f  olumn-type and o
7880: 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c  ther .    ** col
7890: 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74 72  umn specific str
78a0: 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68  ings, in case th
78b0: 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73 65  e schema is rese
78c0: 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20  t before this.  
78d0: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63    ** virtual mac
78e0: 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e  hine is deleted.
78f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
7900: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
7910: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
7920: 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c  DECLTYPE, zType,
7930: 20 50 33 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a   P3_TRANSIENT);.
7940: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
7950: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
7960: 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45  COLNAME_DATABASE
7970: 2c 20 7a 4f 72 69 67 44 62 2c 20 50 33 5f 54 52  , zOrigDb, P3_TR
7980: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
7990: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
79a0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
79b0: 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61  E_TABLE, zOrigTa
79c0: 62 2c 20 50 33 5f 54 52 41 4e 53 49 45 4e 54 29  b, P3_TRANSIENT)
79d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
79e0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
79f0: 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e  , COLNAME_COLUMN
7a00: 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 50 33 5f 54  , zOrigCol, P3_T
7a10: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d  RANSIENT);.  }.}
7a20: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
7a30: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
7a40: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
7a50: 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d  e names of colum
7a60: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
7a70: 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69  ult set.  This i
7a80: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
7a90: 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  ed to provide th
7aa0: 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c  e.** azCol[] val
7ab0: 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62  ues in the callb
7ac0: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
7ad0: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
7ae0: 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65  mnNames(.  Parse
7af0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
7b00: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
7b10: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
7b20: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
7b30: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
7b40: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
7b50: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
7b60: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
7b70: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
7b80: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
7b90: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
7ba0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74  nt i, j;.  sqlit
7bb0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
7bc0: 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
7bd0: 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73  ames, shortNames
7be0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
7bf0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
7c00: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
7c10: 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20  n EXPLAIN, skip 
7c20: 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69  this step */.  i
7c30: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
7c40: 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  in ){.    return
7c50: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
7c60: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
7c70: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
7c80: 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d 3d  lNamesSet || v==
7c90: 30 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c  0 || sqlite3Mall
7ca0: 6f 63 46 61 69 6c 65 64 28 29 20 29 20 72 65 74  ocFailed() ) ret
7cb0: 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  urn;.  pParse->c
7cc0: 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a  olNamesSet = 1;.
7cd0: 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64    fullNames = (d
7ce0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
7cf0: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
7d00: 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73  =0;.  shortNames
7d10: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
7d20: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
7d30: 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69  ames)!=0;.  sqli
7d40: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
7d50: 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  s(v, pEList->nEx
7d60: 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  pr);.  for(i=0; 
7d70: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
7d80: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
7d90: 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69  *p;.    p = pELi
7da0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
7db0: 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63      if( p==0 ) c
7dc0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
7dd0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
7de0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ame ){.      cha
7df0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  r *zName = pELis
7e00: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[i].zName;. 
7e10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7e20: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
7e30: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
7e40: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61  Name, strlen(zNa
7e50: 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74  me));.      cont
7e60: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
7e70: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
7e80: 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73 74  LUMN && pTabList
7e90: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
7ea0: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61  *pTab;.      cha
7eb0: 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69  r *zCol;.      i
7ec0: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f  nt iCol = p->iCo
7ed0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  lumn;.      for(
7ee0: 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d  j=0; j<pTabList-
7ef0: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
7f00: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
7f10: 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29  =p->iTable; j++)
7f20: 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  {}.      assert(
7f30: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
7f40: 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20  c );.      pTab 
7f50: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
7f60: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  .pTab;.      if(
7f70: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
7f80: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
7f90: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
7fa0: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
7fb0: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
7fc0: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66  Col) );.      if
7fd0: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
7fe0: 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69      zCol = "rowi
7ff0: 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d";.      }else{
8000: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
8010: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
8020: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a  .zName;.      }.
8030: 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74        if( !short
8040: 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61  Names && !fullNa
8050: 6d 65 73 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  mes && p->span.z
8060: 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d   && p->span.z[0]
8070: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8080: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8090: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
80a0: 4e 41 4d 45 2c 20 28 63 68 61 72 2a 29 70 2d 3e  NAME, (char*)p->
80b0: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
80c0: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  n);.      }else 
80d0: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c  if( fullNames ||
80e0: 20 28 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26   (!shortNames &&
80f0: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
8100: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  1) ){.        ch
8110: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
8120: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
8130: 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61  b;. .        zTa
8140: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
8150: 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  j].zAlias;.     
8160: 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73     if( fullNames
8170: 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54   || zTab==0 ) zT
8180: 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ab = pTab->zName
8190: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
81a0: 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d  3SetString(&zNam
81b0: 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43  e, zTab, ".", zC
81c0: 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  ol, (char*)0);. 
81d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
81e0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
81f0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
8200: 20 7a 4e 61 6d 65 2c 20 50 33 5f 44 59 4e 41 4d   zName, P3_DYNAM
8210: 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IC);.      }else
8220: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8230: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8240: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8250: 4d 45 2c 20 7a 43 6f 6c 2c 20 73 74 72 6c 65 6e  ME, zCol, strlen
8260: 28 7a 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 7d  (zCol));.      }
8270: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
8280: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
8290: 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  pan.z[0] ){.    
82a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
82b0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
82c0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28 63 68 61  LNAME_NAME, (cha
82d0: 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d  r*)p->span.z, p-
82e0: 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  >span.n);.      
82f0: 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  /* sqlite3VdbeCo
8300: 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c 20 61  mpressSpace(v, a
8310: 64 64 72 29 3b 20 2a 2f 0a 20 20 20 20 7d 65 6c  ddr); */.    }el
8320: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a  se{.      char z
8330: 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20  Name[30];.      
8340: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54  assert( p->op!=T
8350: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62  K_COLUMN || pTab
8360: 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  List==0 );.     
8370: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8380: 66 28 73 69 7a 65 6f 66 28 7a 4e 61 6d 65 29 2c  f(sizeof(zName),
8390: 20 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25   zName, "column%
83a0: 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  d", i+1);.      
83b0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
83c0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
83d0: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c  AME_NAME, zName,
83e0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
83f0: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
8400: 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ypes(pParse, pTa
8410: 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
8420: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
8430: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
8440: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d  SELECT./*.** Nam
8450: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
8460: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
8470: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
8480: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
8490: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
84a0: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
84b0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
84c0: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
84d0: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
84e0: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
84f0: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
8500: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
8510: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
8520: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
8530: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
8540: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
8550: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
8560: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
8570: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
8580: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
8590: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
85a0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
85b0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
85c0: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
85d0: 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
85e0: 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  aration.*/.stati
85f0: 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74  c int prepSelect
8600: 53 74 6d 74 28 50 61 72 73 65 2a 2c 20 53 65 6c  Stmt(Parse*, Sel
8610: 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69  ect*);../*.** Gi
8620: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
8630: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
8640: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
8650: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
8660: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
8670: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
8680: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
8690: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
86a0: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
86b0: 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62  arse, char *zTab
86c0: 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  Name, Select *pS
86d0: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
86e0: 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  *pTab;.  int i, 
86f0: 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  j;.  ExprList *p
8700: 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20  EList;.  Column 
8710: 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 0a 20  *aCol, *pCol;.. 
8720: 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d   while( pSelect-
8730: 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63  >pPrior ) pSelec
8740: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  t = pSelect->pPr
8750: 69 6f 72 3b 0a 20 20 69 66 28 20 70 72 65 70 53  ior;.  if( prepS
8760: 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73 65  electStmt(pParse
8770: 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  , pSelect) ){.  
8780: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
8790: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
87a0: 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73  ectResolve(pPars
87b0: 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 20 29  e, pSelect, 0) )
87c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
87d0: 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c    }.  pTab = sql
87e0: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
87f0: 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66  f(Table) );.  if
8800: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
8810: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
8820: 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b   pTab->nRef = 1;
8830: 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d  .  pTab->zName =
8840: 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69   zTabName ? sqli
8850: 74 65 53 74 72 44 75 70 28 7a 54 61 62 4e 61 6d  teStrDup(zTabNam
8860: 65 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74  e) : 0;.  pEList
8870: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
8880: 73 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c  st;.  pTab->nCol
8890: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
88a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
88b0: 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54  ->nCol>0 );.  pT
88c0: 61 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20  ab->aCol = aCol 
88d0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
88e0: 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f  sizeof(pTab->aCo
88f0: 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c  l[0])*pTab->nCol
8900: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   );.  for(i=0, p
8910: 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 70 54 61 62  Col=aCol; i<pTab
8920: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
8930: 6c 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  l++){.    Expr *
8940: 70 2c 20 2a 70 52 3b 0a 20 20 20 20 63 68 61 72  p, *pR;.    char
8950: 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 63 68 61   *zType;.    cha
8960: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e  r *zName;.    in
8970: 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c  t nName;.    Col
8980: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
8990: 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20 4e 61   int cnt;.    Na
89a0: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
89b0: 20 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 61     .    /* Get a
89c0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61  n appropriate na
89d0: 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  me for the colum
89e0: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d  n.    */.    p =
89f0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
8a00: 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
8a10: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c   p->pRight==0 ||
8a20: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
8a30: 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  n.z==0 || p->pRi
8a40: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21  ght->token.z[0]!
8a50: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a  =0 );.    if( (z
8a60: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
8a70: 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  [i].zName)!=0 ){
8a80: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
8a90: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
8aa0: 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20   an "AS <name>" 
8ab0: 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d  phrase, use <nam
8ac0: 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a  e> as the name *
8ad0: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
8ae0: 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a 4e 61  sqliteStrDup(zNa
8af0: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  me);.    }else i
8b00: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  f( p->op==TK_DOT
8b10: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
8b20: 26 26 20 28 70 52 3d 70 2d 3e 70 52 69 67 68 74  && (pR=p->pRight
8b30: 29 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b 65  )!=0 && pR->toke
8b40: 6e 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e  n.z && pR->token
8b50: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f  .z[0] ){.      /
8b60: 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f 66  * For columns of
8b70: 20 74 68 65 20 66 72 6f 6d 20 41 2e 42 20 75 73   the from A.B us
8b80: 65 20 42 20 61 73 20 74 68 65 20 6e 61 6d 65 20  e B as the name 
8b90: 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  */.      zName =
8ba0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
8bb0: 22 25 54 22 2c 20 26 70 52 2d 3e 74 6f 6b 65 6e  "%T", &pR->token
8bc0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
8bd0: 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d   p->span.z && p-
8be0: 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20  >span.z[0] ){.  
8bf0: 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f      /* Use the o
8c00: 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20  riginal text of 
8c10: 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65  the column expre
8c20: 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d  ssion as its nam
8c30: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
8c40: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
8c50: 66 28 22 25 54 22 2c 20 26 70 2d 3e 73 70 61 6e  f("%T", &p->span
8c60: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8c70: 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 65 6c      /* If all el
8c80: 73 65 20 66 61 69 6c 73 2c 20 6d 61 6b 65 20 75  se fails, make u
8c90: 70 20 61 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  p a name */.    
8ca0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
8cb0: 33 4d 50 72 69 6e 74 66 28 22 63 6f 6c 75 6d 6e  3MPrintf("column
8cc0: 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 7d  %d", i+1);.    }
8cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
8ce0: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ote(zName);.    
8cf0: 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  if( sqlite3Mallo
8d00: 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20  cFailed() ){.   
8d10: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
8d20: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
8d30: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70  te3DeleteTable(p
8d40: 54 61 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Tab);.      retu
8d50: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 0;.    }..   
8d60: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
8d70: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  e column name is
8d80: 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65   unique.  If the
8d90: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69   name is not uni
8da0: 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65  que,.    ** appe
8db0: 6e 64 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20  nd a integer to 
8dc0: 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74  the name so that
8dd0: 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71   it becomes uniq
8de0: 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  ue..    */.    n
8df0: 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e  Name = strlen(zN
8e00: 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  ame);.    for(j=
8e10: 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29  cnt=0; j<i; j++)
8e20: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
8e30: 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b  te3StrICmp(aCol[
8e40: 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  j].zName, zName)
8e50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
8e60: 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b  Name[nName] = 0;
8e70: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
8e80: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
8e90: 22 25 7a 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20  "%z:%d", zName, 
8ea0: 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ++cnt);.        
8eb0: 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  j = -1;.        
8ec0: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62  if( zName==0 ) b
8ed0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
8ee0: 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e    }.    pCol->zN
8ef0: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20  ame = zName;..  
8f00: 20 20 2f 2a 20 47 65 74 20 74 68 65 20 74 79 70    /* Get the typ
8f10: 65 6e 61 6d 65 2c 20 74 79 70 65 20 61 66 66 69  ename, type affi
8f20: 6e 69 74 79 2c 20 61 6e 64 20 63 6f 6c 6c 61 74  nity, and collat
8f30: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
8f40: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 75   the.    ** colu
8f50: 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  mn..    */.    m
8f60: 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
8f70: 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
8f80: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
8f90: 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20  pSelect->pSrc;. 
8fa0: 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74     zType = sqlit
8fb0: 65 53 74 72 44 75 70 28 63 6f 6c 75 6d 6e 54 79  eStrDup(columnTy
8fc0: 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30  pe(&sNC, p, 0, 0
8fd0: 2c 20 30 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d  , 0));.    pCol-
8fe0: 3e 7a 54 79 70 65 20 3d 20 7a 54 79 70 65 3b 0a  >zType = zType;.
8ff0: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
9000: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
9010: 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20  Affinity(p);.   
9020: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
9030: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
9040: 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  se, p);.    if( 
9050: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
9060: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c  Col->zColl = sql
9070: 69 74 65 53 74 72 44 75 70 28 70 43 6f 6c 6c 2d  iteStrDup(pColl-
9080: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
9090: 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79   }.  pTab->iPKey
90a0: 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
90b0: 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  pTab;.}../*.** P
90c0: 72 65 70 61 72 65 20 61 20 53 45 4c 45 43 54 20  repare a SELECT 
90d0: 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72  statement for pr
90e0: 6f 63 65 73 73 69 6e 67 20 62 79 20 64 6f 69 6e  ocessing by doin
90f0: 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  g the following.
9100: 2a 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a  ** things:.**.**
9110: 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75      (1)  Make su
9120: 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  re VDBE cursor n
9130: 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
9140: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65   assigned to eve
9150: 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c  ry.**         el
9160: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f  ement of the FRO
9170: 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
9180: 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20     (2)  Fill in 
9190: 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  the pTabList->a[
91a0: 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e  ].pTab fields in
91b0: 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61   the SrcList tha
91c0: 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65  t .**         de
91d0: 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73  fines FROM claus
91e0: 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61  e.  When views a
91f0: 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
9200: 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20  M clause,.**    
9210: 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69       fill pTabLi
9220: 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20  st->a[].pSelect 
9230: 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
9240: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
9250: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74  ent.**         t
9260: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
9270: 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79  he view.  A copy
9280: 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
9290: 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a  view's SELECT.**
92a0: 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65           stateme
92b0: 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  nt so that we ca
92c0: 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20  n freely modify 
92d0: 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73  or delete that s
92e0: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
92f0: 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72      without worr
9300: 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69  ying about messi
9310: 6e 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73  ng up the presis
9320: 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  tent representat
9330: 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ion.**         o
9340: 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a  f the view..**.*
9350: 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65  *    (3)  Add te
9360: 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  rms to the WHERE
9370: 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d   clause to accom
9380: 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41  odate the NATURA
9390: 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20  L keyword.**    
93a0: 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e       on joins an
93b0: 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  d the ON and USI
93c0: 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69  NG clause of joi
93d0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29  ns..**.**    (4)
93e0: 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20    Scan the list 
93f0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
9400: 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45  e result set (pE
9410: 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  List) looking.**
9420: 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73           for ins
9430: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a  tances of the "*
9440: 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68  " operator or th
9450: 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74  e TABLE.* operat
9460: 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49  or..**         I
9470: 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20  f found, expand 
9480: 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65  each "*" to be e
9490: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  very column in e
94a0: 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20  very table.**   
94b0: 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e        and TABLE.
94c0: 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  * to be every co
94d0: 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a  lumn in TABLE..*
94e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e  *.** Return 0 on
94f0: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
9500: 65 72 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73  ere are problems
9510: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
9520: 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70   message.** in p
9530: 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
9540: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74   non-zero..*/.st
9550: 61 74 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c  atic int prepSel
9560: 65 63 74 53 74 6d 74 28 50 61 72 73 65 20 2a 70  ectStmt(Parse *p
9570: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
9580: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  ){.  int i, j, k
9590: 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69 73 74 20  , rc;.  SrcList 
95a0: 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70  *pTabList;.  Exp
95b0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
95c0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
95d0: 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20  item *pFrom;..  
95e0: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70  if( p==0 || p->p
95f0: 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  Src==0 || sqlite
9600: 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
9610: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
9620: 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20  .  }.  pTabList 
9630: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  = p->pSrc;.  pEL
9640: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
9650: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
9660: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
9670: 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
9680: 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65  ed to all entrie
9690: 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52  s in.  ** the FR
96a0: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
96b0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
96c0: 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
96d0: 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
96e0: 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 2d  rsors(pParse, p-
96f0: 3e 70 53 72 63 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  >pSrc);..  /* Lo
9700: 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c  ok up every tabl
9710: 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
9720: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
9730: 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20  e select.  If.  
9740: 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  ** an entry of t
9750: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
9760: 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73  s a subquery ins
9770: 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20  tead of a table 
9780: 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68  or view,.  ** th
9790: 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e  en create a tran
97a0: 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
97b0: 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62  cture to describ
97c0: 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  e the subquery..
97d0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
97e0: 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
97f0: 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
9800: 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
9810: 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
9820: 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 46 72  Tab;.    if( pFr
9830: 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20  om->pTab!=0 ){. 
9840: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61       /* This sta
9850: 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61  tement has alrea
9860: 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64  dy been prepared
9870: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  .  There is no n
9880: 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  eed.      ** to 
9890: 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20  go further. */. 
98a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d       assert( i==
98b0: 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
98c0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
98d0: 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d  f( pFrom->zName=
98e0: 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
98f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
9900: 52 59 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75  RY.      /* A su
9910: 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46  b-query in the F
9920: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
9930: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20  SELECT */.      
9940: 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
9950: 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20  Select!=0 );.   
9960: 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41     if( pFrom->zA
9970: 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lias==0 ){.     
9980: 20 20 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73     pFrom->zAlias
9990: 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   =.          sql
99a0: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 73 71 6c  ite3MPrintf("sql
99b0: 69 74 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f  ite_subquery_%p_
99c0: 22 2c 20 28 76 6f 69 64 2a 29 70 46 72 6f 6d 2d  ", (void*)pFrom-
99d0: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
99e0: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
99f0: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
9a00: 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  );.      pFrom->
9a10: 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20  pTab = pTab = . 
9a20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
9a30: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
9a40: 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 2d 3e 7a  pParse, pFrom->z
9a50: 41 6c 69 61 73 2c 20 70 46 72 6f 6d 2d 3e 70 53  Alias, pFrom->pS
9a60: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66  elect);.      if
9a70: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
9a80: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
9a90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
9aa0: 54 68 65 20 69 73 45 70 68 65 6d 20 66 6c 61 67  The isEphem flag
9ab0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
9ac0: 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
9ad0: 75 72 65 20 68 61 73 20 62 65 65 6e 0a 20 20 20  ure has been.   
9ae0: 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c     ** dynamicall
9af0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  y allocated and 
9b00: 6d 61 79 20 62 65 20 66 72 65 65 64 20 61 74 20  may be freed at 
9b10: 61 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74  any time.  In ot
9b20: 68 65 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 20  her words,.     
9b30: 20 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f 74 20   ** pTab is not 
9b40: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 70 65  pointing to a pe
9b50: 72 73 69 73 74 65 6e 74 20 74 61 62 6c 65 20 73  rsistent table s
9b60: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
9b70: 66 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 70  fines.      ** p
9b80: 61 72 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d  art of the schem
9b90: 61 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62  a. */.      pTab
9ba0: 2d 3e 69 73 45 70 68 65 6d 20 3d 20 31 3b 0a 23  ->isEphem = 1;.#
9bb0: 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
9bc0: 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64  .      /* An ord
9bd0: 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76  inary table or v
9be0: 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  iew name in the 
9bf0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
9c00: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
9c10: 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
9c20: 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
9c30: 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20   = pTab = .     
9c40: 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65     sqlite3Locate
9c50: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 70 46 72  Table(pParse,pFr
9c60: 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d  om->zName,pFrom-
9c70: 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
9c80: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
9c90: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
9ca0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
9cb0: 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
9cc0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
9cd0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
9ce0: 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49  | !defined (SQLI
9cf0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
9d00: 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20  ABLE).      if( 
9d10: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c  pTab->pSelect ||
9d20: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
9d30: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
9d40: 65 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20  e reach here if 
9d50: 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20  the named table 
9d60: 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69  is a really a vi
9d70: 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ew */.        if
9d80: 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  ( sqlite3ViewGet
9d90: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
9da0: 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20  se, pTab) ){.   
9db0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
9dc0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9dd0: 20 20 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e     /* If pFrom->
9de0: 70 53 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65  pSelect!=0 it me
9df0: 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69  ans we are deali
9e00: 6e 67 20 77 69 74 68 20 61 0a 20 20 20 20 20 20  ng with a.      
9e10: 20 20 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e    ** view within
9e20: 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 53 45   a view.  The SE
9e30: 4c 45 43 54 20 73 74 72 75 63 74 75 72 65 20 68  LECT structure h
9e40: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a  as already been.
9e50: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65          ** copie
9e60: 64 20 62 79 20 74 68 65 20 6f 75 74 65 72 20 76  d by the outer v
9e70: 69 65 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b  iew so we can sk
9e80: 69 70 20 74 68 65 20 63 6f 70 79 20 73 74 65 70  ip the copy step
9e90: 20 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a   here.        **
9ea0: 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69   in the inner vi
9eb0: 65 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ew..        */. 
9ec0: 20 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d         if( pFrom
9ed0: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
9ee0: 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d            pFrom-
9ef0: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
9f00: 65 33 53 65 6c 65 63 74 44 75 70 28 70 54 61 62  e3SelectDup(pTab
9f10: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
9f20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
9f30: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ndif.    }.  }..
9f40: 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
9f50: 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
9f60: 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
9f70: 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
9f80: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
9f90: 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
9fa0: 50 61 72 73 65 2c 20 70 29 20 29 20 72 65 74 75  Parse, p) ) retu
9fb0: 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  rn 1;..  /* For 
9fc0: 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f  every "*" that o
9fd0: 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c  ccurs in the col
9fe0: 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74  umn list, insert
9ff0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20   the names of.  
a000: 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  ** all columns i
a010: 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41  n all tables.  A
a020: 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42  nd for every TAB
a030: 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20  LE.* insert the 
a040: 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c  names.  ** of al
a050: 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42  l columns in TAB
a060: 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  LE.  The parser 
a070: 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69  inserted a speci
a080: 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  al expression.  
a090: 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41  ** with the TK_A
a0a0: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  LL operator for 
a0b0: 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74  each "*" that it
a0c0: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f   found in the co
a0d0: 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20  lumn list..  ** 
a0e0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
a0f0: 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c  de just has to l
a100: 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c  ocate the TK_ALL
a110: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64   expressions and
a120: 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63   expand.  ** eac
a130: 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73  h one to the lis
a140: 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  t of all columns
a150: 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a   in all tables..
a160: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
a170: 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68  rst loop just ch
a180: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
a190: 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22  here are any "*"
a1a0: 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20   operators.  ** 
a1b0: 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64  that need expand
a1c0: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
a1d0: 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
a1e0: 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
a1f0: 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73  Expr *pE = pELis
a200: 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20  t->a[k].pExpr;. 
a210: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
a220: 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20  K_ALL ) break;. 
a230: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
a240: 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69  K_DOT && pE->pRi
a250: 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68  ght && pE->pRigh
a260: 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20  t->op==TK_ALL.  
a270: 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c         && pE->pL
a280: 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  eft && pE->pLeft
a290: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72  ->op==TK_ID ) br
a2a0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  eak;.  }.  rc = 
a2b0: 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73  0;.  if( k<pELis
a2c0: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
a2d0: 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20  /*.    ** If we 
a2e0: 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e  get here it mean
a2f0: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
a300: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
a310: 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a   more "*".    **
a320: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
a330: 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
a340: 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75  ded.  Loop throu
a350: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
a360: 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  on.    ** in the
a370: 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
a380: 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20  expand them one 
a390: 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  by one..    */. 
a3a0: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
a3b0: 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c  st_item *a = pEL
a3c0: 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72  ist->a;.    Expr
a3d0: 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  List *pNew = 0;.
a3e0: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
a3f0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
a400: 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e  s;.    int longN
a410: 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20  ames = (flags & 
a420: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
a430: 6d 65 73 29 21 3d 30 20 26 26 0a 20 20 20 20 20  mes)!=0 &&.     
a440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a450: 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
a460: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d  _ShortColNames)=
a470: 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30  =0;..    for(k=0
a480: 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
a490: 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; k++){.      E
a4a0: 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70  xpr *pE = a[k].p
a4b0: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
a4c0: 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26  pE->op!=TK_ALL &
a4d0: 26 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 45  &.           (pE
a4e0: 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
a4f0: 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c  pE->pRight==0 ||
a500: 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21   pE->pRight->op!
a510: 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20  =TK_ALL) ){.    
a520: 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
a530: 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
a540: 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
a550: 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
a560: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
a570: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
a580: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
a590: 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72  pNew, a[k].pExpr
a5a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
a5b0: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
a5c0: 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
a5d0: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
a5e0: 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20   = a[k].zName;. 
a5f0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
a600: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
a610: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a620: 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30    a[k].pExpr = 0
a630: 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a  ;.        a[k].z
a640: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
a650: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
a660: 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  * This expressio
a670: 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20  n is a "*" or a 
a680: 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65  "TABLE.*" and ne
a690: 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20  eds to be.      
a6a0: 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a    ** expanded. *
a6b0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61  /.        int ta
a6c0: 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20  bleSeen = 0;    
a6d0: 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68    /* Set to 1 wh
a6e0: 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73  en TABLE matches
a6f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
a700: 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20 20   *zTName;       
a710: 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20       /* text of 
a720: 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f  name of TABLE */
a730: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d  .        if( pE-
a740: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
a750: 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  E->pLeft ){.    
a760: 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73        zTName = s
a770: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
a780: 6b 65 6e 28 26 70 45 2d 3e 70 4c 65 66 74 2d 3e  ken(&pE->pLeft->
a790: 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  token);.        
a7a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
a7b0: 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   zTName = 0;.   
a7c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
a7d0: 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
a7e0: 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
a7f0: 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
a800: 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
a810: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
a820: 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
a830: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
a840: 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f  *zTabName = pFro
a850: 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  m->zAlias;.     
a860: 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
a870: 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65  e==0 || zTabName
a880: 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20  [0]==0 ){ .     
a890: 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20         zTabName 
a8a0: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
a8b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a8c0: 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
a8d0: 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  && (zTabName==0 
a8e0: 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d  || zTabName[0]==
a8f0: 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  0 || .          
a900: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
a910: 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54  rICmp(zTName, zT
a920: 61 62 4e 61 6d 65 29 21 3d 30 29 20 29 7b 0a 20  abName)!=0) ){. 
a930: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
a940: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
a950: 0a 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65  .          table
a960: 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Seen = 1;.      
a970: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
a980: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
a990: 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
a9a0: 72 20 2a 70 45 78 70 72 2c 20 2a 70 52 69 67 68  r *pExpr, *pRigh
a9b0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  t;.            c
a9c0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61  har *zName = pTa
a9d0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
a9e0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ;..            i
a9f0: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( i>0 ){.      
aa00: 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53          struct S
aa10: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65  rcList_item *pLe
aa20: 66 74 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  ft = &pTabList->
aa30: 61 5b 69 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  a[i-1];.        
aa40: 20 20 20 20 20 20 69 66 28 20 28 70 4c 65 66 74        if( (pLeft
aa50: 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  [1].jointype & J
aa60: 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20 26 26  T_NATURAL)!=0 &&
aa70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
aa80: 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49           columnI
aa90: 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70 54 61 62  ndex(pLeft->pTab
aaa0: 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aac0: 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a  * In a NATURAL j
aad0: 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f  oin, omit the jo
aae0: 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  in columns from 
aaf0: 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  the .           
ab00: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e       ** table on
ab10: 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20   the right */.  
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
ab30: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
ab40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ab50: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
ab60: 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 4c 65  3IdListIndex(pLe
ab70: 66 74 5b 31 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e  ft[1].pUsing, zN
ab80: 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
ab90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
aba0: 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
abb0: 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
abc0: 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
abd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
abe0: 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
abf0: 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
ac00: 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
ac10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ac20: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
ac30: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ac40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ac50: 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
ac60: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c  lite3Expr(TK_ID,
ac70: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
ac80: 20 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68         if( pRigh
ac90: 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  t==0 ) break;.  
aca0: 20 20 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b            setTok
acb0: 65 6e 28 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65  en(&pRight->toke
acc0: 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  n, zName);.     
acd0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
ace0: 61 6d 65 20 26 26 20 28 6c 6f 6e 67 4e 61 6d 65  ame && (longName
acf0: 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s || pTabList->n
ad00: 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20  Src>1) ){.      
ad10: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
ad20: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
ad30: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30  r(TK_ID, 0, 0, 0
ad40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
ad50: 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
ad60: 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65  Expr(TK_DOT, pLe
ad70: 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a  ft, pRight, 0);.
ad80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
ad90: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65  ( pExpr==0 ) bre
ada0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
adb0: 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 4c 65 66    setToken(&pLef
adc0: 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61  t->token, zTabNa
add0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
ade0: 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 45 78     setToken(&pEx
adf0: 70 72 2d 3e 73 70 61 6e 2c 20 73 71 6c 69 74 65  pr->span, sqlite
ae00: 33 4d 50 72 69 6e 74 66 28 22 25 73 2e 25 73 22  3MPrintf("%s.%s"
ae10: 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d  , zTabName, zNam
ae20: 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e));.           
ae30: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64     pExpr->span.d
ae40: 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  yn = 1;.        
ae50: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
ae60: 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20  en.z = 0;.      
ae70: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
ae80: 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  oken.n = 0;.    
ae90: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
aea0: 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a  >token.dyn = 0;.
aeb0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
aec0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
aed0: 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b   pExpr = pRight;
aee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
aef0: 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78  Expr->span = pEx
af00: 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  pr->token;.     
af10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
af20: 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d       if( longNam
af30: 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  es ){.          
af40: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
af50: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
af60: 28 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70  (pNew, pExpr, &p
af70: 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  Expr->span);.   
af80: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
afa0: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
afb0: 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c  ListAppend(pNew,
afc0: 20 70 45 78 70 72 2c 20 26 70 52 69 67 68 74 2d   pExpr, &pRight-
afd0: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20  >token);.       
afe0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
aff0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
b000: 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53       if( !tableS
b010: 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  een ){.         
b020: 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20   if( zTName ){. 
b030: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
b040: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
b050: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
b060: 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b  e: %s", zTName);
b070: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
b080: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
b090: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
b0a0: 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73  arse, "no tables
b0b0: 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20   specified");.  
b0c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b0d0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
b0e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
b0f0: 6c 69 74 65 46 72 65 65 28 7a 54 4e 61 6d 65 29  liteFree(zTName)
b100: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b110: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
b120: 69 73 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74  istDelete(pEList
b130: 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74  );.    p->pEList
b140: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 69   = pNew;.  }.  i
b150: 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  f( p->pEList && 
b160: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
b170: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55  >SQLITE_MAX_COLU
b180: 4d 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  MN ){.    sqlite
b190: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
b1a0: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
b1b0: 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
b1c0: 74 22 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  t");.    rc = SQ
b1d0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
b1e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b1f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b200: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
b210: 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ECT./*.** This r
b220: 6f 75 74 69 6e 65 20 61 73 73 6f 63 69 61 74 65  outine associate
b230: 73 20 65 6e 74 72 69 65 73 20 69 6e 20 61 6e 20  s entries in an 
b240: 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73  ORDER BY express
b250: 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a  ion list with.**
b260: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65   columns in a re
b270: 73 75 6c 74 2e 20 20 46 6f 72 20 65 61 63 68 20  sult.  For each 
b280: 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73  ORDER BY express
b290: 69 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65 20  ion, the opcode 
b2a0: 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65  of.** the top-le
b2b0: 76 65 6c 20 6e 6f 64 65 20 69 73 20 63 68 61 6e  vel node is chan
b2c0: 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  ged to TK_COLUMN
b2d0: 20 61 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e   and the iColumn
b2e0: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65   value of.** the
b2f0: 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20   top-level node 
b300: 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74  is filled in wit
b310: 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  h column number 
b320: 61 6e 64 20 74 68 65 20 69 54 61 62 6c 65 0a 2a  and the iTable.*
b330: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74  * value of the t
b340: 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73  op-level node is
b350: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 54 61   filled with iTa
b360: 62 6c 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ble parameter..*
b370: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
b380: 65 20 70 72 69 6f 72 20 53 45 4c 45 43 54 20 63  e prior SELECT c
b390: 6c 61 75 73 65 73 2c 20 74 68 65 79 20 61 72 65  lauses, they are
b3a0: 20 70 72 6f 63 65 73 73 65 64 20 66 69 72 73 74   processed first
b3b0: 2e 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e  .  A match.** in
b3c0: 20 61 6e 20 65 61 72 6c 69 65 72 20 53 45 4c 45   an earlier SELE
b3d0: 43 54 20 74 61 6b 65 73 20 70 72 65 63 65 64 65  CT takes precede
b3e0: 6e 63 65 20 6f 76 65 72 20 61 20 6c 61 74 65 72  nce over a later
b3f0: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41   SELECT..**.** A
b400: 6e 79 20 65 6e 74 72 79 20 74 68 61 74 20 64 6f  ny entry that do
b410: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 69 73 20  es not match is 
b420: 66 6c 61 67 67 65 64 20 61 73 20 61 6e 20 65 72  flagged as an er
b430: 72 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ror.  The number
b440: 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20 69 73  .** of errors is
b450: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
b460: 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72  atic int matchOr
b470: 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20  derbyToColumn(. 
b480: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
b490: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 6c           /* A pl
b4a0: 61 63 65 20 74 6f 20 6c 65 61 76 65 20 65 72 72  ace to leave err
b4b0: 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20  or messages */. 
b4c0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
b4d0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63  ,        /* Matc
b4e0: 68 20 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75  h to result colu
b4f0: 6d 6e 73 20 6f 66 20 74 68 69 73 20 53 45 4c 45  mns of this SELE
b500: 43 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  CT */.  ExprList
b510: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
b520: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
b530: 76 61 6c 75 65 73 20 74 6f 20 6d 61 74 63 68 20  values to match 
b540: 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20  against columns 
b550: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
b560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b570: 49 6e 73 65 72 74 20 74 68 69 73 20 76 61 6c 75  Insert this valu
b580: 65 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20  e in iTable */. 
b590: 20 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74   int mustComplet
b5a0: 65 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54  e        /* If T
b5b0: 52 55 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59  RUE all ORDER BY
b5c0: 73 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a  s must match */.
b5d0: 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  ){.  int nErr = 
b5e0: 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  0;.  int i, j;. 
b5f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
b600: 74 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63  t;..  if( pSelec
b610: 74 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42 79  t==0 || pOrderBy
b620: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
b630: 20 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65    if( mustComple
b640: 74 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  te ){.    for(i=
b650: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
b660: 45 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64  Expr; i++){ pOrd
b670: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
b680: 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28  = 0; }.  }.  if(
b690: 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28   prepSelectStmt(
b6a0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29  pParse, pSelect)
b6b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
b6c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c  ;.  }.  if( pSel
b6d0: 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ect->pPrior ){. 
b6e0: 20 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65     if( matchOrde
b6f0: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
b700: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  se, pSelect->pPr
b710: 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69  ior, pOrderBy, i
b720: 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20  Table, 0) ){.   
b730: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
b740: 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20   }.  }.  pEList 
b750: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
b760: 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
b770: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
b780: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
b790: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
b7a0: 2a 70 49 74 65 6d 3b 0a 20 20 20 20 45 78 70 72  *pItem;.    Expr
b7b0: 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d   *pE = pOrderBy-
b7c0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
b7d0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a   int iCol = -1;.
b7e0: 20 20 20 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c      char *zLabel
b7f0: 3b 0a 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  ;..    if( pOrde
b800: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29  rBy->a[i].done )
b810: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
b820: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
b830: 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
b840: 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l) ){.      if( 
b850: 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e  iCol<=0 || iCol>
b860: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
b870: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b880: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
b890: 0a 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45  .          "ORDE
b8a0: 52 20 42 59 20 70 6f 73 69 74 69 6f 6e 20 25 64  R BY position %d
b8b0: 20 73 68 6f 75 6c 64 20 62 65 20 62 65 74 77 65   should be betwe
b8c0: 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 0a 20 20  en 1 and %d",.  
b8d0: 20 20 20 20 20 20 20 20 69 43 6f 6c 2c 20 70 45          iCol, pE
b8e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
b8f0: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
b900: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b910: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
b920: 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 20 63  mustComplete ) c
b930: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
b940: 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Col--;.    }.   
b950: 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 28   if( iCol<0 && (
b960: 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33  zLabel = sqlite3
b970: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70  NameFromToken(&p
b980: 45 2d 3e 74 6f 6b 65 6e 29 29 21 3d 30 20 29 7b  E->token))!=0 ){
b990: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
b9a0: 70 49 74 65 6d 3d 70 45 4c 69 73 74 2d 3e 61 3b  pItem=pEList->a;
b9b0: 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   j<pEList->nExpr
b9c0: 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
b9d0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
b9e0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Name;.        in
b9f0: 74 20 69 73 4d 61 74 63 68 3b 0a 20 20 20 20 20  t isMatch;.     
ba00: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e     if( pItem->zN
ba10: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
ba20: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
ba30: 53 74 72 44 75 70 28 70 49 74 65 6d 2d 3e 7a 4e  StrDup(pItem->zN
ba40: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ame);.        }e
ba50: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
ba60: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
ba70: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70 49 74  meFromToken(&pIt
ba80: 65 6d 2d 3e 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  em->pExpr->token
ba90: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
baa0: 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 7a       isMatch = z
bab0: 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53  Name && sqlite3S
bac0: 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c  trICmp(zName, zL
bad0: 61 62 65 6c 29 3d 3d 30 3b 0a 20 20 20 20 20 20  abel)==0;.      
bae0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
baf0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
bb00: 20 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20   isMatch ){.    
bb10: 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a        iCol = j;.
bb20: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bb30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bb40: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46   }.      sqliteF
bb50: 72 65 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20  ree(zLabel);.   
bb60: 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e   }.    if( iCol>
bb70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e  =0 ){.      pE->
bb80: 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
bb90: 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
bba0: 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  n = iCol;.      
bbb0: 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61  pE->iTable = iTa
bbc0: 62 6c 65 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69  ble;.      pE->i
bbd0: 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Agg = -1;.      
bbe0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
bbf0: 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  one = 1;.    }el
bc00: 73 65 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c  se if( mustCompl
bc10: 65 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ete ){.      sql
bc20: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
bc30: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 4f 52  rse,.        "OR
bc40: 44 45 52 20 42 59 20 74 65 72 6d 20 6e 75 6d 62  DER BY term numb
bc50: 65 72 20 25 64 20 64 6f 65 73 20 6e 6f 74 20 6d  er %d does not m
bc60: 61 74 63 68 20 61 6e 79 20 72 65 73 75 6c 74 20  atch any result 
bc70: 63 6f 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20  column", i+1);. 
bc80: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
bc90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bca0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72    }.  return nEr
bcb0: 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  r;  .}.#endif /*
bcc0: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
bcd0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
bce0: 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  LECT */../*.** G
bcf0: 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
bd00: 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
bd10: 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
bd20: 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
bd30: 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
bd40: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
bd50: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
bd60: 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
bd70: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62  n pParse..*/.Vdb
bd80: 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62  e *sqlite3GetVdb
bd90: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
bda0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
bdb0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
bdc0: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76  f( v==0 ){.    v
bdd0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
bde0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 72   = sqlite3VdbeCr
bdf0: 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29  eate(pParse->db)
be00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76  ;.  }.  return v
be10: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ;.}.../*.** Comp
be20: 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61  ute the iLimit a
be30: 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64  nd iOffset field
be40: 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
be50: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
be60: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
be70: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  et expressions. 
be80: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
be90: 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70  set hold the exp
bea0: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
beb0: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f   appear in the o
bec0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74  riginal SQL stat
bed0: 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20  ement after the 
bee0: 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
bef0: 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f  .** keywords.  O
bf00: 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20  r NULL if those 
bf10: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69  keywords are omi
bf20: 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64  tted. iLimit and
bf30: 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65   iOffset .** are
bf40: 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d   the integer mem
bf50: 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ory register num
bf60: 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72  bers for counter
bf70: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  s used to comput
bf80: 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20  e .** the limit 
bf90: 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20  and offset.  If 
bfa0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69  there is no limi
bfb0: 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c  t and/or offset,
bfc0: 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74   then .** iLimit
bfd0: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65   and iOffset are
bfe0: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a   negative..**.**
bff0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
c000: 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73  anges the values
c010: 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69   of iLimit and i
c020: 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a  Offset only if.*
c030: 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66  * a limit or off
c040: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
c050: 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66  y pLimit and pOf
c060: 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e  fset.  iLimit an
c070: 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f  d.** iOffset sho
c080: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72  uld have been pr
c090: 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69  eset to appropri
c0a0: 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ate default valu
c0b0: 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62  es.** (usually b
c0c0: 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31  ut not always -1
c0d0: 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  ) prior to calli
c0e0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
c0f0: 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d  .** Only if pLim
c100: 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74  it!=0 or pOffset
c110: 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  !=0 do the limit
c120: 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
c130: 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
c140: 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
c150: 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
c160: 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
c170: 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
c180: 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
c190: 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
c1a0: 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
c1b0: 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
c1c0: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
c1d0: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
c1e0: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
c1f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
c200: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42  elect *p, int iB
c210: 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76  reak){.  Vdbe *v
c220: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d   = 0;.  int iLim
c230: 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  it = 0;.  int iO
c240: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64  ffset;.  int add
c250: 72 31 2c 20 61 64 64 72 32 3b 0a 0a 20 20 2f 2a  r1, addr2;..  /*
c260: 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31   .  ** "LIMIT -1
c270: 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61  " always shows a
c280: 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20  ll rows.  There 
c290: 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e  is some.  ** con
c2a0: 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20 77  traversy about w
c2b0: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
c2c0: 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20  behavior should 
c2d0: 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72  be..  ** The cur
c2e0: 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
c2f0: 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22  ion interprets "
c300: 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e  LIMIT 0" to mean
c310: 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20  .  ** no rows.. 
c320: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   */.  if( p->pLi
c330: 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c  mit ){.    p->iL
c340: 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20  imit = iLimit = 
c350: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
c360: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
c370: 3d 20 32 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c  = 2;.    v = sql
c380: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
c390: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
c3a0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
c3b0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
c3c0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69  pParse, p->pLimi
c3d0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
c3e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
c3f0: 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b  ustBeInt, 0, 0);
c400: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c410: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
c420: 74 6f 72 65 2c 20 69 4c 69 6d 69 74 2c 20 30 29  tore, iLimit, 0)
c430: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
c440: 74 28 28 76 2c 20 22 23 20 4c 49 4d 49 54 20 63  t((v, "# LIMIT c
c450: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 73  ounter"));.    s
c460: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c470: 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c  v, OP_IfMemZero,
c480: 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29   iLimit, iBreak)
c490: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
c4a0: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 70 2d  Offset ){.    p-
c4b0: 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73  >iOffset = iOffs
c4c0: 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  et = pParse->nMe
c4d0: 6d 2b 2b 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c  m++;.    v = sql
c4e0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
c4f0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
c500: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
c510: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
c520: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73  pParse, p->pOffs
c530: 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  et);.    sqlite3
c540: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c550: 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29  MustBeInt, 0, 0)
c560: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c570: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
c580: 53 74 6f 72 65 2c 20 69 4f 66 66 73 65 74 2c 20  Store, iOffset, 
c590: 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 29 3b 0a 20  p->pLimit==0);. 
c5a0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
c5b0: 76 2c 20 22 23 20 4f 46 46 53 45 54 20 63 6f 75  v, "# OFFSET cou
c5c0: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 61 64 64  nter"));.    add
c5d0: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
c5e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65  AddOp(v, OP_IfMe
c5f0: 6d 50 6f 73 2c 20 69 4f 66 66 73 65 74 2c 20 30  mPos, iOffset, 0
c600: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
c610: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
c620: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 1, 0);.    sq
c630: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c640: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
c650: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
c660: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
c670: 61 64 64 72 31 29 3b 0a 20 20 20 20 69 66 28 20  addr1);.    if( 
c680: 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
c690: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c6a0: 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 2c 20 30  dOp(v, OP_Add, 0
c6b0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
c6c0: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
c6d0: 29 7b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73  ){.    addr1 = s
c6e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c6f0: 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20  v, OP_IfMemPos, 
c700: 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20  iLimit, 0);.    
c710: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c720: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
c730: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
c740: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
c750: 6d 49 6e 74 2c 20 2d 31 2c 20 69 4c 69 6d 69 74  mInt, -1, iLimit
c760: 2b 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d  +1);.    addr2 =
c770: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c780: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
c790: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
c7a0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
c7b0: 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69  addr1);.    sqli
c7c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c7d0: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4c 69  OP_MemStore, iLi
c7e0: 6d 69 74 2b 31 2c 20 31 29 3b 0a 20 20 20 20 56  mit+1, 1);.    V
c7f0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
c800: 23 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29  # LIMIT+OFFSET")
c810: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
c820: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
c830: 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  dr2);.  }.}../*.
c840: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 76 69  ** Allocate a vi
c850: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75  rtual index to u
c860: 73 65 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e 0a  se for sorting..
c870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
c880: 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65  reateSortingInde
c890: 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
c8a0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 45 78 70 72   Select *p, Expr
c8b0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 29 7b  List *pOrderBy){
c8c0: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
c8d0: 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b  ){.    int addr;
c8e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72  .    assert( pOr
c8f0: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3d  derBy->iECursor=
c900: 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 64 65 72  =0 );.    pOrder
c910: 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70  By->iECursor = p
c920: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
c930: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
c940: 33 56 64 62 65 41 64 64 4f 70 28 70 50 61 72 73  3VdbeAddOp(pPars
c950: 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4f 70 65  e->pVdbe, OP_Ope
c960: 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c980: 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
c990: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64  ->iECursor, pOrd
c9a0: 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 29 3b 0a  erBy->nExpr+1);.
c9b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
c9c0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
c9d0: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 70 2d 3e 61  = -1 );.    p->a
c9e0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
c9f0: 20 61 64 64 72 3b 0a 20 20 7d 0a 7d 0a 0a 23 69   addr;.  }.}..#i
ca00: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ca10: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
ca20: 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  T./*.** Return t
ca30: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
ca40: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
ca50: 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74  e for the iCol-t
ca60: 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  h column of.** t
ca70: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f  he result set fo
ca80: 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73  r the compound-s
ca90: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
caa0: 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  "p".  Return NUL
cab0: 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  L if.** the colu
cac0: 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c  mn has no defaul
cad0: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
cae0: 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ence..**.** The 
caf0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
cb00: 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  ce for the compo
cb10: 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61  und select is ta
cb20: 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ken from the.** 
cb30: 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f  left-most term o
cb40: 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61  f the select tha
cb50: 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  t has a collatin
cb60: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73  g sequence..*/.s
cb70: 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d  tatic CollSeq *m
cb80: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
cb90: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
cba0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
cbb0: 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  iCol){.  CollSeq
cbc0: 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d   *pRet;.  if( p-
cbd0: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70  >pPrior ){.    p
cbe0: 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  Ret = multiSelec
cbf0: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
cc00: 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c   p->pPrior, iCol
cc10: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
cc20: 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pRet = 0;.  }.  
cc30: 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20  if( pRet==0 ){. 
cc40: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
cc50: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
cc60: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
cc70: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a  a[iCol].pExpr);.
cc80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
cc90: 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t;.}.#endif /* S
cca0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
ccb0: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23  UND_SELECT */..#
ccc0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ccd0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
cce0: 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CT./*.** This ro
ccf0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
cd00: 74 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75 65  to process a que
cd10: 72 79 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c  ry that is reall
cd20: 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f  y the union.** o
cd30: 72 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  r intersection o
cd40: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65  f two or more se
cd50: 70 61 72 61 74 65 20 71 75 65 72 69 65 73 2e 0a  parate queries..
cd60: 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73  **.** "p" points
cd70: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
cd80: 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75  st of the two qu
cd90: 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72  eries.  the quer
cda0: 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74  y on the.** left
cdb0: 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20   is p->pPrior.  
cdc0: 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63  The left query c
cdd0: 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63  ould also be a c
cde0: 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a  ompound query.**
cdf0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
ce00: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
ce10: 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72   be called recur
ce20: 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54  sively. .**.** T
ce30: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
ce40: 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72  e total query ar
ce50: 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
ce60: 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69  into a destinati
ce70: 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44  on.** of type eD
ce80: 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74  est with paramet
ce90: 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  er iParm..**.** 
cea0: 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73  Example 1:  Cons
ceb0: 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79  ider a three-way
cec0: 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74   compound SQL st
ced0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  atement..**.**  
cee0: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
cef0: 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
cf00: 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e   b FROM t2 UNION
cf10: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
cf20: 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61  3.**.** This sta
cf30: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
cf40: 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   up as follows:.
cf50: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
cf60: 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20   c FROM t3.**   
cf70: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d     |.**      `--
cf80: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46  --->  SELECT b F
cf90: 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20  ROM t2.**       
cfa0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d               `--
cfc0: 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20  ---->  SELECT a 
cfd0: 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68  FROM t1.**.** Th
cfe0: 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20  e arrows in the 
cff0: 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65  diagram above re
d000: 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65  present the Sele
d010: 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65  ct.pPrior pointe
d020: 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73  r..** So if this
d030: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
d040: 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20  ed with p equal 
d050: 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c  to the t3 query,
d060: 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20   then.** pPrior 
d070: 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71  will be the t2 q
d080: 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c  uery.  p->op wil
d090: 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e  l be TK_UNION in
d0a0: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
d0b0: 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65  * Notice that be
d0c0: 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
d0d0: 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63   SQLite parses c
d0e0: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c  ompound SELECTs,
d0f0: 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
d100: 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79  al selects alway
d110: 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66  s group from lef
d120: 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73  t to right..*/.s
d130: 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
d140: 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
d150: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
d160: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
d170: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
d180: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
d190: 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
d1a0: 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
d1b0: 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 65  coded */.  int e
d1c0: 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Dest,           
d1d0: 20 2f 2a 20 5c 5f 5f 5f 20 20 53 74 6f 72 65 20   /* \___  Store 
d1e0: 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 61 73  query results as
d1f0: 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a 20 20   specified */.  
d200: 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20  int iParm,      
d210: 20 20 20 20 20 20 2f 2a 20 2f 20 20 20 20 20 62        /* /     b
d220: 79 20 74 68 65 73 65 20 74 77 6f 20 70 61 72 61  y these two para
d230: 6d 65 74 65 72 73 2e 20 20 20 20 20 20 20 20 20  meters.         
d240: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20  */.  char *aff  
d250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
d260: 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e   eDest is SRT_Un
d270: 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74  ion, the affinit
d280: 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  y string */.){. 
d290: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
d2a0: 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73  _OK;   /* Succes
d2b0: 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75  s code from a su
d2c0: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65  broutine */.  Se
d2d0: 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
d2e0: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
d2f0: 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
d300: 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
d310: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
d320: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
d330: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
d340: 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  s VDBE */.  int 
d350: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
d360: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
d370: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
d380: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78  sult set */.  Ex
d390: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
d3a0: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
d3b0: 20 42 59 20 63 6c 61 75 73 65 20 6f 6e 20 70 20   BY clause on p 
d3c0: 2a 2f 0a 20 20 69 6e 74 20 61 53 65 74 50 32 5b  */.  int aSetP2[
d3d0: 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  2];        /* Se
d3e0: 74 20 50 32 20 76 61 6c 75 65 20 6f 66 20 74 68  t P2 value of th
d3f0: 65 73 65 20 6f 70 20 74 6f 20 6e 75 6d 62 65 72  ese op to number
d400: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20   of columns */. 
d410: 20 69 6e 74 20 6e 53 65 74 50 32 20 3d 20 30 3b   int nSetP2 = 0;
d420: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d430: 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 61 53 65   of slots in aSe
d440: 74 50 32 5b 5d 20 75 73 65 64 20 2a 2f 0a 0a 20  tP2[] used */.. 
d450: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
d460: 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
d470: 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75  BY or LIMIT clau
d480: 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45  se on prior SELE
d490: 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20  CTs.  Only.  ** 
d4a0: 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d  the last (right-
d4b0: 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20  most) SELECT in 
d4c0: 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68  the series may h
d4d0: 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
d4e0: 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20  or LIMIT..  */. 
d4f0: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e   if( p==0 || p->
d500: 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
d510: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
d520: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
d530: 6e 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72  nd;.  }.  pPrior
d540: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
d550: 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
d560: 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72 69  pRightmost!=pPri
d570: 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  or );.  assert( 
d580: 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f  pPrior->pRightmo
d590: 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73  st==p->pRightmos
d5a0: 74 20 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f  t );.  if( pPrio
d5b0: 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  r->pOrderBy ){. 
d5c0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
d5d0: 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52  sg(pParse,"ORDER
d5e0: 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c   BY clause shoul
d5f0: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
d600: 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
d610: 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
d620: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
d630: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
d640: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
d650: 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72    }.  if( pPrior
d660: 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
d670: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d680: 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c  pParse,"LIMIT cl
d690: 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65  ause should come
d6a0: 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65   after %s not be
d6b0: 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c  fore",.      sel
d6c0: 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
d6d0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
d6e0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
d6f0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
d700: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
d710: 20 68 61 76 65 20 61 20 76 61 6c 69 64 20 71 75   have a valid qu
d720: 65 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66 20  ery engine.  If 
d730: 6e 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e 65  not, create a ne
d740: 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20  w one..  */.  v 
d750: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
d760: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
d770: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  v==0 ){.    rc =
d780: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
d790: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
d7a0: 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20   }..  /* Create 
d7b0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
d7c0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
d7d0: 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a  if necessary.  *
d7e0: 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
d7f0: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
d800: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
d810: 4c 69 73 74 20 29 3b 0a 20 20 20 20 61 73 73 65  List );.    asse
d820: 72 74 28 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f  rt( nSetP2<sizeo
d830: 66 28 61 53 65 74 50 32 29 2f 73 69 7a 65 6f 66  f(aSetP2)/sizeof
d840: 28 61 53 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20  (aSetP2[0]) );. 
d850: 20 20 20 61 53 65 74 50 32 5b 6e 53 65 74 50 32     aSetP2[nSetP2
d860: 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ++] = sqlite3Vdb
d870: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
d880: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 50 61 72  nEphemeral, iPar
d890: 6d 2c 20 30 29 3b 0a 20 20 20 20 65 44 65 73 74  m, 0);.    eDest
d8a0: 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20   = SRT_Table;.  
d8b0: 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
d8c0: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65   code for the le
d8d0: 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c  ft and right SEL
d8e0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
d8f0: 20 20 2a 2f 0a 20 20 70 4f 72 64 65 72 42 79 20    */.  pOrderBy 
d900: 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
d910: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
d920: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
d930: 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  L: {.      if( p
d940: 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
d950: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
d960: 20 30 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   0;.        asse
d970: 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69  rt( !pPrior->pLi
d980: 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  mit );.        p
d990: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20  Prior->pLimit = 
d9a0: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
d9b0: 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73     pPrior->pOffs
d9c0: 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
d9d0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
d9e0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
d9f0: 73 65 2c 20 70 50 72 69 6f 72 2c 20 65 44 65 73  se, pPrior, eDes
da00: 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20  t, iParm, 0, 0, 
da10: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20  0, aff);.       
da20: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
da30: 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73          p->pOffs
da40: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
da50: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
da60: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
da70: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
da80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
da90: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
daa0: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
dab0: 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
dac0: 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73          p->iOffs
dad0: 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66  et = pPrior->iOf
dae0: 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66  fset;.        if
daf0: 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29  ( p->iLimit>=0 )
db00: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 72  {.          addr
db10: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
db20: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a  dOp(v, OP_IfMemZ
db30: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
db40: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  0);.          Vd
db50: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
db60: 20 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c   Jump ahead if L
db70: 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b  IMIT reached"));
db80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
db90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
dba0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
dbb0: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30   eDest, iParm, 0
dbc0: 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
dbd0: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
dbe0: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
dbf0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
dc00: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
dc10: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
dc20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
dc30: 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20  f( addr ){.     
dc40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dc50: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
dc60: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
dc70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dc80: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72    }.      /* For
dc90: 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f   UNION ALL ... O
dca0: 52 44 45 52 20 42 59 20 66 61 6c 6c 20 74 68 72  RDER BY fall thr
dcb0: 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
dcc0: 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20   case */.    }. 
dcd0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
dce0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  T:.    case TK_U
dcf0: 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NION: {.      in
dd00: 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f  t unionTab;    /
dd10: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
dd20: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
dd30: 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72   table holding r
dd40: 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69  esult */.      i
dd50: 6e 74 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20  nt op = 0;      
dd60: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52  /* One of the SR
dd70: 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  T_ operations to
dd80: 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a   apply to self *
dd90: 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f  /.      int prio
dda0: 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rOp;     /* The 
ddb0: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74  SRT_ operation t
ddc0: 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72  o apply to prior
ddd0: 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20   selects */.    
dde0: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
ddf0: 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76  *pOffset; /* Sav
de00: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e  ed values of p->
de10: 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f  nLimit and p->nO
de20: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69  ffset */.      i
de30: 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20  nt addr;..      
de40: 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d  priorOp = p->op=
de50: 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61  =TK_ALL ? SRT_Ta
de60: 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b  ble : SRT_Union;
de70: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
de80: 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 70 4f 72  ==priorOp && pOr
de90: 64 65 72 42 79 3d 3d 30 20 26 26 20 21 70 2d 3e  derBy==0 && !p->
dea0: 70 4c 69 6d 69 74 20 26 26 20 21 70 2d 3e 70 4f  pLimit && !p->pO
deb0: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20  ffset ){.       
dec0: 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65   /* We can reuse
ded0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
dee0: 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  le generated by 
def0: 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a  a SELECT to our.
df00: 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74          ** right
df10: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
df20: 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
df30: 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  iParm;.      }el
df40: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  se{.        /* W
df50: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
df60: 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65  reate our own te
df70: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
df80: 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20   hold the.      
df90: 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74    ** intermediat
dfa0: 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20  e results..     
dfb0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
dfc0: 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d  ionTab = pParse-
dfd0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
dfe0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26   if( pOrderBy &&
dff0: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
e000: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c  olumn(pParse, p,
e010: 20 70 4f 72 64 65 72 42 79 2c 20 75 6e 69 6f 6e   pOrderBy, union
e020: 54 61 62 2c 31 29 20 29 7b 0a 20 20 20 20 20 20  Tab,1) ){.      
e030: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
e040: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
e050: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
e060: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
e070: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
e080: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
e090: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f  nEphemeral, unio
e0a0: 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
e0b0: 20 20 69 66 28 20 70 72 69 6f 72 4f 70 3d 3d 53    if( priorOp==S
e0c0: 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  RT_Table ){.    
e0d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 53        assert( nS
e0e0: 65 74 50 32 3c 73 69 7a 65 6f 66 28 61 53 65 74  etP2<sizeof(aSet
e0f0: 50 32 29 2f 73 69 7a 65 6f 66 28 61 53 65 74 50  P2)/sizeof(aSetP
e100: 32 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 20  2[0]) );.       
e110: 20 20 20 61 53 65 74 50 32 5b 6e 53 65 74 50 32     aSetP2[nSetP2
e120: 2b 2b 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  ++] = addr;.    
e130: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e140: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
e150: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
e160: 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  == -1 );.       
e170: 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
e180: 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[0] = addr;.  
e190: 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68          p->pRigh
e1a0: 74 6d 6f 73 74 2d 3e 75 73 65 73 45 70 68 6d 20  tmost->usesEphm 
e1b0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
e1c0: 20 20 20 20 20 20 20 63 72 65 61 74 65 53 6f 72         createSor
e1d0: 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65  tingIndex(pParse
e1e0: 2c 20 70 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , p, pOrderBy);.
e1f0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e200: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
e210: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
e220: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
e230: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
e240: 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20   left.      */. 
e250: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
e260: 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
e270: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
e280: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
e290: 65 2c 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72  e, pPrior, prior
e2a0: 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c  Op, unionTab, 0,
e2b0: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
e2c0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
e2d0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
e2e0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
e2f0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
e300: 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
e310: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
e320: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
e330: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
e340: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
e350: 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53  _EXCEPT:  op = S
e360: 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65  RT_Except;   bre
e370: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73  ak;.         cas
e380: 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70  e TK_UNION:   op
e390: 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20   = SRT_Union;   
e3a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
e3b0: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
e3c0: 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65    op = SRT_Table
e3d0: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
e3e0: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
e3f0: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
e400: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
e410: 20 20 20 20 20 20 70 2d 3e 64 69 73 61 6c 6c 6f        p->disallo
e420: 77 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  wOrderBy = pOrde
e430: 72 42 79 21 3d 30 3b 0a 20 20 20 20 20 20 70 4c  rBy!=0;.      pL
e440: 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
e450: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
e460: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
e470: 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
e480: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
e490: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  set = 0;.      r
e4a0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
e4b0: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c  t(pParse, p, op,
e4c0: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c   unionTab, 0, 0,
e4d0: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
e4e0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
e4f0: 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72  or;.      p->pOr
e500: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
e510: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
e520: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69  xprDelete(p->pLi
e530: 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
e540: 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
e550: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
e560: 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20   = pOffset;.    
e570: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31    p->iLimit = -1
e580: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  ;.      p->iOffs
e590: 65 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69  et = -1;.      i
e5a0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
e5b0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
e5c0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
e5d0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65  ..      /* Conve
e5e0: 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
e5f0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
e600: 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
e610: 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69   form.      ** i
e620: 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72  t is that we cur
e630: 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20  rently need..   
e640: 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20     */      .    
e650: 20 20 69 66 28 20 65 44 65 73 74 21 3d 70 72 69    if( eDest!=pri
e660: 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62  orOp || unionTab
e670: 21 3d 69 50 61 72 6d 20 29 7b 0a 20 20 20 20 20  !=iParm ){.     
e680: 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
e690: 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
e6a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
e6b0: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
e6c0: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
e6d0: 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
e6e0: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
e6f0: 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
e700: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69        while( pFi
e710: 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
e720: 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
e730: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Prior;.         
e740: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
e750: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
e760: 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
e770: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e780: 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
e790: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
e7a0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  (v);.        iCo
e7b0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
e7c0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
e7d0: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
e7e0: 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
e7f0: 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
e800: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e810: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
e820: 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
e830: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
e840: 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
e850: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
e860: 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 72 63  r(v);.        rc
e870: 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f   = selectInnerLo
e880: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
e890: 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61  >pEList, unionTa
e8a0: 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  b, p->pEList->nE
e8b0: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
e8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8d0: 20 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20    pOrderBy, -1, 
e8e0: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20  eDest, iParm, . 
e8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e900: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e              iCon
e910: 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20  t, iBreak, 0);. 
e920: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
e930: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
e940: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  1;.          got
e950: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
e960: 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
e970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e980: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
e990: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20   iCont);.       
e9a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e9b0: 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e  p(v, OP_Next, un
e9c0: 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b  ionTab, iStart);
e9d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e9e0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
e9f0: 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
ea00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ea10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
ea20: 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  e, unionTab, 0);
ea30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
ea40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
ea50: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
ea60: 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  T: {.      int t
ea70: 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20  ab1, tab2;.     
ea80: 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
ea90: 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
eaa0: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
eab0: 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  *pOffset;.      
eac0: 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20  int addr;..     
ead0: 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73   /* INTERSECT is
eae0: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
eaf0: 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65  the others since
eb00: 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20   it requires.   
eb10: 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72     ** two tempor
eb20: 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e  ary tables.  Hen
eb30: 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77  ce it has its ow
eb40: 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20  n case.  Begin. 
eb50: 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63       ** by alloc
eb60: 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73  ating the tables
eb70: 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20   we will need.. 
eb80: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61       */.      ta
eb90: 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b1 = pParse->nTa
eba0: 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20  b++;.      tab2 
ebb0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
ebc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
ebd0: 65 72 42 79 20 26 26 20 6d 61 74 63 68 4f 72 64  erBy && matchOrd
ebe0: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61  erbyToColumn(pPa
ebf0: 72 73 65 2c 70 2c 70 4f 72 64 65 72 42 79 2c 74  rse,p,pOrderBy,t
ec00: 61 62 31 2c 31 29 20 29 7b 0a 20 20 20 20 20 20  ab1,1) ){.      
ec10: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
ec20: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
ec30: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
ec40: 0a 20 20 20 20 20 20 63 72 65 61 74 65 53 6f 72  .      createSor
ec50: 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65  tingIndex(pParse
ec60: 2c 20 70 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , p, pOrderBy);.
ec70: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
ec80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ec90: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
eca0: 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  al, tab1, 0);.  
ecb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
ecc0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
ecd0: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
ece0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
ecf0: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70   = addr;.      p
ed00: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73  ->pRightmost->us
ed10: 65 73 45 70 68 6d 20 3d 20 31 3b 0a 20 20 20 20  esEphm = 1;.    
ed20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
ed30: 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ist );..      /*
ed40: 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
ed50: 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
ed60: 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
ed70: 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
ed80: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
ed90: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
eda0: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 53 52 54  rse, pPrior, SRT
edb0: 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c  _Union, tab1, 0,
edc0: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
edd0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
ede0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
edf0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
ee00: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
ee10: 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
ee20: 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f  ELECT into tempo
ee30: 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32  rary table "tab2
ee40: 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ".      */.     
ee50: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
ee60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
ee70: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
ee80: 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b2, 0);.      as
ee90: 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
eea0: 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29  nEphm[1] == -1 )
eeb0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
eec0: 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64  penEphm[1] = add
eed0: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
eee0: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  or = 0;.      pL
eef0: 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
ef00: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
ef10: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
ef20: 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
ef30: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
ef40: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  set = 0;.      r
ef50: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
ef60: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 53 52 54  t(pParse, p, SRT
ef70: 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 2c 20 30 2c  _Union, tab2, 0,
ef80: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
ef90: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
efa0: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c  Prior;.      sql
efb0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
efc0: 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
efd0: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
efe0: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  mit;.      p->pO
eff0: 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
f000: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
f010: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
f020: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
f030: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
f040: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
f050: 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65  to take the inte
f060: 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  rsection of the 
f070: 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  two temporary.  
f080: 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20      ** tables.. 
f090: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
f0a0: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
f0b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
f0c0: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
f0d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65   ){.        Sele
f0e0: 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
f0f0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
f100: 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
f110: 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
f120: 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
f130: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
f140: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
f150: 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
f160: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f170: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
f180: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
f190: 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73  .      iCont = s
f1a0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
f1b0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f  bel(v);.      co
f1c0: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
f1d0: 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
f1e0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
f1f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f200: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62  , OP_Rewind, tab
f210: 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  1, iBreak);.    
f220: 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
f230: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f240: 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20  P_RowKey, tab1, 
f250: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
f260: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f270: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c  _NotFound, tab2,
f280: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 72   iCont);.      r
f290: 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  c = selectInnerL
f2a0: 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
f2b0: 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20  ->pEList, tab1, 
f2c0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
f2d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
f2f0: 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65  OrderBy, -1, eDe
f300: 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20  st, iParm, .    
f310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f320: 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20           iCont, 
f330: 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20  iBreak, 0);.    
f340: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
f350: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
f360: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
f370: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
f380: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
f390: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
f3a0: 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
f3b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f3c0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74  Op(v, OP_Next, t
f3d0: 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  ab1, iStart);.  
f3e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
f3f0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
f400: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
f410: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f420: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
f430: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
f440: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f450: 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20  OP_Close, tab1, 
f460: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
f470: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
f480: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53   Make sure all S
f490: 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73 74  ELECTs in the st
f4a0: 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65  atement have the
f4b0: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
f4c0: 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e  elements.  ** in
f4d0: 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73 65   their result se
f4e0: 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ts..  */.  asser
f4f0: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  t( p->pEList && 
f500: 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29  pPrior->pEList )
f510: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  ;.  if( p->pELis
f520: 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72  t->nExpr!=pPrior
f530: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
f540: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
f550: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
f560: 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c  SELECTs to the l
f570: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66  eft and right of
f580: 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20   %s".      " do 
f590: 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  not have the sam
f5a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
f5b0: 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c  lt columns", sel
f5c0: 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
f5d0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
f5e0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
f5f0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
f600: 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62   /* Set the numb
f610: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
f620: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
f630: 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20  s.  */.  nCol = 
f640: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
f650: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53 65 74 50  ;.  while( nSetP
f660: 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  2 ){.    sqlite3
f670: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
f680: 61 53 65 74 50 32 5b 2d 2d 6e 53 65 74 50 32 5d  aSetP2[--nSetP2]
f690: 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20  , nCol);.  }..  
f6a0: 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
f6b0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
f6c0: 73 65 64 20 62 79 20 65 69 74 68 65 72 20 74 68  sed by either th
f6d0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
f6e0: 65 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61 6e 79  e or.  ** by any
f6f0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
f700: 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c  s needed to impl
f710: 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75  ement the compou
f720: 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20  nd select..  ** 
f730: 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e  Attach the KeyIn
f740: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  fo structure to 
f750: 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61  all temporary ta
f760: 62 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20 74 68  bles.  Invoke th
f770: 65 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20  e.  ** ORDER BY 
f780: 70 72 6f 63 65 73 73 69 6e 67 20 69 66 20 74 68  processing if th
f790: 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
f7a0: 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  BY clause..  **.
f7b0: 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f    ** This sectio
f7c0: 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20  n is run by the 
f7d0: 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43  right-most SELEC
f7e0: 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79  T statement only
f7f0: 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74  ..  ** SELECT st
f800: 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  atements to the 
f810: 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70  left always skip
f820: 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65   this part.  The
f830: 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
f840: 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c   SELECT might al
f850: 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  so skip this par
f860: 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f  t if it has no O
f870: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
f880: 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20  nd.  ** no temp 
f890: 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69  tables are requi
f8a0: 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  red..  */.  if( 
f8b0: 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e 75  pOrderBy || p->u
f8c0: 73 65 73 45 70 68 6d 20 29 7b 0a 20 20 20 20 69  sesEphm ){.    i
f8d0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f8f0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
f900: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
f910: 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yInfo;          
f920: 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
f930: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
f940: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
f950: 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b    Select *pLoop;
f960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f970: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
f980: 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74  hrough SELECT st
f990: 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  atements */.    
f9a0: 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20  int nKeyCol;    
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f9c0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
f9d0: 65 73 20 69 6e 20 70 4b 65 79 49 6e 66 6f 2d 3e  es in pKeyInfo->
f9e0: 61 43 6f 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f  aCol[] */.    Co
f9f0: 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
fa00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
fa10: 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
fa20: 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
fa30: 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  ll[] */.    Coll
fa40: 53 65 71 20 2a 2a 61 43 6f 70 79 3b 20 20 20 20  Seq **aCopy;    
fa50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
fa60: 6f 70 79 20 6f 66 20 70 4b 65 79 49 6e 66 6f 2d  opy of pKeyInfo-
fa70: 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 0a 20 20 20  >aColl[] */..   
fa80: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
fa90: 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20  htmost==p );.   
faa0: 20 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20   nKeyCol = nCol 
fab0: 2b 20 28 70 4f 72 64 65 72 42 79 20 3f 20 70 4f  + (pOrderBy ? pO
fac0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20  rderBy->nExpr : 
fad0: 30 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  0);.    pKeyInfo
fae0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
faf0: 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f  sizeof(*pKeyInfo
fb00: 29 2b 6e 4b 65 79 43 6f 6c 2a 28 73 69 7a 65 6f  )+nKeyCol*(sizeo
fb10: 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 31 29  f(CollSeq*) + 1)
fb20: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79  );.    if( !pKey
fb30: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  Info ){.      rc
fb40: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
fb50: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  .      goto mult
fb60: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
fb70: 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66    }..    pKeyInf
fb80: 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  o->enc = ENC(pPa
fb90: 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4b  rse->db);.    pK
fba0: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d  eyInfo->nField =
fbb0: 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28   nCol;..    for(
fbc0: 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79  i=0, apColl=pKey
fbd0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e  Info->aColl; i<n
fbe0: 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c  Col; i++, apColl
fbf0: 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f  ++){.      *apCo
fc00: 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
fc10: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
fc20: 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
fc30: 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20   0==*apColl ){. 
fc40: 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
fc50: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
fc60: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
fc70: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
fc80: 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
fc90: 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
fca0: 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
fcb0: 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
fcc0: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
fcd0: 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
fce0: 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
fcf0: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
fd00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
fd10: 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
fd20: 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
fd30: 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
fd40: 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
fd50: 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
fd60: 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
fd70: 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
fd80: 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
fd90: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
fda0: 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
fdb0: 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
fdc0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
fdd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fde0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
fdf0: 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
fe00: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
fe10: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
fe20: 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
fe30: 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  )pKeyInfo, P3_KE
fe40: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
fe50: 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
fe60: 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[i] = -1;.   
fe70: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
fe80: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
fe90: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
fea0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 54 65  rList_item *pOTe
feb0: 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  rm = pOrderBy->a
fec0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64  ;.      int nOrd
fed0: 65 72 42 79 45 78 70 72 20 3d 20 70 4f 72 64 65  erByExpr = pOrde
fee0: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
fef0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
ff00: 20 20 75 38 20 2a 70 53 6f 72 74 4f 72 64 65 72    u8 *pSortOrder
ff10: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 75 73  ;..      /* Reus
ff20: 65 20 74 68 65 20 73 61 6d 65 20 70 4b 65 79 49  e the same pKeyI
ff30: 6e 66 6f 20 66 6f 72 20 74 68 65 20 4f 52 44 45  nfo for the ORDE
ff40: 52 20 42 59 20 61 73 20 77 61 73 20 75 73 65 64  R BY as was used
ff50: 20 61 62 6f 76 65 20 66 6f 72 0a 20 20 20 20 20   above for.     
ff60: 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   ** the compound
ff70: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
ff80: 74 73 2e 20 20 45 78 63 65 70 74 20 77 65 20 68  ts.  Except we h
ff90: 61 76 65 20 74 6f 20 63 68 61 6e 67 65 20 6f 75  ave to change ou
ffa0: 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70  t the.      ** p
ffb0: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d  KeyInfo->aColl[]
ffc0: 20 76 61 6c 75 65 73 2e 20 20 53 6f 6d 65 20 6f   values.  Some o
ffd0: 66 20 74 68 65 20 61 43 6f 6c 6c 5b 5d 20 76 61  f the aColl[] va
ffe0: 6c 75 65 73 20 77 69 6c 6c 20 62 65 0a 20 20 20  lues will be.   
fff0: 20 20 20 2a 2a 20 72 65 75 73 65 64 20 77 68 65     ** reused whe
10000 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74  n constructing t
10010 68 65 20 70 4b 65 79 49 6e 66 6f 20 66 6f 72 20  he pKeyInfo for 
10020 74 68 65 20 4f 52 44 45 52 20 42 59 2c 20 73 6f  the ORDER BY, so
10030 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 61   make.      ** a
10040 20 63 6f 70 79 2e 20 20 53 75 66 66 69 63 69 65   copy.  Sufficie
10050 6e 74 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64  nt space to hold
10060 20 62 6f 74 68 20 74 68 65 20 6e 43 6f 6c 20 65   both the nCol e
10070 6e 74 72 69 65 73 20 66 6f 72 0a 20 20 20 20 20  ntries for.     
10080 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   ** the compound
10090 20 73 65 6c 65 63 74 20 61 6e 64 20 74 68 65 20   select and the 
100a0 6e 4f 72 64 65 72 62 79 45 78 70 72 20 65 6e 74  nOrderbyExpr ent
100b0 72 69 65 73 20 66 6f 72 20 74 68 65 20 4f 52 44  ries for the ORD
100c0 45 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 77  ER BY.      ** w
100d0 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f  as allocated abo
100e0 76 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  ve.  But we need
100f0 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 63 6f 6d   to move the com
10100 70 6f 75 6e 64 20 73 65 6c 65 63 74 0a 20 20 20  pound select.   
10110 20 20 20 2a 2a 20 65 6e 74 72 69 65 73 20 6f 75     ** entries ou
10120 74 20 6f 66 20 74 68 65 20 77 61 79 20 62 65 66  t of the way bef
10130 6f 72 65 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  ore constructing
10140 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 65 6e   the ORDER BY en
10150 74 72 69 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20  tries..      ** 
10160 4d 6f 76 65 20 74 68 65 20 63 6f 6d 70 6f 75 6e  Move the compoun
10170 64 20 73 65 6c 65 63 74 20 65 6e 74 72 69 65 73  d select entries
10180 20 69 6e 74 6f 20 61 43 6f 70 79 5b 5d 20 77 68   into aCopy[] wh
10190 65 72 65 20 74 68 65 79 20 63 61 6e 20 62 65 0a  ere they can be.
101a0 20 20 20 20 20 20 2a 2a 20 61 63 63 65 73 73 65        ** accesse
101b0 64 20 61 6e 64 20 72 65 75 73 65 64 20 77 68 65  d and reused whe
101c0 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74  n constructing t
101d0 68 65 20 4f 52 44 45 52 20 42 59 20 65 6e 74 72  he ORDER BY entr
101e0 69 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65  ies..      ** Be
101f0 63 61 75 73 65 20 6e 43 6f 6c 20 6d 69 67 68 74  cause nCol might
10200 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
10210 20 6f 72 20 6c 65 73 73 20 74 68 61 6e 20 6e 4f   or less than nO
10220 72 64 65 72 42 79 45 78 70 72 0a 20 20 20 20 20  rderByExpr.     
10230 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 75   ** we have to u
10240 73 65 20 6d 65 6d 6d 6f 76 65 28 29 20 77 68 65  se memmove() whe
10250 6e 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 70 79  n doing the copy
10260 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10270 20 61 43 6f 70 79 20 3d 20 26 70 4b 65 79 49 6e   aCopy = &pKeyIn
10280 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72  fo->aColl[nOrder
10290 42 79 45 78 70 72 5d 3b 0a 20 20 20 20 20 20 70  ByExpr];.      p
102a0 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b 65 79  SortOrder = pKey
102b0 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
102c0 20 3d 20 28 75 38 2a 29 26 61 43 6f 70 79 5b 6e   = (u8*)&aCopy[n
102d0 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 6d  Col];.      memm
102e0 6f 76 65 28 61 43 6f 70 79 2c 20 70 4b 65 79 49  ove(aCopy, pKeyI
102f0 6e 66 6f 2d 3e 61 43 6f 6c 6c 2c 20 6e 43 6f 6c  nfo->aColl, nCol
10300 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
10310 29 29 3b 0a 0a 20 20 20 20 20 20 61 70 43 6f 6c  ));..      apCol
10320 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  l = pKeyInfo->aC
10330 6f 6c 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  oll;.      for(i
10340 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 45 78  =0; i<nOrderByEx
10350 70 72 3b 20 69 2b 2b 2c 20 70 4f 54 65 72 6d 2b  pr; i++, pOTerm+
10360 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 2c 20 70 53 6f  +, apColl++, pSo
10370 72 74 4f 72 64 65 72 2b 2b 29 7b 0a 20 20 20 20  rtOrder++){.    
10380 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
10390 3d 20 70 4f 54 65 72 6d 2d 3e 70 45 78 70 72 3b  = pOTerm->pExpr;
103a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 45  .        if( (pE
103b0 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
103c0 45 78 70 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20  ExpCollate) ){. 
103d0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
103e0 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 21 3d 30   pExpr->pColl!=0
103f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 61   );.          *a
10400 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70  pColl = pExpr->p
10410 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65  Coll;.        }e
10420 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  lse{.          *
10430 61 70 43 6f 6c 6c 20 3d 20 61 43 6f 70 79 5b 70  apColl = aCopy[p
10440 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a  Expr->iColumn];.
10450 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10460 20 20 2a 70 53 6f 72 74 4f 72 64 65 72 20 3d 20    *pSortOrder = 
10470 70 4f 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65  pOTerm->sortOrde
10480 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
10490 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
104a0 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20  htmost==p );.   
104b0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
104c0 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 3e 3d 30  drOpenEphm[2]>=0
104d0 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d   );.      addr =
104e0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
104f0 5b 32 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [2];.      sqlit
10500 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
10510 2c 20 61 64 64 72 2c 20 70 2d 3e 70 45 4c 69 73  , addr, p->pELis
10520 74 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a 20 20 20  t->nExpr+2);.   
10530 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69     pKeyInfo->nFi
10540 65 6c 64 20 3d 20 6e 4f 72 64 65 72 42 79 45 78  eld = nOrderByEx
10550 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
10560 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
10570 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b   addr, (char*)pK
10580 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
10590 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
105a0 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b     pKeyInfo = 0;
105b0 0a 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 53  .      generateS
105c0 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20  ortTail(pParse, 
105d0 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  p, v, p->pEList-
105e0 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69  >nExpr, eDest, i
105f0 50 61 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Parm);.    }..  
10600 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4b 65    sqliteFree(pKe
10610 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c  yInfo);.  }..mul
10620 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  ti_select_end:. 
10630 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
10640 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
10650 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
10660 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ECT */..#ifndef 
10670 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
10680 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f  ./*.** Scan thro
10690 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69  ugh the expressi
106a0 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61  on pExpr.  Repla
106b0 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  ce every referen
106c0 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d  ce to.** a colum
106d0 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65  n in table numbe
106e0 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20  r iTable with a 
106f0 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c  copy of the iCol
10700 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20  umn-th.** entry 
10710 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74  in pEList.  (But
10720 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65   leave reference
10730 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63  s to the ROWID c
10740 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  olumn .** unchan
10750 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ged.).**.** This
10760 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74   routine is part
10770 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69   of the flatteni
10780 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41  ng procedure.  A
10790 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f   subquery.** who
107a0 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  se result set is
107b0 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69   defined by pELi
107c0 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e  st appears as en
107d0 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52  try in the.** FR
107e0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
107f0 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20  ELECT such that 
10800 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  the VDBE cursor 
10810 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74  assigned to that
10820 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20  .** FORM clause 
10830 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e  entry is iTable.
10840 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
10850 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72  ake the necessar
10860 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
10870 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69   pExpr so that i
10880 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c  t refers directl
10890 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20  y to the source 
108a0 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20  table.** of the 
108b0 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20  subquery rather 
108c0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
108d0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
108e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
108f0 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78 70  ubstExprList(Exp
10900 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72 4c  rList*,int,ExprL
10910 69 73 74 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61  ist*);  /* Forwa
10920 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69  rd Decl */.stati
10930 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65  c void substSele
10940 63 74 28 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74  ct(Select *, int
10950 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 20 20  , ExprList *);  
10960 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20  /* Forward Decl 
10970 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
10980 75 62 73 74 45 78 70 72 28 45 78 70 72 20 2a 70  ubstExpr(Expr *p
10990 45 78 70 72 2c 20 69 6e 74 20 69 54 61 62 6c 65  Expr, int iTable
109a0 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
109b0 73 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  st){.  if( pExpr
109c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
109d0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
109e0 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
109f0 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  r->iTable==iTabl
10a00 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
10a10 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
10a20 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
10a30 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
10a40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
10a50 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61  r *pNew;.      a
10a60 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
10a70 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
10a80 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  mn<pEList->nExpr
10a90 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
10aa0 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
10ab0 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
10ac0 68 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ht==0 && pExpr->
10ad0 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
10ae0 20 20 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d    pNew = pEList-
10af0 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  >a[pExpr->iColum
10b00 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  n].pExpr;.      
10b10 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20  assert( pNew!=0 
10b20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
10b30 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20  op = pNew->op;. 
10b40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
10b50 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a  pr->pLeft==0 );.
10b60 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65        pExpr->pLe
10b70 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
10b80 44 75 70 28 70 4e 65 77 2d 3e 70 4c 65 66 74 29  Dup(pNew->pLeft)
10b90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10ba0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
10bb0 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
10bc0 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
10bd0 33 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70  3ExprDup(pNew->p
10be0 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73  Right);.      as
10bf0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69  sert( pExpr->pLi
10c00 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  st==0 );.      p
10c10 45 78 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71  Expr->pList = sq
10c20 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
10c30 28 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20  (pNew->pList);. 
10c40 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
10c50 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c  le = pNew->iTabl
10c60 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  e;.      pExpr->
10c70 70 54 61 62 20 3d 20 70 4e 65 77 2d 3e 70 54 61  pTab = pNew->pTa
10c80 62 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  b;.      pExpr->
10c90 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e  iColumn = pNew->
10ca0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
10cb0 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65  Expr->iAgg = pNe
10cc0 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73  w->iAgg;.      s
10cd0 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
10ce0 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26  &pExpr->token, &
10cf0 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  pNew->token);.  
10d00 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
10d10 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 73 70 61  Copy(&pExpr->spa
10d20 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b  n, &pNew->span);
10d30 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 53  .      pExpr->pS
10d40 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
10d50 65 6c 65 63 74 44 75 70 28 70 4e 65 77 2d 3e 70  electDup(pNew->p
10d60 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 70  Select);.      p
10d70 45 78 70 72 2d 3e 66 6c 61 67 73 20 3d 20 70 4e  Expr->flags = pN
10d80 65 77 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ew->flags;.    }
10d90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75  .  }else{.    su
10da0 62 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70  bstExpr(pExpr->p
10db0 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  Left, iTable, pE
10dc0 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
10dd0 45 78 70 72 28 70 45 78 70 72 2d 3e 70 52 69 67  Expr(pExpr->pRig
10de0 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ht, iTable, pELi
10df0 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 53 65  st);.    substSe
10e00 6c 65 63 74 28 70 45 78 70 72 2d 3e 70 53 65 6c  lect(pExpr->pSel
10e10 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ect, iTable, pEL
10e20 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
10e30 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70  xprList(pExpr->p
10e40 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
10e50 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  List);.  }.}.sta
10e60 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
10e70 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
10e80 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69 54 61 62  *pList, int iTab
10e90 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45  le, ExprList *pE
10ea0 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
10eb0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
10ec0 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
10ed0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
10ee0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75  pr; i++){.    su
10ef0 62 73 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61  bstExpr(pList->a
10f00 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
10f10 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
10f20 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
10f30 62 73 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74  bstSelect(Select
10f40 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c   *p, int iTable,
10f50 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
10f60 74 29 7b 0a 20 20 69 66 28 20 21 70 20 29 20 72  t){.  if( !p ) r
10f70 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78  eturn;.  substEx
10f80 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
10f90 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
10fa0 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  );.  substExprLi
10fb0 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  st(p->pGroupBy, 
10fc0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
10fd0 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
10fe0 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54  (p->pOrderBy, iT
10ff0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
11000 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48   substExpr(p->pH
11010 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70  aving, iTable, p
11020 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
11030 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 69  xpr(p->pWhere, i
11040 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
11050 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
11060 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
11070 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 6e 64  _VIEW) */..#ifnd
11080 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
11090 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  IEW./*.** This r
110a0 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
110b0 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75  to flatten subqu
110c0 65 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74  eries in order t
110d0 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75  o speed.** execu
110e0 74 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e  tion.  It return
110f0 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
11100 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
11110 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a   no flattening.*
11120 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  * occurs..**.** 
11130 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  To understand th
11140 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61  e concept of fla
11150 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65  ttening, conside
11160 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  r the following.
11170 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  ** query:.**.** 
11180 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
11190 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53  M (SELECT x+y AS
111a0 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
111b0 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e   z<100) WHERE a>
111c0 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  5.**.** The defa
111d0 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65  ult way of imple
111e0 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65  menting this que
111f0 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65  ry is to execute
11200 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79   the.** subquery
11210 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65   first and store
11220 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
11230 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
11240 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74  e, then.** run t
11250 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f  he outer query o
11260 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79  n that temporary
11270 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65   table.  This re
11280 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61  quires two.** pa
11290 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61  sses over the da
112a0 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65  ta.  Furthermore
112b0 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65  , because the te
112c0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a  mporary table.**
112d0 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c   has no indices,
112e0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
112f0 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71  e on the outer q
11300 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  uery cannot be.*
11310 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a  * optimized..**.
11320 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11330 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72  attempts to rewr
11340 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68  ite queries such
11350 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e   as the above in
11360 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66  to.** a single f
11370 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65  lat select, like
11380 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
11390 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61   SELECT x+y AS a
113a0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
113b0 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a  <100 AND a>5.**.
113c0 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
113d0 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73  rated for this s
113e0 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76  impification giv
113f0 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  es the same resu
11400 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68  lt.** but only h
11410 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64  as to scan the d
11420 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62  ata once.  And b
11430 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d  ecause indices m
11440 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f  ight .** exist o
11450 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20  n the table t1, 
11460 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20  a complete scan 
11470 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68  of the data migh
11480 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e  t be.** avoided.
11490 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e  .**.** Flattenin
114a0 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  g is only attemp
114b0 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  ted if all of th
114c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
114d0 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  true:.**.**   (1
114e0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
114f0 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
11500 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
11510 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a  use aggregates..
11520 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65  **.**   (2)  The
11530 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
11540 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
11550 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
11560 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
11570 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65  **.**   (3)  The
11580 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
11590 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
115a0 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
115b0 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20  er join, or.**  
115c0 20 20 20 20 20 20 74 68 65 20 73 75 62 71 75 65        the subque
115d0 72 79 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66  ry is not itself
115e0 20 61 20 6a 6f 69 6e 2e 20 20 28 54 69 63 6b 65   a join.  (Ticke
115f0 74 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20  t #306).**.**   
11600 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
11610 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
11620 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
11630 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
11640 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20  in..**.**   (5) 
11650 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
11660 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72   not DISTINCT or
11670 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
11680 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
11690 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74          aggregat
116a0 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20  es..**.**   (6) 
116b0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
116c0 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
116d0 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
116e0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a  er query is not.
116f0 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
11700 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20  CT..**.**   (7) 
11710 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61   The subquery ha
11720 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  s a FROM clause.
11730 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68  .**.**   (8)  Th
11740 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
11750 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
11760 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
11770 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
11780 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65  **.**   (9)  The
11790 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
117a0 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
117b0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
117c0 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  does not use.** 
117d0 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65         aggregate
117e0 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20  s..**.**  (10)  
117f0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
11800 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
11810 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
11820 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
11830 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c  .**        use L
11840 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31  IMIT..**.**  (11
11850 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
11860 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
11870 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
11880 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c  have ORDER BY cl
11890 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  auses..**.**  (1
118a0 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
118b0 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
118c0 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54  t term of a LEFT
118d0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 6f 72 20 74   OUTER JOIN or t
118e0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  he.**        sub
118f0 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45  query has no WHE
11900 52 45 20 63 6c 61 75 73 65 2e 20 20 28 61 64 64  RE clause.  (add
11910 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35  ed by ticket #35
11920 30 29 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20  0).**.**  (13)  
11930 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
11940 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
11950 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d  not both use LIM
11960 49 54 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20  IT.**.**  (14)  
11970 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
11980 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54  s not use OFFSET
11990 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54 68  .**.**  (15)  Th
119a0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
119b0 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 63   not part of a c
119c0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f  ompound select o
119d0 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  r the.**        
119e0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
119f0 74 20 68 61 76 65 20 62 6f 74 68 20 61 6e 20 4f  t have both an O
11a00 52 44 45 52 20 42 59 20 61 6e 64 20 61 20 4c 49  RDER BY and a LI
11a10 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20  MIT clause..**  
11a20 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65        (See ticke
11a30 74 20 23 32 33 33 39 29 0a 2a 2a 0a 2a 2a 20 49  t #2339).**.** I
11a40 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  n this routine, 
11a50 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  the "p" paramete
11a60 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
11a70 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
11a80 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65  y..** The subque
11a90 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61  ry is p->pSrc->a
11aa0 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20  [iFrom].  isAgg 
11ab0 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
11ac0 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73  uter query.** us
11ad0 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e  es aggregates an
11ae0 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  d subqueryIsAgg 
11af0 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73  is true if the s
11b00 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
11b10 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  regates..**.** I
11b20 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
11b30 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74  not attempted, t
11b40 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
11b50 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72   no-op and retur
11b60 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74  ns 0..** If flat
11b70 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70  tening is attemp
11b80 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ted this routine
11b90 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a   returns 1..**.*
11ba0 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70  * All of the exp
11bb0 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
11bc0 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62   must occur on b
11bd0 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75  oth the outer qu
11be0 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ery and.** the s
11bf0 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74  ubquery before t
11c00 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
11c10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11c20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
11c30 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
11c40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
11c50 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53  arent or outer S
11c60 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
11c70 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
11c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
11c90 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61  ex in p->pSrc->a
11ca0 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  [] of the inner 
11cb0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
11cc0 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20  t isAgg,        
11cd0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75     /* True if ou
11ce0 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20  ter SELECT uses 
11cf0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
11d00 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62  ons */.  int sub
11d10 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a  queryIsAgg    /*
11d20 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62   True if the sub
11d30 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
11d40 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
11d50 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
11d60 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Sub;       /* Th
11d70 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72  e inner query or
11d80 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20   "subquery" */. 
11d90 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
11da0 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
11db0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
11dc0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
11dd0 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63  SrcList *pSubSrc
11de0 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
11df0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
11e00 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72  bquery */.  Expr
11e10 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
11e20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
11e30 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  t of the outer q
11e40 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50  uery */.  int iP
11e50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  arent;        /*
11e60 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
11e70 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20  ber of the pSub 
11e80 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20  result set temp 
11e90 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
11ea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
11eb0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
11ec0 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
11ed0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11ee0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
11ef0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
11f00 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
11f10 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f  m *pSubitem;   /
11f20 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 2a  * The subquery *
11f30 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  /..  /* Check to
11f40 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69   see if flatteni
11f50 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
11f60 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
11f70 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d  t..  */.  if( p=
11f80 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
11f90 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
11fa0 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
11fb0 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69  && iFrom>=0 && i
11fc0 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20  From<pSrc->nSrc 
11fd0 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20  );.  pSubitem = 
11fe0 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b  &pSrc->a[iFrom];
11ff0 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
12000 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
12010 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
12020 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  ;.  if( isAgg &&
12030 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
12040 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
12050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
12060 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a  striction (1)  *
12070 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  /.  if( subquery
12080 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e  IsAgg && pSrc->n
12090 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30  Src>1 ) return 0
120a0 3b 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 20 28 32 29 20 20 2a  striction (2)  *
120c0 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  /.  pSubSrc = pS
120d0 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
120e0 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
120f0 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72   /* Prior to ver
12100 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e  sion 3.1.2, when
12110 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
12120 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70  T had to be simp
12130 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20  le constants,.  
12140 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79  ** not arbitrary
12150 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77   expresssions, w
12160 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
12170 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
12180 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
12190 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
121a0 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
121b0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
121c0 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
121d0 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
121e0 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
121f0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
12200 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
12210 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
12220 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
12230 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
12240 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
12250 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
12260 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
12270 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
12280 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
12290 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20  pSub->pOffset ) 
122a0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
122b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122c0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
122d0 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
122e0 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26  p->pRightmost &&
122f0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
12300 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
12310 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12350 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20  estriction (15) 
12360 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  */.  }.  if( pSu
12370 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20  bSrc->nSrc==0 ) 
12380 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
12390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123a0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
123b0 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53  7)  */.  if( (pS
123c0 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c  ub->isDistinct |
123d0 7c 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 29 20  | pSub->pLimit) 
123e0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 53  .         && (pS
123f0 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73  rc->nSrc>1 || is
12400 41 67 67 29 20 29 7b 20 20 20 20 20 20 20 20 20  Agg) ){         
12410 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
12420 20 28 34 29 28 35 29 28 38 29 28 39 29 20 2a 2f   (4)(5)(8)(9) */
12430 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
12440 20 20 20 20 20 20 0a 20 20 7d 0a 20 20 69 66 28        .  }.  if(
12450 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26   p->isDistinct &
12460 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
12470 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
12480 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
12490 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 69 66 28  on (6)  */.  if(
124a0 20 28 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64   (p->disallowOrd
124b0 65 72 42 79 20 7c 7c 20 70 2d 3e 70 4f 72 64 65  erBy || p->pOrde
124c0 72 42 79 29 20 26 26 20 70 53 75 62 2d 3e 70 4f  rBy) && pSub->pO
124d0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72  rderBy ){.     r
124e0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
124f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12510 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
12520 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 0a 20  n (11) */.  }.. 
12530 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
12540 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3:  If the subqu
12550 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d  ery is a join, m
12560 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
12570 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e  query is .  ** n
12580 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72  ot used as the r
12590 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
125a0 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20  an outer join.  
125b0 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  Examples of why 
125c0 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  this.  ** is not
125d0 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
125e0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
125f0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
12600 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a  t2 JOIN t3).  **
12610 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
12620 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
12630 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
12640 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
12650 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
12660 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20  N t2) JOIN t3.  
12670 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  **.  ** which is
12680 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20   not at all the 
12690 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f  same thing..  */
126a0 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
126b0 6e 53 72 63 3e 31 20 26 26 20 28 70 53 75 62 69  nSrc>1 && (pSubi
126c0 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
126d0 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a  JT_OUTER)!=0 ){.
126e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
126f0 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74  }..  /* Restrict
12700 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20  ion 12:  If the 
12710 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
12720 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
12730 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20   a left outer.  
12740 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75  ** join, make su
12750 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
12760 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  has no WHERE cla
12770 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61  use..  ** An exa
12780 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
12790 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  s is not allowed
127a0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
127b0 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
127c0 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a  R JOIN (SELECT *
127d0 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74   FROM t2 WHERE t
127e0 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a  2.x>0).  **.  **
127f0 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
12800 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
12810 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
12820 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
12830 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
12840 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20   WHERE t2.x>0.  
12850 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20  **.  ** But the 
12860 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c  t2.x>0 test will
12870 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20   always fail on 
12880 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32  a NULL row of t2
12890 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66  , which.  ** eff
128a0 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74  ectively convert
128b0 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e  s the OUTER JOIN
128c0 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a   into an INNER J
128d0 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  OIN..  */.  if( 
128e0 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74  (pSubitem->joint
128f0 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
12900 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 57 68 65  =0 && pSub->pWhe
12910 72 65 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  re!=0 ){.    ret
12920 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
12930 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
12940 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
12950 73 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  s flattening is 
12960 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20 74 68  permitted for th
12970 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20  e.  ** iFrom-th 
12980 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
12990 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
129a0 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
129b0 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c  /..  /* Move all
129c0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65   of the FROM ele
129d0 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62  ments of the sub
129e0 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
129f0 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
12a00 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
12a10 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20   query.  Before 
12a20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65  doing this, reme
12a30 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75  mber.  ** the cu
12a40 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
12a50 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74  the original out
12a60 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c  er query FROM el
12a70 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50  ement in.  ** iP
12a80 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72  arent.  The iPar
12a90 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ent cursor will 
12aa0 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20  never be used.  
12ab0 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a  Subsequent code.
12ac0 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65    ** will scan e
12ad0 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69  xpressions looki
12ae0 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72  ng for iParent r
12af0 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65  eferences and re
12b00 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65  place.  ** those
12b10 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68   references with
12b20 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
12b30 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65  t resolve to the
12b40 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20   subquery FROM. 
12b50 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20   ** elements we 
12b60 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20  are now copying 
12b70 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65  in..  */.  iPare
12b80 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69  nt = pSubitem->i
12b90 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20  Cursor;.  {.    
12ba0 69 6e 74 20 6e 53 75 62 53 72 63 20 3d 20 70 53  int nSubSrc = pS
12bb0 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20  ubSrc->nSrc;.   
12bc0 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
12bd0 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
12be0 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  pe;..    sqlite3
12bf0 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53 75 62  DeleteTable(pSub
12c00 69 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  item->pTab);.   
12c10 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 75 62   sqliteFree(pSub
12c20 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  item->zDatabase)
12c30 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
12c40 28 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65  (pSubitem->zName
12c50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
12c60 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69  e(pSubitem->zAli
12c70 61 73 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 75  as);.    if( nSu
12c80 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  bSrc>1 ){.      
12c90 69 6e 74 20 65 78 74 72 61 20 3d 20 6e 53 75 62  int extra = nSub
12ca0 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 20 20 66  Src - 1;.      f
12cb0 6f 72 28 69 3d 31 3b 20 69 3c 6e 53 75 62 53 72  or(i=1; i<nSubSr
12cc0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  c; i++){.       
12cd0 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53   pSrc = sqlite3S
12ce0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 53 72  rcListAppend(pSr
12cf0 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  c, 0, 0);.      
12d00 7d 0a 20 20 20 20 20 20 70 2d 3e 70 53 72 63 20  }.      p->pSrc 
12d10 3d 20 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f  = pSrc;.      fo
12d20 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31  r(i=pSrc->nSrc-1
12d30 3b 20 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f 6d  ; i-extra>=iFrom
12d40 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  ; i--){.        
12d50 70 53 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53 72  pSrc->a[i] = pSr
12d60 63 2d 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a 20  c->a[i-extra];. 
12d70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
12d80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
12d90 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
12da0 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
12db0 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69  ] = pSubSrc->a[i
12dc0 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ];.      memset(
12dd0 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20  &pSubSrc->a[i], 
12de0 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72  0, sizeof(pSubSr
12df0 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d  c->a[i]));.    }
12e00 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72  .    pSrc->a[iFr
12e10 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a  om].jointype = j
12e20 6f 69 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20  ointype;.  }..  
12e30 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62  /* Now begin sub
12e40 73 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65  stituting subque
12e50 72 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78  ry result set ex
12e60 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20  pressions for . 
12e70 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
12e80 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
12e90 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
12ea0 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61  ..  ** .  ** Exa
12eb0 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
12ec0 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a    SELECT a+5, b*
12ed0 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  10 FROM (SELECT 
12ee0 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41  x*3 AS a, y+10 A
12ef0 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45  S b FROM t1) WHE
12f00 52 45 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c  RE a>b;.  **   \
12f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
12f30 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f  ___ subquery ___
12f40 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
12f50 20 20 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f    /.  **    \___
12f60 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
12f70 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f  __ outer query _
12f80 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
12f90 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20  _____________/. 
12fa0 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b   **.  ** We look
12fb0 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
12fc0 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
12fd0 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
12fe0 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
12ff0 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74   ** "a" we subst
13000 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20  itute "x*3" and 
13010 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
13020 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69  ee "b" we substi
13030 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a  tute "y+10"..  *
13040 2f 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70  /.  pList = p->p
13050 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30  EList;.  for(i=0
13060 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
13070 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
13080 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28   *pExpr;.    if(
13090 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
130a0 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70 72 20  me==0 && (pExpr 
130b0 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
130c0 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20  xpr)->span.z!=0 
130d0 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  ){.      pList->
130e0 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[i].zName = sql
130f0 69 74 65 53 74 72 4e 44 75 70 28 28 63 68 61 72  iteStrNDup((char
13100 2a 29 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c  *)pExpr->span.z,
13110 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b   pExpr->span.n);
13120 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 75 62  .    }.  }.  sub
13130 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45  stExprList(p->pE
13140 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70  List, iParent, p
13150 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
13160 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20  if( isAgg ){.   
13170 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
13180 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72  ->pGroupBy, iPar
13190 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
131a0 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
131b0 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  r(p->pHaving, iP
131c0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
131d0 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ist);.  }.  if( 
131e0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
131f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
13200 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
13210 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
13220 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  = pSub->pOrderBy
13230 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64  ;.    pSub->pOrd
13240 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  erBy = 0;.  }els
13250 65 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42  e if( p->pOrderB
13260 79 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  y ){.    substEx
13270 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
13280 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
13290 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  b->pEList);.  }.
132a0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65    if( pSub->pWhe
132b0 72 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65  re ){.    pWhere
132c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
132d0 70 28 70 53 75 62 2d 3e 70 57 68 65 72 65 29 3b  p(pSub->pWhere);
132e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57  .  }else{.    pW
132f0 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  here = 0;.  }.  
13300 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
13310 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  g ){.    assert(
13320 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29   p->pHaving==0 )
13330 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67  ;.    p->pHaving
13340 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
13350 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57    p->pWhere = pW
13360 68 65 72 65 3b 0a 20 20 20 20 73 75 62 73 74 45  here;.    substE
13370 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  xpr(p->pHaving, 
13380 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
13390 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
133a0 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
133b0 45 78 70 72 41 6e 64 28 70 2d 3e 70 48 61 76 69  ExprAnd(p->pHavi
133c0 6e 67 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44  ng, sqlite3ExprD
133d0 75 70 28 70 53 75 62 2d 3e 70 48 61 76 69 6e 67  up(pSub->pHaving
133e0 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ));.    assert( 
133f0 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  p->pGroupBy==0 )
13400 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42  ;.    p->pGroupB
13410 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
13420 69 73 74 44 75 70 28 70 53 75 62 2d 3e 70 47 72  istDup(pSub->pGr
13430 6f 75 70 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  oupBy);.  }else{
13440 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
13450 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e  ->pWhere, iParen
13460 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
13470 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20  ;.    p->pWhere 
13480 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
13490 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65  (p->pWhere, pWhe
134a0 72 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  re);.  }..  /* T
134b0 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65  he flattened que
134c0 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69  ry is distinct i
134d0 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e  f either the inn
134e0 65 72 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f  er or the.  ** o
134f0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69  uter query is di
13500 73 74 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20  stinct. .  */.  
13510 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20  p->isDistinct = 
13520 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c  p->isDistinct ||
13530 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63   pSub->isDistinc
13540 74 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 45  t;..  /*.  ** SE
13550 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53  LECT ... FROM (S
13560 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20  ELECT ... LIMIT 
13570 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49  a OFFSET b) LIMI
13580 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20  T x OFFSET y;.  
13590 2a 2a 0a 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74  **.  ** One is t
135a0 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f  empted to try to
135b0 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20   add a and b to 
135c0 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69  combine the limi
135d0 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20  ts.  But this.  
135e0 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  ** does not work
135f0 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74   if either limit
13600 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20   is negative..  
13610 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
13620 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e  Limit ){.    p->
13630 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70  pLimit = pSub->p
13640 4c 69 6d 69 74 3b 0a 20 20 20 20 70 53 75 62 2d  Limit;.    pSub-
13650 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d  >pLimit = 0;.  }
13660 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c  ..  /* Finially,
13670 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20   delete what is 
13680 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71  left of the subq
13690 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a  uery and return.
136a0 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20    ** success..  
136b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  */.  sqlite3Sele
136c0 63 74 44 65 6c 65 74 65 28 70 53 75 62 29 3b 0a  ctDelete(pSub);.
136d0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
136e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
136f0 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a  MIT_VIEW */../*.
13700 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53  ** Analyze the S
13710 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
13720 70 61 73 73 65 64 20 69 6e 20 61 73 20 61 6e 20  passed in as an 
13730 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20  argument to see 
13740 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20 73 69  if it.** is a si
13750 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61  mple min() or ma
13760 78 28 29 20 71 75 65 72 79 2e 20 20 49 66 20 69  x() query.  If i
13770 74 20 69 73 20 61 6e 64 20 74 68 69 73 20 71 75  t is and this qu
13780 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61  ery can be.** sa
13790 74 69 73 66 69 65 64 20 75 73 69 6e 67 20 61 20  tisfied using a 
137a0 73 69 6e 67 6c 65 20 73 65 65 6b 20 74 6f 20 74  single seek to t
137b0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20  he beginning or 
137c0 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c  end of an index,
137d0 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72 61 74  .** then generat
137e0 65 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74  e the code for t
137f0 68 69 73 20 53 45 4c 45 43 54 20 61 6e 64 20 72  his SELECT and r
13800 65 74 75 72 6e 20 31 2e 20 20 49 66 20 74 68 69  eturn 1.  If thi
13810 73 20 69 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73  s is not a .** s
13820 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d  imple min() or m
13830 61 78 28 29 20 71 75 65 72 79 2c 20 74 68 65 6e  ax() query, then
13840 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a   return 0;.**.**
13850 20 41 20 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20   A simply min() 
13860 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 20 6c  or max() query l
13870 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ooks like this:.
13880 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
13890 6d 69 6e 28 61 29 20 46 52 4f 4d 20 74 61 62 6c  min(a) FROM tabl
138a0 65 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  e;.**    SELECT 
138b0 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 61 62 6c  max(a) FROM tabl
138c0 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65  e;.**.** The que
138d0 72 79 20 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79  ry may have only
138e0 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
138f0 69 6e 20 69 74 73 20 46 52 4f 4d 20 61 72 67 75  in its FROM argu
13900 6d 65 6e 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ment.  There.** 
13910 63 61 6e 20 62 65 20 6e 6f 20 47 52 4f 55 50 20  can be no GROUP 
13920 42 59 20 6f 72 20 48 41 56 49 4e 47 20 6f 72 20  BY or HAVING or 
13930 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 20  WHERE clauses.  
13940 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d  The result set m
13950 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69  ust.** be the mi
13960 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 6f 66 20  n() or max() of 
13970 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
13980 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54  of the table.  T
13990 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20  he column.** in 
139a0 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
139b0 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
139c0 20 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a   be indexed..**.
139d0 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  ** The parameter
139e0 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  s to this routin
139f0 65 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  e are the same a
13a00 73 20 66 6f 72 20 73 71 6c 69 74 65 33 53 65 6c  s for sqlite3Sel
13a10 65 63 74 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68  ect()..** See th
13a20 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
13a30 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65   on that routine
13a40 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
13a50 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
13a60 73 74 61 74 69 63 20 69 6e 74 20 73 69 6d 70 6c  static int simpl
13a70 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 50 61 72  eMinMaxQuery(Par
13a80 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
13a90 63 74 20 2a 70 2c 20 69 6e 74 20 65 44 65 73 74  ct *p, int eDest
13aa0 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20  , int iParm){.  
13ab0 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 69  Expr *pExpr;.  i
13ac0 6e 74 20 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65  nt iCol;.  Table
13ad0 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
13ae0 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 62 61 73  *pIdx;.  int bas
13af0 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  e;.  Vdbe *v;.  
13b00 69 6e 74 20 73 65 65 6b 4f 70 3b 0a 20 20 45 78  int seekOp;.  Ex
13b10 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
13b20 2a 70 4c 69 73 74 2c 20 65 4c 69 73 74 3b 0a 20  *pList, eList;. 
13b30 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
13b40 5f 69 74 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b  _item eListItem;
13b50 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
13b60 3b 0a 20 20 69 6e 74 20 62 72 6b 3b 0a 20 20 69  ;.  int brk;.  i
13b70 6e 74 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 43 68  nt iDb;..  /* Ch
13b80 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
13b90 69 73 20 71 75 65 72 79 20 69 73 20 61 20 73 69  is query is a si
13ba0 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61  mple min() or ma
13bb0 78 28 29 20 71 75 65 72 79 2e 20 20 52 65 74 75  x() query.  Retu
13bc0 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20  rn.  ** zero if 
13bd0 69 74 20 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f  it is  not..  */
13be0 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70  .  if( p->pGroup
13bf0 42 79 20 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67  By || p->pHaving
13c00 20 7c 7c 20 70 2d 3e 70 57 68 65 72 65 20 29 20   || p->pWhere ) 
13c10 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63  return 0;.  pSrc
13c20 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66   = p->pSrc;.  if
13c30 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ( pSrc->nSrc!=1 
13c40 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45  ) return 0;.  pE
13c50 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
13c60 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e  ;.  if( pEList->
13c70 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
13c80 6e 20 30 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  n 0;.  pExpr = p
13c90 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
13ca0 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  r;.  if( pExpr->
13cb0 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
13cc0 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ION ) return 0;.
13cd0 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d    pList = pExpr-
13ce0 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c  >pList;.  if( pL
13cf0 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d  ist==0 || pList-
13d00 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
13d10 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
13d20 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20  r->token.n!=3 ) 
13d30 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
13d40 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
13d50 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
13d60 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d  ken.z,"min",3)==
13d70 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20  0 ){.    seekOp 
13d80 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d  = OP_Rewind;.  }
13d90 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
13da0 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
13db0 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22  pExpr->token.z,"
13dc0 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20  max",3)==0 ){.  
13dd0 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61    seekOp = OP_La
13de0 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  st;.  }else{.   
13df0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
13e00 20 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e   pExpr = pList->
13e10 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[0].pExpr;.  if
13e20 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
13e30 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
13e40 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78 70  0;.  iCol = pExp
13e50 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54  r->iColumn;.  pT
13e60 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e  ab = pSrc->a[0].
13e70 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  pTab;..  /* This
13e80 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
13e90 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74  nnot be used wit
13ea0 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  h virtual tables
13eb0 2e 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72  . */.  if( IsVir
13ec0 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
13ed0 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  urn 0;..  /* If 
13ee0 77 65 20 67 65 74 20 74 6f 20 68 65 72 65 2c 20  we get to here, 
13ef0 69 74 20 6d 65 61 6e 73 20 74 68 65 20 71 75 65  it means the que
13f00 72 79 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72  ry is of the cor
13f10 72 65 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20  rect form..  ** 
13f20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
13f30 72 65 20 77 65 20 68 61 76 65 20 61 6e 20 69 6e  re we have an in
13f40 64 65 78 20 61 6e 64 20 6d 61 6b 65 20 70 49 64  dex and make pId
13f50 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20  x point to the. 
13f60 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20   ** appropriate 
13f70 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20 6d  index.  If the m
13f80 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73  in() or max() is
13f90 20 6f 6e 20 61 6e 20 49 4e 54 45 47 45 52 20 50   on an INTEGER P
13fa0 52 49 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20  RIMARY.  ** key 
13fb0 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78  column, no index
13fc0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f   is necessary so
13fd0 20 73 65 74 20 70 49 64 78 20 74 6f 20 4e 55 4c   set pIdx to NUL
13fe0 4c 2e 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75  L.  If no.  ** u
13ff0 73 61 62 6c 65 20 69 6e 64 65 78 20 69 73 20 66  sable index is f
14000 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a  ound, return 0..
14010 20 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c    */.  if( iCol<
14020 30 20 29 7b 0a 20 20 20 20 70 49 64 78 20 3d 20  0 ){.    pIdx = 
14030 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
14040 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
14050 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
14060 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
14070 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  r);.    if( pCol
14080 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
14090 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
140a0 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
140b0 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
140c0 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
140d0 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
140e0 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=1 );.      if(
140f0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
14100 30 5d 3d 3d 69 43 6f 6c 20 26 26 20 0a 20 20 20  0]==iCol && .   
14110 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65         0==sqlite
14120 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 61  3StrICmp(pIdx->a
14130 7a 43 6f 6c 6c 5b 30 5d 2c 20 70 43 6f 6c 6c 2d  zColl[0], pColl-
14140 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  >zName) ){.     
14150 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14160 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
14170 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e  pIdx==0 ) return
14180 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64   0;.  }..  /* Id
14190 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 74 79  entify column ty
141a0 70 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62  pes if we will b
141b0 65 20 75 73 69 6e 67 20 74 68 65 20 63 61 6c 6c  e using the call
141c0 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  back.  This.  **
141d0 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64   step is skipped
141e0 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   if the output i
141f0 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61 62  s going to a tab
14200 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63  le or a memory c
14210 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65 20 63 6f  ell..  ** The co
14220 6c 75 6d 6e 20 6e 61 6d 65 73 20 68 61 76 65 20  lumn names have 
14230 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65 6e  already been gen
14240 65 72 61 74 65 64 20 69 6e 20 74 68 65 20 63 61  erated in the ca
14250 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
14260 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
14270 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
14280 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
14290 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
142a0 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
142b0 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
142c0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
142d0 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
142e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  ..  */.  if( eDe
142f0 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
14300 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
14310 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
14320 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 50  penEphemeral, iP
14330 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20  arm, 1);.  }..  
14340 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 63 6f  /* Generating co
14350 64 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d  de to find the m
14360 69 6e 20 6f 72 20 74 68 65 20 6d 61 78 2e 20 20  in or the max.  
14370 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c 20 77 65  Basically all we
14380 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f   have.  ** to do
14390 20 69 73 20 66 69 6e 64 20 74 68 65 20 66 69 72   is find the fir
143a0 73 74 20 6f 72 20 74 68 65 20 6c 61 73 74 20 65  st or the last e
143b0 6e 74 72 79 20 69 6e 20 74 68 65 20 63 68 6f 73  ntry in the chos
143c0 65 6e 20 69 6e 64 65 78 2e 20 20 49 66 0a 20 20  en index.  If.  
143d0 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20  ** the min() or 
143e0 6d 61 78 28 29 20 69 73 20 6f 6e 20 74 68 65 20  max() is on the 
143f0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
14400 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e 64 20 74  KEY, then find t
14410 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 6f 72  he first.  ** or
14420 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
14430 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 20  he main table.. 
14440 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   */.  iDb = sqli
14450 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
14460 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
14470 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61  b->pSchema);.  a
14480 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 7c 7c  ssert( iDb>=0 ||
14490 20 70 54 61 62 2d 3e 69 73 45 70 68 65 6d 20 29   pTab->isEphem )
144a0 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56  ;.  sqlite3CodeV
144b0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
144c0 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  se, iDb);.  sqli
144d0 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
144e0 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
144f0 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
14500 4e 61 6d 65 29 3b 0a 20 20 62 61 73 65 20 3d 20  Name);.  base = 
14510 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  pSrc->a[0].iCurs
14520 6f 72 3b 0a 20 20 62 72 6b 20 3d 20 73 71 6c 69  or;.  brk = sqli
14530 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14540 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69  (v);.  computeLi
14550 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
14560 72 73 65 2c 20 70 2c 20 62 72 6b 29 3b 0a 20 20  rse, p, brk);.  
14570 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  if( pSrc->a[0].p
14580 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
14590 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
145a0 65 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20  e(pParse, base, 
145b0 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
145c0 65 6e 52 65 61 64 29 3b 0a 20 20 7d 0a 20 20 69  enRead);.  }.  i
145d0 66 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20  f( pIdx==0 ){.  
145e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
145f0 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61  Op(v, seekOp, ba
14600 73 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  se, 0);.  }else{
14610 0a 20 20 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f  .    /* Even tho
14620 75 67 68 20 74 68 65 20 63 75 72 73 6f 72 20 75  ugh the cursor u
14630 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  sed to open the 
14640 69 6e 64 65 78 20 68 65 72 65 20 69 73 20 63 6c  index here is cl
14650 6f 73 65 64 0a 20 20 20 20 2a 2a 20 61 73 20 73  osed.    ** as s
14660 6f 6f 6e 20 61 73 20 61 20 73 69 6e 67 6c 65 20  oon as a single 
14670 76 61 6c 75 65 20 68 61 73 20 62 65 65 6e 20 72  value has been r
14680 65 61 64 20 66 72 6f 6d 20 69 74 2c 20 61 6c 6c  ead from it, all
14690 6f 63 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20  ocate it.    ** 
146a0 75 73 69 6e 67 20 28 70 50 61 72 73 65 2d 3e 6e  using (pParse->n
146b0 54 61 62 2b 2b 29 20 74 6f 20 70 72 65 76 65 6e  Tab++) to preven
146c0 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 64 20  t the cursor id 
146d0 66 72 6f 6d 20 62 65 69 6e 67 20 0a 20 20 20 20  from being .    
146e0 2a 2a 20 72 65 75 73 65 64 2e 20 54 68 69 73 20  ** reused. This 
146f0 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72  is important for
14700 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 66 20 74   statements of t
14710 68 65 20 66 6f 72 6d 20 0a 20 20 20 20 2a 2a 20  he form .    ** 
14720 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 20 53  "INSERT INTO x S
14730 45 4c 45 43 54 20 6d 61 78 28 29 20 46 52 4f 4d  ELECT max() FROM
14740 20 78 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   x"..    */.    
14750 69 6e 74 20 69 49 64 78 3b 0a 20 20 20 20 4b 65  int iIdx;.    Ke
14760 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71  yInfo *pKey = sq
14770 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
14780 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
14790 0a 20 20 20 20 69 49 64 78 20 3d 20 70 50 61 72  .    iIdx = pPar
147a0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
147b0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53  assert( pIdx->pS
147c0 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
147d0 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69  hema );.    sqli
147e0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
147f0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c  OP_Integer, iDb,
14800 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
14810 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
14820 65 6e 52 65 61 64 2c 20 69 49 64 78 2c 20 70 49  enRead, iIdx, pI
14830 64 78 2d 3e 74 6e 75 6d 2c 20 0a 20 20 20 20 20  dx->tnum, .     
14840 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20     (char*)pKey, 
14850 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
14860 46 46 29 3b 0a 20 20 20 20 69 66 28 20 73 65 65  FF);.    if( see
14870 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29  kOp==OP_Rewind )
14880 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
14890 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
148a0 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ull, 0, 0);.    
148b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
148c0 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
148d0 6f 72 64 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ord, 1, 0);.    
148e0 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d 6f    seekOp = OP_Mo
148f0 76 65 47 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  veGt;.    }.    
14900 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14910 28 76 2c 20 73 65 65 6b 4f 70 2c 20 69 49 64 78  (v, seekOp, iIdx
14920 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
14930 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14940 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 2c  _IdxRowid, iIdx,
14950 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
14960 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14970 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30 29 3b  Close, iIdx, 0);
14980 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14990 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65  AddOp(v, OP_Move
149a0 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  Ge, base, 0);.  
149b0 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70 72 20  }.  eList.nExpr 
149c0 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65  = 1;.  memset(&e
149d0 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73 69 7a  ListItem, 0, siz
149e0 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29 29 3b  eof(eListItem));
149f0 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26 65 4c  .  eList.a = &eL
14a00 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73 74  istItem;.  eList
14a10 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45  .a[0].pExpr = pE
14a20 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e  xpr;.  selectInn
14a30 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
14a40 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c 20  , &eList, 0, 0, 
14a50 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50  0, -1, eDest, iP
14a60 61 72 6d 2c 20 62 72 6b 2c 20 62 72 6b 2c 20 30  arm, brk, brk, 0
14a70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14a80 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
14a90 62 72 6b 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  brk);.  sqlite3V
14aa0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
14ab0 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a  lose, base, 0);.
14ac0 20 20 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d    .  return 1;.}
14ad0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
14ae0 61 6e 64 20 4f 52 44 45 52 20 42 59 20 6f 72 20  and ORDER BY or 
14af0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
14b00 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  in a SELECT stat
14b10 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a  ement.  Return.*
14b20 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
14b30 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a  errors seen..**.
14b40 2a 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 6f  ** An ORDER BY o
14b50 72 20 47 52 4f 55 50 20 42 59 20 69 73 20 61 20  r GROUP BY is a 
14b60 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
14b70 6f 6e 73 2e 20 20 49 66 20 61 6e 79 20 65 78 70  ons.  If any exp
14b80 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 6e  ression.** is an
14b90 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   integer constan
14ba0 74 2c 20 74 68 65 6e 20 74 68 61 74 20 65 78 70  t, then that exp
14bb0 72 65 73 73 69 6f 6e 20 69 73 20 72 65 70 6c 61  ression is repla
14bc0 63 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 6f  ced by the.** co
14bd0 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6e 74 72  rresponding entr
14be0 79 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  y in the result 
14bf0 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
14c00 6e 74 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47  nt processOrderG
14c10 72 6f 75 70 42 79 28 0a 20 20 4e 61 6d 65 43 6f  roupBy(.  NameCo
14c20 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20  ntext *pNC,     
14c30 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
14c40 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
14c50 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 45 78  atement. */.  Ex
14c60 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
14c70 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ,   /* The ORDER
14c80 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
14c90 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70 72 6f  clause to be pro
14ca0 63 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  cessed */.  cons
14cb0 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20  t char *zType   
14cc0 20 20 2f 2a 20 45 69 74 68 65 72 20 22 4f 52 44    /* Either "ORD
14cd0 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22 2c 20  ER" or "GROUP", 
14ce0 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a  as appropriate *
14cf0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
14d00 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
14d10 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 3b 20   = pNC->pEList; 
14d20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
14d30 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
14d40 45 43 54 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ECT */.  Parse *
14d50 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
14d60 61 72 73 65 3b 20 20 20 20 20 2f 2a 20 54 68 65  arse;     /* The
14d70 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
14d80 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 61  he SELECT */.  a
14d90 73 73 65 72 74 28 20 70 45 4c 69 73 74 20 29 3b  ssert( pEList );
14da0 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ..  if( pOrderBy
14db0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
14dc0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e    if( pOrderBy->
14dd0 6e 45 78 70 72 3e 53 51 4c 49 54 45 5f 4d 41 58  nExpr>SQLITE_MAX
14de0 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 73  _COLUMN ){.    s
14df0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14e00 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
14e10 20 74 65 72 6d 73 20 69 6e 20 25 73 20 42 59 20   terms in %s BY 
14e20 63 6c 61 75 73 65 22 2c 20 7a 54 79 70 65 29 3b  clause", zType);
14e30 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
14e40 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
14e50 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
14e60 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69   i++){.    int i
14e70 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  Col;.    Expr *p
14e80 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  E = pOrderBy->a[
14e90 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
14ea0 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
14eb0 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c  nteger(pE, &iCol
14ec0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ) ){.      if( i
14ed0 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70  Col>0 && iCol<=p
14ee0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
14ef0 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
14f00 2a 70 43 6f 6c 6c 20 3d 20 70 45 2d 3e 70 43 6f  *pColl = pE->pCo
14f10 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ll;.        int 
14f20 66 6c 61 67 73 20 3d 20 70 45 2d 3e 66 6c 61 67  flags = pE->flag
14f30 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  s & EP_ExpCollat
14f40 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
14f50 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 29  e3ExprDelete(pE)
14f60 3b 0a 20 20 20 20 20 20 20 20 70 45 20 3d 20 70  ;.        pE = p
14f70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
14f80 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
14f90 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69  rDup(pEList->a[i
14fa0 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20  Col-1].pExpr);. 
14fb0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
14fc0 20 26 26 20 66 6c 61 67 73 20 29 7b 0a 20 20 20   && flags ){.   
14fd0 20 20 20 20 20 20 20 70 45 2d 3e 70 43 6f 6c 6c         pE->pColl
14fe0 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
14ff0 20 20 20 20 70 45 2d 3e 66 6c 61 67 73 20 7c 3d      pE->flags |=
15000 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20   flags;.        
15010 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
15020 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
15030 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
15040 20 20 20 20 20 20 20 20 20 20 20 22 25 73 20 42             "%s B
15050 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  Y column number 
15060 25 64 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  %d out of range 
15070 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20  - should be ".  
15080 20 20 20 20 20 20 20 20 20 22 62 65 74 77 65 65           "betwee
15090 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 7a 54 79  n 1 and %d", zTy
150a0 70 65 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74  pe, iCol, pEList
150b0 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
150c0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
150d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
150e0 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
150f0 6f 6c 76 65 4e 61 6d 65 73 28 70 4e 43 2c 20 70  olveNames(pNC, p
15100 45 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  E) ){.      retu
15110 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
15120 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
15130 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15140 65 20 72 65 73 6f 6c 76 65 73 20 61 6e 79 20 6e  e resolves any n
15150 61 6d 65 73 20 75 73 65 64 20 69 6e 20 74 68 65  ames used in the
15160 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
15170 68 65 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 53  he.** supplied S
15180 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
15190 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   If the SELECT s
151a0 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 72  tatement being r
151b0 65 73 6f 6c 76 65 64 0a 2a 2a 20 69 73 20 61 20  esolved.** is a 
151c0 73 75 62 2d 73 65 6c 65 63 74 2c 20 74 68 65 6e  sub-select, then
151d0 20 70 4f 75 74 65 72 4e 43 20 69 73 20 61 20 70   pOuterNC is a p
151e0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4e 61  ointer to the Na
151f0 6d 65 43 6f 6e 74 65 78 74 20 0a 2a 2a 20 6f 66  meContext .** of
15200 20 74 68 65 20 70 61 72 65 6e 74 20 53 45 4c 45   the parent SELE
15210 43 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  CT..*/.int sqlit
15220 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
15230 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
15240 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
15250 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
15260 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
15270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15280 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
15290 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
152a0 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
152b0 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20  t *pOuterNC  /* 
152c0 54 68 65 20 6f 75 74 65 72 20 6e 61 6d 65 20 63  The outer name c
152d0 6f 6e 74 65 78 74 2e 20 4d 61 79 20 62 65 20 4e  ontext. May be N
152e0 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  ULL. */.){.  Exp
152f0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
15300 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
15310 74 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20  t set. */.  int 
15320 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
15330 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f         /* For-lo
15340 6f 70 20 76 61 72 69 61 62 6c 65 20 75 73 65 64  op variable used
15350 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61   in multiple pla
15360 63 65 73 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ces */.  NameCon
15370 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20  text sNC;       
15380 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d      /* Local nam
15390 65 2d 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  e-context */.  E
153a0 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
153b0 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  y;        /* The
153c0 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65   group by clause
153d0 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
153e0 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75  s routine has ru
153f0 6e 20 62 65 66 6f 72 65 2c 20 72 65 74 75 72 6e  n before, return
15400 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f   immediately. */
15410 0a 20 20 69 66 28 20 70 2d 3e 69 73 52 65 73 6f  .  if( p->isReso
15420 6c 76 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65  lved ){.    asse
15430 72 74 28 20 21 70 4f 75 74 65 72 4e 43 20 29 3b  rt( !pOuterNC );
15440 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15450 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  TE_OK;.  }.  p->
15460 69 73 52 65 73 6f 6c 76 65 64 20 3d 20 31 3b 0a  isResolved = 1;.
15470 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68  .  /* If there h
15480 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
15490 20 65 72 72 6f 72 73 2c 20 64 6f 20 6e 6f 74 68   errors, do noth
154a0 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  ing. */.  if( pP
154b0 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a  arse->nErr>0 ){.
154c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
154d0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
154e0 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65 20 73  /* Prepare the s
154f0 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2e  elect statement.
15500 20 54 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20   This call will 
15510 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 63 75 72  allocate all cur
15520 73 6f 72 73 0a 20 20 2a 2a 20 72 65 71 75 69 72  sors.  ** requir
15530 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ed to handle the
15540 20 74 61 62 6c 65 73 20 61 6e 64 20 73 75 62 71   tables and subq
15550 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
15560 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  OM clause..  */.
15570 20 20 69 66 28 20 70 72 65 70 53 65 6c 65 63 74    if( prepSelect
15580 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 29 20  Stmt(pParse, p) 
15590 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
155a0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
155b0 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68  .  /* Resolve th
155c0 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  e expressions in
155d0 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
155e0 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54  FFSET clauses. T
155f0 68 65 73 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f  hese.  ** are no
15600 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66  t allowed to ref
15610 65 72 20 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c  er to any names,
15620 20 73 6f 20 70 61 73 73 20 61 6e 20 65 6d 70 74   so pass an empt
15630 79 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20  y NameContext.. 
15640 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e   */.  memset(&sN
15650 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
15660 29 29 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65  ));.  sNC.pParse
15670 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28   = pParse;.  if(
15680 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
15690 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
156a0 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a 20 20 20  ->pLimit) ||.   
156b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 52 65     sqlite3ExprRe
156c0 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c  solveNames(&sNC,
156d0 20 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a   p->pOffset) ){.
156e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
156f0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
15700 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f  /* Set up the lo
15710 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  cal name-context
15720 20 74 6f 20 70 61 73 73 20 74 6f 20 45 78 70 72   to pass to Expr
15730 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 74  ResolveNames() t
15740 6f 0a 20 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74  o.  ** resolve t
15750 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  he expression-li
15760 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 61  st..  */.  sNC.a
15770 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 73  llowAgg = 1;.  s
15780 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 2d  NC.pSrcList = p-
15790 3e 70 53 72 63 3b 0a 20 20 73 4e 43 2e 70 4e 65  >pSrc;.  sNC.pNe
157a0 78 74 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 0a  xt = pOuterNC;..
157b0 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d    /* Resolve nam
157c0 65 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  es in the result
157d0 20 73 65 74 2e 20 2a 2f 0a 20 20 70 45 4c 69 73   set. */.  pELis
157e0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
157f0 20 69 66 28 20 21 70 45 4c 69 73 74 20 29 20 72   if( !pEList ) r
15800 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
15810 4f 52 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  OR;.  for(i=0; i
15820 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
15830 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
15840 70 58 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  pX = pEList->a[i
15850 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
15860 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
15870 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
15880 58 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  X) ){.      retu
15890 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
158a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
158b0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
158c0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
158d0 69 6f 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  ions in the resu
158e0 6c 74 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47  lt-set, and no G
158f0 52 4f 55 50 20 42 59 20 0a 20 20 2a 2a 20 65 78  ROUP BY .  ** ex
15900 70 72 65 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74  pression, do not
15910 20 61 6c 6c 6f 77 20 61 67 67 72 65 67 61 74 65   allow aggregate
15920 73 20 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 20  s in any of the 
15930 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
15940 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
15950 28 20 21 70 2d 3e 69 73 41 67 67 20 29 3b 0a 20  ( !p->isAgg );. 
15960 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
15970 47 72 6f 75 70 42 79 3b 0a 20 20 69 66 28 20 70  GroupBy;.  if( p
15980 47 72 6f 75 70 42 79 20 7c 7c 20 73 4e 43 2e 68  GroupBy || sNC.h
15990 61 73 41 67 67 20 29 7b 0a 20 20 20 20 70 2d 3e  asAgg ){.    p->
159a0 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 65 6c  isAgg = 1;.  }el
159b0 73 65 7b 0a 20 20 20 20 73 4e 43 2e 61 6c 6c 6f  se{.    sNC.allo
159c0 77 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  wAgg = 0;.  }.. 
159d0 20 2f 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20   /* If a HAVING 
159e0 63 6c 61 75 73 65 20 69 73 20 70 72 65 73 65 6e  clause is presen
159f0 74 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  t, then there mu
15a00 73 74 20 62 65 20 61 20 47 52 4f 55 50 20 42 59  st be a GROUP BY
15a10 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
15a20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 26  if( p->pHaving &
15a30 26 20 21 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  & !pGroupBy ){. 
15a40 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15a50 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 47 52  sg(pParse, "a GR
15a60 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73  OUP BY clause is
15a70 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
15a80 20 48 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 72   HAVING");.    r
15a90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
15aa0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  OR;.  }..  /* Ad
15ab0 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
15ac0 20 6c 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d   list to the nam
15ad0 65 2d 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65  e-context before
15ae0 20 70 61 72 73 69 6e 67 20 74 68 65 0a 20 20 2a   parsing the.  *
15af0 2a 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  * other expressi
15b00 6f 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  ons in the SELEC
15b10 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  T statement. Thi
15b20 73 20 69 73 20 73 6f 20 74 68 61 74 0a 20 20 2a  s is so that.  *
15b30 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  * expressions in
15b40 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
15b50 65 20 28 65 74 63 2e 29 20 63 61 6e 20 72 65 66  e (etc.) can ref
15b60 65 72 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e  er to expression
15b70 73 20 62 79 0a 20 20 2a 2a 20 61 6c 69 61 73 65  s by.  ** aliase
15b80 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
15b90 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  set..  **.  ** M
15ba0 69 6e 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20 74  inor point: If t
15bb0 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
15bc0 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
15bd0 73 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a  sion will be.  *
15be0 2a 20 72 65 2d 65 76 61 6c 75 61 74 65 64 20 66  * re-evaluated f
15bf0 6f 72 20 65 61 63 68 20 72 65 66 65 72 65 6e 63  or each referenc
15c00 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  e to it..  */.  
15c10 73 4e 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e  sNC.pEList = p->
15c20 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71  pEList;.  if( sq
15c30 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
15c40 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
15c50 57 68 65 72 65 29 20 7c 7c 0a 20 20 20 20 20 73  Where) ||.     s
15c60 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
15c70 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
15c80 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20  pHaving) ){.    
15c90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
15ca0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ROR;.  }.  if( p
15cb0 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
15cc0 20 20 20 69 66 28 20 70 72 6f 63 65 73 73 4f 72     if( processOr
15cd0 64 65 72 47 72 6f 75 70 42 79 28 26 73 4e 43 2c  derGroupBy(&sNC,
15ce0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f   p->pOrderBy, "O
15cf0 52 44 45 52 22 29 20 7c 7c 0a 20 20 20 20 20 20  RDER") ||.      
15d00 20 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72    processOrderGr
15d10 6f 75 70 42 79 28 26 73 4e 43 2c 20 70 47 72 6f  oupBy(&sNC, pGro
15d20 75 70 42 79 2c 20 22 47 52 4f 55 50 22 29 20 29  upBy, "GROUP") )
15d30 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
15d40 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
15d50 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
15d60 65 20 73 75 72 65 20 74 68 65 20 47 52 4f 55 50  e sure the GROUP
15d70 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20   BY clause does 
15d80 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67 67 72  not contain aggr
15d90 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e  egate functions.
15da0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 47 72 6f  .  */.  if( pGro
15db0 75 70 42 79 20 29 7b 0a 20 20 20 20 73 74 72 75  upBy ){.    stru
15dc0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
15dd0 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 20 20   *pItem;.  .    
15de0 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
15df0 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3c 70 47  GroupBy->a; i<pG
15e00 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
15e10 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
15e20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
15e30 72 6f 70 65 72 74 79 28 70 49 74 65 6d 2d 3e 70  roperty(pItem->p
15e40 45 78 70 72 2c 20 45 50 5f 41 67 67 29 20 29 7b  Expr, EP_Agg) ){
15e50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15e60 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15e70 20 22 61 67 67 72 65 67 61 74 65 20 66 75 6e 63   "aggregate func
15e80 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61 6c  tions are not al
15e90 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20 20 20 20  lowed in ".     
15ea0 20 20 20 20 20 20 20 22 74 68 65 20 47 52 4f 55         "the GROU
15eb0 50 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a 20  P BY clause");. 
15ec0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
15ed0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
15ee0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
15ef0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6f   /* If this is o
15f00 6e 65 20 53 45 4c 45 43 54 20 6f 66 20 61 20 63  ne SELECT of a c
15f10 6f 6d 70 6f 75 6e 64 2c 20 62 65 20 73 75 72 65  ompound, be sure
15f20 20 74 6f 20 72 65 73 6f 6c 76 65 20 6e 61 6d 65   to resolve name
15f30 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 74  s.  ** in the ot
15f40 68 65 72 20 53 45 4c 45 43 54 73 2e 0a 20 20 2a  her SELECTs..  *
15f50 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
15f60 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
15f70 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73  sqlite3SelectRes
15f80 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  olve(pParse, p->
15f90 70 50 72 69 6f 72 2c 20 70 4f 75 74 65 72 4e 43  pPrior, pOuterNC
15fa0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
15fb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15fc0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
15fd0 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61  eset the aggrega
15fe0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a  te accumulator..
15ff0 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67  **.** The aggreg
16000 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
16010 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f  is a set of memo
16020 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f  ry cells that ho
16030 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61  ld.** intermedia
16040 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65  te results while
16050 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20   calculating an 
16060 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73  aggregate.  This
16070 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d 70  .** routine simp
16080 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20  ly stores NULLs 
16090 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20  in all of those 
160a0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f  memory cells..*/
160b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
160c0 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  etAccumulator(Pa
160d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
160e0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
160f0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
16100 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
16110 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
16120 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e  gInfo_func *pFun
16130 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66  c;.  if( pAggInf
16140 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66  o->nFunc+pAggInf
16150 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  o->nColumn==0 ){
16160 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
16170 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
16180 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
16190 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
161a0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
161b0 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 70 41 67 67 49  P_MemNull, pAggI
161c0 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
161d0 6d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  m, 0);.  }.  for
161e0 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d  (pFunc=pAggInfo-
161f0 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70  >aFunc, i=0; i<p
16200 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
16210 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20  i++, pFunc++){. 
16220 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16230 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c  dOp(v, OP_MemNul
16240 6c 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 2c 20  l, pFunc->iMem, 
16250 30 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  0);.    if( pFun
16260 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20  c->iDistinct>=0 
16270 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
16280 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72  E = pFunc->pExpr
16290 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
162a0 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  pList==0 || pE->
162b0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  pList->nExpr!=1 
162c0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
162d0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
162e0 65 2c 20 22 44 49 53 54 49 4e 43 54 20 69 6e 20  e, "DISTINCT in 
162f0 61 67 67 72 65 67 61 74 65 20 6d 75 73 74 20 62  aggregate must b
16300 65 20 66 6f 6c 6c 6f 77 65 64 20 22 0a 20 20 20  e followed ".   
16310 20 20 20 20 20 20 20 20 22 62 79 20 61 6e 20 65          "by an e
16320 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20  xpression");.   
16330 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
16340 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
16350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16360 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
16370 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
16380 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
16390 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20   pE->pList);.   
163a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
163b0 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op3(v, OP_OpenEp
163c0 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e  hemeral, pFunc->
163d0 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 0a 20  iDistinct, 0, . 
163e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163f0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
16400 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  pKeyInfo, P3_KEY
16410 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
16420 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16430 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
16440 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c   the OP_AggFinal
16450 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65  ize opcode for e
16460 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66  very aggregate f
16470 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  unction.** in th
16480 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74  e AggInfo struct
16490 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
164a0 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46  oid finalizeAggF
164b0 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a  unctions(Parse *
164c0 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
164d0 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
164e0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
164f0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
16500 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
16510 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72  _func *pF;.  for
16520 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
16530 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
16540 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
16550 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70  , pF++){.    Exp
16560 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
16570 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b  F->pExpr->pList;
16580 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16590 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e  Op3(v, OP_AggFin
165a0 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c  al, pF->iMem, pL
165b0 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
165c0 70 72 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20  pr : 0,.        
165d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
165e0 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20  oid*)pF->pFunc, 
165f0 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d  P3_FUNCDEF);.  }
16600 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65  .}../*.** Update
16610 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
16620 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f   memory cells fo
16630 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62  r an aggregate b
16640 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  ased on.** the c
16650 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f  urrent cursor po
16660 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  sition..*/.stati
16670 63 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63  c void updateAcc
16680 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
16690 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
166a0 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
166b0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
166c0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
166d0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
166e0 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72  _func *pF;.  str
166f0 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
16700 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f  *pC;..  pAggInfo
16710 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  ->directMode = 1
16720 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
16730 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
16740 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
16750 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
16760 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20      int nArg;.  
16770 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d    int addrNext =
16780 20 30 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   0;.    ExprList
16790 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
167a0 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
167b0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
167c0 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d     nArg = pList-
167d0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >nExpr;.      sq
167e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
167f0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c  rList(pParse, pL
16800 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ist);.    }else{
16810 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b  .      nArg = 0;
16820 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
16830 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20  F->iDistinct>=0 
16840 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78  ){.      addrNex
16850 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
16860 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
16870 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d     assert( nArg=
16880 3d 31 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  =1 );.      code
16890 44 69 73 74 69 6e 63 74 28 76 2c 20 70 46 2d 3e  Distinct(v, pF->
168a0 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e  iDistinct, addrN
168b0 65 78 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ext, 1);.    }. 
168c0 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63     if( pF->pFunc
168d0 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b  ->needCollSeq ){
168e0 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
168f0 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  pColl = 0;.     
16900 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
16910 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
16920 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
16930 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
16940 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d  0 );  /* pList!=
16950 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 2d 3e  0 if pF->pFunc->
16960 6e 65 65 64 43 6f 6c 6c 53 65 71 20 69 73 20 74  needCollSeq is t
16970 72 75 65 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  rue */.      for
16980 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (j=0, pItem=pLis
16990 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20  t->a; !pColl && 
169a0 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74  j<nArg; j++, pIt
169b0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
169c0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
169d0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
169e0 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
169f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
16a00 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
16a10 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61       pColl = pPa
16a20 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
16a30 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
16a40 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
16a50 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
16a60 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
16a70 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29  oll, P3_COLLSEQ)
16a80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
16a90 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
16aa0 5f 41 67 67 53 74 65 70 2c 20 70 46 2d 3e 69 4d  _AggStep, pF->iM
16ab0 65 6d 2c 20 6e 41 72 67 2c 20 28 76 6f 69 64 2a  em, nArg, (void*
16ac0 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 33 5f 46  )pF->pFunc, P3_F
16ad0 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 69 66 28  UNCDEF);.    if(
16ae0 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20   addrNext ){.   
16af0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
16b00 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
16b10 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20  drNext);.    }. 
16b20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43   }.  for(i=0, pC
16b30 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b  =pAggInfo->aCol;
16b40 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63   i<pAggInfo->nAc
16b50 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20  cumulator; i++, 
16b60 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  pC++){.    sqlit
16b70 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
16b80 65 2c 20 70 43 2d 3e 70 45 78 70 72 29 3b 0a 20  e, pC->pExpr);. 
16b90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16ba0 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
16bb0 72 65 2c 20 70 43 2d 3e 69 4d 65 6d 2c 20 31 29  re, pC->iMem, 1)
16bc0 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f  ;.  }.  pAggInfo
16bd0 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30  ->directMode = 0
16be0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
16bf0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
16c00 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73  e given SELECT s
16c10 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
16c20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
16c30 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76  distributed in v
16c40 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65  arious ways depe
16c50 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20  nding on the.** 
16c60 76 61 6c 75 65 20 6f 66 20 65 44 65 73 74 20 61  value of eDest a
16c70 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  nd iParm..**.** 
16c80 20 20 20 20 65 44 65 73 74 20 56 61 6c 75 65 20      eDest Value 
16c90 20 20 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20        Result.** 
16ca0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
16cb0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
16cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
16ce0 2a 2a 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62  **     SRT_Callb
16cf0 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68  ack    Invoke th
16d00 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65  e callback for e
16d10 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72  ach row of the r
16d20 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  esult..**.**    
16d30 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20   SRT_Mem        
16d40 20 53 74 6f 72 65 20 66 69 72 73 74 20 72 65 73   Store first res
16d50 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  ult in memory ce
16d60 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20  ll iParm.**.**  
16d70 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20     SRT_Set      
16d80 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
16d90 20 61 73 20 6b 65 79 73 20 6f 66 20 74 61 62 6c   as keys of tabl
16da0 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  e iParm..**.**  
16db0 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20     SRT_Union    
16dc0 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
16dd0 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74   as a key in a t
16de0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
16df0 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  Parm.**.**     S
16e00 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20 52  RT_Except      R
16e10 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66 72  emove results fr
16e20 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  om the temporary
16e30 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a   table iParm..**
16e40 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c  .**     SRT_Tabl
16e50 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  e       Store re
16e60 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61  sults in tempora
16e70 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a  ry table iParm.*
16e80 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61  *.** The table a
16e90 62 6f 76 65 20 69 73 20 69 6e 63 6f 6d 70 6c 65  bove is incomple
16ea0 74 65 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20  te.  Additional 
16eb0 65 44 69 73 74 20 76 61 6c 75 65 20 68 61 76 65  eDist value have
16ec0 20 62 65 20 61 64 64 65 64 0a 2a 2a 20 73 69 6e   be added.** sin
16ed0 63 65 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20  ce this comment 
16ee0 77 61 73 20 77 72 69 74 74 65 6e 2e 20 20 53 65  was written.  Se
16ef0 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e 65  e the selectInne
16f00 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f 6e  rLoop() function
16f10 20 66 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c 65   for.** a comple
16f20 74 65 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68  te listing of th
16f30 65 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  e allowed values
16f40 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20 74 68   of eDest and th
16f50 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a  eir meanings..**
16f60 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16f70 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
16f80 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
16f90 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
16fa0 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64  e.** encountered
16fb0 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70  , then an approp
16fc0 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
16fd0 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a  age is left in.*
16fe0 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  * pParse->zErrMs
16ff0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
17000 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66  utine does NOT f
17010 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73  ree the Select s
17020 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
17030 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  in.  The.** call
17040 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65  ing function nee
17050 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ds to do that..*
17060 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74  *.** The pParent
17070 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 61 6e 64  , parentTab, and
17080 20 2a 70 50 61 72 65 6e 74 41 67 67 20 66 69 65   *pParentAgg fie
17090 6c 64 73 20 61 72 65 20 66 69 6c 6c 65 64 20 69  lds are filled i
170a0 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c  n if this.** SEL
170b0 45 43 54 20 69 73 20 61 20 73 75 62 71 75 65 72  ECT is a subquer
170c0 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  y.  This routine
170d0 20 6d 61 79 20 74 72 79 20 74 6f 20 63 6f 6d 62   may try to comb
170e0 69 6e 65 20 74 68 69 73 20 53 45 4c 45 43 54 0a  ine this SELECT.
170f0 2a 2a 20 77 69 74 68 20 69 74 73 20 70 61 72 65  ** with its pare
17100 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e  nt to form a sin
17110 67 6c 65 20 66 6c 61 74 20 71 75 65 72 79 2e 20  gle flat query. 
17120 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74   In so doing, it
17130 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65   might.** change
17140 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
17150 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67  y from a non-agg
17160 72 65 67 61 74 65 20 74 6f 20 61 6e 20 61 67 67  regate to an agg
17170 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a  regate query..**
17180 20 46 6f 72 20 74 68 61 74 20 72 65 61 73 6f 6e   For that reason
17190 2c 20 74 68 65 20 70 50 61 72 65 6e 74 41 67 67  , the pParentAgg
171a0 20 66 6c 61 67 20 69 73 20 70 61 73 73 65 64 20   flag is passed 
171b0 61 73 20 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f  as a pointer, so
171c0 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68   it.** can be ch
171d0 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  anged..**.** Exa
171e0 6d 70 6c 65 20 31 3a 20 20 20 54 68 65 20 6d 65  mple 1:   The me
171f0 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 50 61  aning of the pPa
17200 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72 2e 0a  rent parameter..
17210 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
17220 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28  * FROM t1 JOIN (
17230 53 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74 28  SELECT x, count(
17240 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e  *) FROM t2) JOIN
17250 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20   t3;.**    \    
17260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17270 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75    \_______ subqu
17280 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ery _______/    
17290 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20      /.**     \  
172a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172d0 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f      /.**      \_
172e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
172f0 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20  ___ outer query 
17300 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
17310 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ___/.**.** This 
17320 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
17330 64 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20  d for the outer 
17340 71 75 65 72 79 20 66 69 72 73 74 2e 20 20 20 46  query first.   F
17350 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a  or that call,.**
17360 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 62 65   pParent will be
17370 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74   NULL.  During t
17380 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66  he processing of
17390 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
173a0 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69  , this .** routi
173b0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63  ne is called rec
173c0 75 72 73 69 76 65 6c 79 20 74 6f 20 68 61 6e 64  ursively to hand
173d0 6c 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  le the subquery.
173e0 20 20 46 6f 72 20 74 68 65 20 72 65 63 75 72 73    For the recurs
173f0 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61  ive.** call, pPa
17400 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20  rent will point 
17410 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  to the outer que
17420 72 79 2e 20 20 42 65 63 61 75 73 65 20 74 68 65  ry.  Because the
17430 20 73 75 62 71 75 65 72 79 20 69 73 0a 2a 2a 20   subquery is.** 
17440 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65  the second eleme
17450 6e 74 20 69 6e 20 61 20 74 68 72 65 65 2d 77 61  nt in a three-wa
17460 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72 65  y join, the pare
17470 6e 74 54 61 62 20 70 61 72 61 6d 65 74 65 72 20  ntTab parameter 
17480 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68  will.** be 1 (th
17490 65 20 32 6e 64 20 76 61 6c 75 65 20 6f 66 20 61  e 2nd value of a
174a0 20 30 2d 69 6e 64 65 78 65 64 20 61 72 72 61 79   0-indexed array
174b0 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  .).*/.int sqlite
174c0 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  3Select(.  Parse
174d0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
174e0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
174f0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
17500 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
17510 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
17520 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
17530 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e  g coded. */.  in
17540 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20  t eDest,        
17550 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
17560 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65  ispose of the re
17570 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
17580 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Parm,           
17590 20 20 2f 2a 20 41 20 70 61 72 61 6d 65 74 65 72    /* A parameter
175a0 20 75 73 65 64 20 62 79 20 74 68 65 20 65 44 65   used by the eDe
175b0 73 74 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68  st disposal meth
175c0 6f 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  od */.  Select *
175d0 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 2f  pParent,       /
175e0 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
175f0 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20   for which this 
17600 69 73 20 61 20 73 75 62 2d 71 75 65 72 79 20 2a  is a sub-query *
17610 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 54 61  /.  int parentTa
17620 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  b,         /* In
17630 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e  dex in pParent->
17640 70 53 72 63 20 6f 66 20 74 68 69 73 20 71 75 65  pSrc of this que
17650 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61  ry */.  int *pPa
17660 72 65 6e 74 41 67 67 2c 20 20 20 20 20 20 20 2f  rentAgg,       /
17670 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65 6e  * True if pParen
17680 74 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  t uses aggregate
17690 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
176a0 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20  char *aff       
176b0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65         /* If eDe
176c0 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c  st is SRT_Union,
176d0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
176e0 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ring */.){.  int
176f0 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
17700 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
17710 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49  ters */.  WhereI
17720 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
17730 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20   /* Return from 
17740 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
17750 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  n() */.  Vdbe *v
17760 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17770 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d  /* The virtual m
17780 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e  achine under con
17790 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
177a0 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20  nt isAgg;       
177b0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
177c0 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c  r select lists l
177d0 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a  ike "count(*)" *
177e0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
177f0 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69  List;      /* Li
17800 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
17810 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53   extract. */.  S
17820 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
17830 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ;     /* List of
17840 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63   tables to selec
17850 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72  t from */.  Expr
17860 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
17870 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
17880 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
17890 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
178a0 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
178b0 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
178c0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
178d0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
178e0 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
178f0 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
17900 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
17910 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
17920 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20   *pHaving;      
17930 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47     /* The HAVING
17940 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
17950 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69   NULL */.  int i
17960 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  sDistinct;      
17970 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
17980 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
17990 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
179a0 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20    int distinct; 
179b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
179c0 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  e to use for the
179d0 20 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f   distinct set */
179e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20  .  int rc = 1;  
179f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
17a00 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f  ue to return fro
17a10 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
17a20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72  */.  int addrSor
17a30 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41  tIndex;     /* A
17a40 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f  ddress of an OP_
17a50 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
17a60 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 41  struction */.  A
17a70 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b  ggInfo sAggInfo;
17a80 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
17a90 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67  tion used by agg
17aa0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a  regate queries *
17ab0 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20  /.  int iEnd;   
17ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
17ad0 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64  dress of the end
17ae0 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f   of the query */
17af0 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ..  if( p==0 || 
17b00 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
17b10 6c 65 64 28 29 20 7c 7c 20 70 50 61 72 73 65 2d  led() || pParse-
17b20 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74  >nErr ){.    ret
17b30 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
17b40 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
17b50 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
17b60 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
17b70 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
17b80 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f  memset(&sAggInfo
17b90 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67  , 0, sizeof(sAgg
17ba0 49 6e 66 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66  Info));..#ifndef
17bb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
17bc0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f  POUND_SELECT.  /
17bd0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72  * If there is ar
17be0 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  e a sequence of 
17bf0 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20  queries, do the 
17c00 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72  earlier ones fir
17c10 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
17c20 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
17c30 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  if( p->pRightmos
17c40 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65  t==0 ){.      Se
17c50 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20  lect *pLoop;.   
17c60 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20     for(pLoop=p; 
17c70 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
17c80 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  op->pPrior){.   
17c90 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67       pLoop->pRig
17ca0 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20  htmost = p;.    
17cb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
17cc0 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  turn multiSelect
17cd0 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73  (pParse, p, eDes
17ce0 74 2c 20 69 50 61 72 6d 2c 20 61 66 66 29 3b 0a  t, iParm, aff);.
17cf0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 4f    }.#endif..  pO
17d00 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
17d10 65 72 42 79 3b 0a 20 20 69 66 28 20 49 67 6e 6f  erBy;.  if( Igno
17d20 72 61 62 6c 65 4f 72 64 65 72 62 79 28 65 44 65  rableOrderby(eDe
17d30 73 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4f  st) ){.    p->pO
17d40 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
17d50 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
17d60 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73  ectResolve(pPars
17d70 65 2c 20 70 2c 20 30 29 20 29 7b 0a 20 20 20 20  e, p, 0) ){.    
17d80 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
17d90 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f 72 64 65 72  .  }.  p->pOrder
17da0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a  By = pOrderBy;..
17db0 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20    /* Make local 
17dc0 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61  copies of the pa
17dd0 72 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69  rameters for thi
17de0 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  s query..  */.  
17df0 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
17e00 72 63 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70  rc;.  pWhere = p
17e10 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
17e20 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
17e30 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
17e40 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73  p->pHaving;.  is
17e50 41 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a  Agg = p->isAgg;.
17e60 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70    isDistinct = p
17e70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  ->isDistinct;.  
17e80 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
17e90 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
17ea0 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
17eb0 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20  t_end;..  /* .  
17ec0 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61  ** Do not even a
17ed0 74 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61  ttempt to genera
17ee0 74 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77  te any code if w
17ef0 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73  e have already s
17f00 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20  een.  ** errors 
17f10 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
17f20 69 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f  ine starts..  */
17f30 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
17f40 45 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c  Err>0 ) goto sel
17f50 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49  ect_end;..  /* I
17f60 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d  f writing to mem
17f70 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e  ory or generatin
17f80 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c  g a set.  ** onl
17f90 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  y a single colum
17fa0 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e  n may be output.
17fb0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
17fc0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
17fd0 52 59 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f  RY.  if( checkFo
17fe0 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65  rMultiColumnSele
17ff0 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
18000 65 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e  eDest, pEList->n
18010 45 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f 74  Expr) ){.    got
18020 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
18030 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f  }.#endif..  /* O
18040 52 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72  RDER BY is ignor
18050 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73 74  ed for some dest
18060 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  inations..  */. 
18070 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
18080 64 65 72 62 79 28 65 44 65 73 74 29 20 29 7b 0a  derby(eDest) ){.
18090 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
180a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
180b0 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64  n generating cod
180c0 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
180d0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
180e0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
180f0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
18100 6e 64 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  nd;..  /* Genera
18110 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20  te code for all 
18120 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74  sub-queries in t
18130 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
18140 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
18150 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
18160 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
18170 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
18180 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20  IEW).  for(i=0; 
18190 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
181a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
181b0 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75  t char *zSavedAu
181c0 74 68 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20  thContext = 0;. 
181d0 20 20 20 69 6e 74 20 6e 65 65 64 52 65 73 74 6f     int needResto
181e0 72 65 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 73  reContext;.    s
181f0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
18200 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61  em *pItem = &pTa
18210 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 0a 20 20  bList->a[i];..  
18220 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
18230 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 49 74 65 6d  lect==0 || pItem
18240 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 29 20  ->isPopulated ) 
18250 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
18260 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d  ( pItem->zName!=
18270 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65  0 ){.      zSave
18280 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
18290 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
182a0 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ext;.      pPars
182b0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
182c0 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  = pItem->zName;.
182d0 20 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72        needRestor
182e0 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20  eContext = 1;.  
182f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
18300 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78  eedRestoreContex
18310 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 69 66  t = 0;.    }.#if
18320 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
18330 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 2f 2a 20  _DEPTH>0.    /* 
18340 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e  Increment Parse.
18350 6e 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68  nHeight by the h
18360 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72  eight of the lar
18370 67 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a  gest expression.
18380 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65      ** tree refe
18390 72 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20  red to by this, 
183a0 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63  the parent selec
183b0 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c  t. The child sel
183c0 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63  ect.    ** may c
183d0 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f  ontain expressio
183e0 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f  n trees of at mo
183f0 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54  st.    ** (SQLIT
18400 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
18410 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20  -Parse.nHeight) 
18420 68 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20  height. This is 
18430 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72  a bit.    ** mor
18440 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74  e conservative t
18450 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62  han necessary, b
18460 75 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74  ut much easier t
18470 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20  han enforcing.  
18480 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69    ** an exact li
18490 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mit..    */.    
184a0 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
184b0 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  += sqlite3Select
184c0 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 23  ExprHeight(p);.#
184d0 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
184e0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
184f0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
18500 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 0a 20  SRT_EphemTab, . 
18510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18520 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  pItem->iCursor, 
18530 70 2c 20 69 2c 20 26 69 73 41 67 67 2c 20 30 29  p, i, &isAgg, 0)
18540 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
18550 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20  _EXPR_DEPTH>0.  
18560 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
18570 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t -= sqlite3Sele
18580 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
18590 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
185a0 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65  needRestoreConte
185b0 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  xt ){.      pPar
185c0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
185d0 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e   = zSavedAuthCon
185e0 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  text;.    }.    
185f0 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
18600 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  rc;.    pWhere =
18610 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20   p->pWhere;.    
18620 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72  if( !IgnorableOr
18630 64 65 72 62 79 28 65 44 65 73 74 29 20 29 7b 0a  derby(eDest) ){.
18640 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
18650 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
18660 20 20 7d 0a 20 20 20 20 70 47 72 6f 75 70 42 79    }.    pGroupBy
18670 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
18680 20 20 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d      pHaving = p-
18690 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 69 73  >pHaving;.    is
186a0 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
186b0 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 23 65  Distinct;.  }.#e
186c0 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ndif..  /* Check
186d0 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c   for the special
186e0 20 63 61 73 65 20 6f 66 20 61 20 6d 69 6e 28 29   case of a min()
186f0 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69   or max() functi
18700 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a 20 20 2a  on by itself.  *
18710 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
18720 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
18730 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72  simpleMinMaxQuer
18740 79 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65  y(pParse, p, eDe
18750 73 74 2c 20 69 50 61 72 6d 29 20 29 7b 0a 20 20  st, iParm) ){.  
18760 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f    rc = 0;.    go
18770 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
18780 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
18790 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 69 73  o see if this is
187a0 20 61 20 73 75 62 71 75 65 72 79 20 74 68 61 74   a subquery that
187b0 20 63 61 6e 20 62 65 20 22 66 6c 61 74 74 65 6e   can be "flatten
187c0 65 64 22 20 69 6e 74 6f 20 69 74 73 20 70 61 72  ed" into its par
187d0 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66 6c 61  ent..  ** If fla
187e0 74 74 65 6e 69 6e 67 20 69 73 20 61 20 70 6f 73  ttening is a pos
187f0 73 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f 20 61  siblity, do so a
18800 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69  nd return immedi
18810 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a 23 69  ately.  .  */.#i
18820 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18830 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 50 61  T_VIEW.  if( pPa
18840 72 65 6e 74 20 26 26 20 70 50 61 72 65 6e 74 41  rent && pParentA
18850 67 67 20 26 26 0a 20 20 20 20 20 20 66 6c 61 74  gg &&.      flat
18860 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72  tenSubquery(pPar
18870 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20  ent, parentTab, 
18880 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 69 73 41  *pParentAgg, isA
18890 67 67 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69  gg) ){.    if( i
188a0 73 41 67 67 20 29 20 2a 70 50 61 72 65 6e 74 41  sAgg ) *pParentA
188b0 67 67 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  gg = 1;.    goto
188c0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
188d0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
188e0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
188f0 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
18900 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a  en this sorting.
18910 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74    ** index might
18920 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e   end up being un
18930 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61  used if the data
18940 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78   can be .  ** ex
18950 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73  tracted in pre-s
18960 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66  orted order.  If
18970 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
18980 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  e, then the.  **
18990 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
189a0 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69  l instruction wi
189b0 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f  ll be changed to
189c0 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65   an OP_Noop once
189d0 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20  .  ** we figure 
189e0 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72  out that the sor
189f0 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f  ting index is no
18a00 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61  t needed.  The a
18a10 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a  ddrSortIndex.  *
18a20 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  * variable is us
18a30 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  ed to facilitate
18a40 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20   that change..  
18a50 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
18a60 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
18a70 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
18a80 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
18a90 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
18aa0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
18ab0 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
18ac0 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
18ad0 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ist(pParse, pOrd
18ae0 65 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65  erBy);.    pOrde
18af0 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20  rBy->iECursor = 
18b00 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
18b10 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
18b20 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72  phm[2] = addrSor
18b30 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73  tIndex =.      s
18b40 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
18b50 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
18b60 6c 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  l, pOrderBy->iEC
18b70 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d  ursor, pOrderBy-
18b80 3e 6e 45 78 70 72 2b 32 2c 20 20 20 20 20 20 20  >nExpr+2,       
18b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
18ba0 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
18bb0 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
18bc0 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  F);.  }else{.   
18bd0 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d   addrSortIndex =
18be0 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
18bf0 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
18c00 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
18c10 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
18c20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
18c30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
18c40 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
18c50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
18c60 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
18c70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 50 61  enEphemeral, iPa
18c80 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rm, pEList->nExp
18c90 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  r);.  }..  /* Se
18ca0 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20  t the limiter.. 
18cb0 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c   */.  iEnd = sql
18cc0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
18cd0 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c  l(v);.  computeL
18ce0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
18cf0 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a  arse, p, iEnd);.
18d00 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72  .  /* Open a vir
18d10 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73  tual index to us
18d20 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
18d30 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ct set..  */.  i
18d40 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b  f( isDistinct ){
18d50 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
18d60 65 79 49 6e 66 6f 3b 0a 20 20 20 20 64 69 73 74  eyInfo;.    dist
18d70 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
18d80 54 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49  Tab++;.    pKeyI
18d90 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
18da0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
18db0 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
18dc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
18dd0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
18de0 65 72 61 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20  eral, distinct, 
18df0 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
18e00 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
18e10 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f  r*)pKeyInfo, P3_
18e20 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
18e30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
18e40 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
18e50 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67 61 74  }..  /* Aggregat
18e60 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67  e and non-aggreg
18e70 61 74 65 20 71 75 65 72 69 65 73 20 61 72 65 20  ate queries are 
18e80 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
18e90 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  tly */.  if( !is
18ea0 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d  Agg && pGroupBy=
18eb0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
18ec0 73 20 63 61 73 65 20 69 73 20 66 6f 72 20 6e 6f  s case is for no
18ed0 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n-aggregate quer
18ee0 69 65 73 0a 20 20 20 20 2a 2a 20 42 65 67 69 6e  ies.    ** Begin
18ef0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
18f00 61 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 57  an.    */.    pW
18f10 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
18f20 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
18f30 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
18f40 65 2c 20 26 70 4f 72 64 65 72 42 79 29 3b 0a 20  e, &pOrderBy);. 
18f50 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
18f60 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
18f70 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73  nd;..    /* If s
18f80 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
18f90 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  t was created by
18fa0 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e   a prior OP_Open
18fb0 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a  Ephemeral .    *
18fc0 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e  * instruction en
18fd0 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67  ded up not being
18fe0 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68   needed, then ch
18ff0 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
19000 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a  Ephemeral.    **
19010 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70   into an OP_Noop
19020 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
19030 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d   addrSortIndex>=
19040 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30  0 && pOrderBy==0
19050 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
19060 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
19070 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64  p(v, addrSortInd
19080 65 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d  ex, 1);.      p-
19090 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
190a0 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20   = -1;.    }..  
190b0 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61    /* Use the sta
190c0 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70  ndard inner loop
190d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
190e0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
190f0 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73  pParse, p, pELis
19100 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42  t, 0, 0, pOrderB
19110 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65  y, distinct, eDe
19120 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
19130 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20 70          iParm, p
19140 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
19150 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
19160 2c 20 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20  , aff) ){.      
19170 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
19180 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19190 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
191a0 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
191b0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  */.    sqlite3Wh
191c0 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
191d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
191e0 54 68 69 73 20 69 73 20 74 68 65 20 70 72 6f 63  This is the proc
191f0 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
19200 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a  gate queries */.
19210 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
19220 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  sNC;    /* Name 
19230 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63  context for proc
19240 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
19250 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
19260 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20      int iAMem;  
19270 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
19280 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
19290 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74   storing current
192a0 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
192b0 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20   int iBMem;     
192c0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
192d0 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72  m address for pr
192e0 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20  evious GROUP BY 
192f0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46  */.    int iUseF
19300 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  lag;       /* Me
19310 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e  m address holdin
19320 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e  g flag indicatin
19330 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a  g that at least.
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19350 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72          ** one r
19360 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ow of the input 
19370 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  to the aggregato
19380 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  r has been.     
19390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193a0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
193b0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72  */.    int iAbor
193c0 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65  tFlag;     /* Me
193d0 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20  m address which 
193e0 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f  causes query abo
193f0 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  rt if positive *
19400 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42  /.    int groupB
19410 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77  ySort;    /* Row
19420 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72  s come from sour
19430 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ce in GROUP BY o
19440 72 64 65 72 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a  rder */...    /*
19450 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
19460 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 61 64  ariables hold ad
19470 64 72 65 73 73 65 73 20 6f 72 20 6c 61 62 65 6c  dresses or label
19480 73 20 66 6f 72 20 70 61 72 74 73 20 6f 66 20 74  s for parts of t
19490 68 65 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61  he.    ** virtua
194a0 6c 20 6d 61 63 68 69 6e 65 20 70 72 6f 67 72 61  l machine progra
194b0 6d 20 77 65 20 61 72 65 20 70 75 74 74 69 6e 67  m we are putting
194c0 20 74 6f 67 65 74 68 65 72 20 2a 2f 0a 20 20 20   together */.   
194d0 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52   int addrOutputR
194e0 6f 77 3b 20 20 20 20 20 20 2f 2a 20 53 74 61 72  ow;      /* Star
194f0 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20  t of subroutine 
19500 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72  that outputs a r
19510 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20  esult row */.   
19520 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72   int addrSetAbor
19530 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  t;       /* Set 
19540 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61  the abort flag a
19550 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20  nd return */.   
19560 20 69 6e 74 20 61 64 64 72 49 6e 69 74 69 61 6c   int addrInitial
19570 69 7a 65 4c 6f 6f 70 3b 20 2f 2a 20 53 74 61 72  izeLoop; /* Star
19580 74 20 6f 66 20 63 6f 64 65 20 74 68 61 74 20 69  t of code that i
19590 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 69  nitializes the i
195a0 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
195b0 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f   int addrTopOfLo
195c0 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54 6f 70 20  op;      /* Top 
195d0 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  of the input loo
195e0 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  p */.    int add
195f0 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 3b 20  rGroupByChange; 
19600 20 2f 2a 20 43 6f 64 65 20 74 68 61 74 20 72 75   /* Code that ru
19610 6e 73 20 77 68 65 6e 20 61 6e 79 20 47 52 4f 55  ns when any GROU
19620 50 20 42 59 20 74 65 72 6d 20 63 68 61 6e 67 65  P BY term change
19630 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  s */.    int add
19640 72 50 72 6f 63 65 73 73 52 6f 77 3b 20 20 20 20  rProcessRow;    
19650 20 2f 2a 20 43 6f 64 65 20 74 6f 20 70 72 6f 63   /* Code to proc
19660 65 73 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 70  ess a single inp
19670 75 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e  ut row */.    in
19680 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
19690 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
196a0 61 6c 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 2a  all processing *
196b0 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f  /.    int addrSo
196c0 72 74 69 6e 67 49 64 78 3b 20 20 20 20 20 2f 2a  rtingIdx;     /*
196d0 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
196e0 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f  meral for the so
196f0 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  rting index */. 
19700 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74     int addrReset
19710 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75  ;          /* Su
19720 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73  broutine for res
19730 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  etting the accum
19740 75 6c 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 61  ulator */..    a
19750 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33  ddrEnd = sqlite3
19760 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
19770 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  ;..    /* Conver
19780 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  t TK_COLUMN node
19790 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  s into TK_AGG_CO
197a0 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e  LUMN and make en
197b0 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20  tries in.    ** 
197c0 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c  sAggInfo for all
197d0 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
197e0 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73   nodes in expres
197f0 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20  sions of the.   
19800 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
19810 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ment..    */.   
19820 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
19830 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
19840 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
19850 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e  pParse;.    sNC.
19860 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
19870 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67  ist;.    sNC.pAg
19880 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66  gInfo = &sAggInf
19890 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  o;.    sAggInfo.
198a0 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d  nSortingColumn =
198b0 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f   pGroupBy ? pGro
198c0 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20  upBy->nExpr+1 : 
198d0 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  0;.    sAggInfo.
198e0 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
198f0 70 42 79 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  pBy;.    if( sql
19900 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
19910 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c  ggList(&sNC, pEL
19920 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ist) ){.      go
19930 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
19940 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
19950 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
19960 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72  ggList(&sNC, pOr
19970 64 65 72 42 79 29 20 29 7b 0a 20 20 20 20 20 20  derBy) ){.      
19980 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
19990 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
199a0 48 61 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65  Having && sqlite
199b0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
199c0 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61  egates(&sNC, pHa
199d0 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67  ving) ){.      g
199e0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
199f0 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
19a00 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  fo.nAccumulator 
19a10 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  = sAggInfo.nColu
19a20 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  mn;.    for(i=0;
19a30 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e   i<sAggInfo.nFun
19a40 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; i++){.      i
19a50 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  f( sqlite3ExprAn
19a60 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
19a70 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  C, sAggInfo.aFun
19a80 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 4c 69 73  c[i].pExpr->pLis
19a90 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  t) ){.        go
19aa0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
19ab0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
19ac0 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c   if( sqlite3Mall
19ad0 6f 63 46 61 69 6c 65 64 28 29 20 29 20 67 6f 74  ocFailed() ) got
19ae0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
19af0 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67     /* Processing
19b00 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20   for aggregates 
19b10 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73  with GROUP BY is
19b20 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20   very different 
19b30 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20  and.    ** much 
19b40 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61  more complex tha
19b50 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
19b60 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a  out a GROUP BY..
19b70 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
19b80 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
19b90 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
19ba0 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69  fo;  /* Keying i
19bb0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
19bc0 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75  he group by clau
19bd0 73 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  se */..      /* 
19be0 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 74 68  Create labels th
19bf0 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 6e 65  at we will be ne
19c00 65 64 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20  eding.      */. 
19c10 20 20 20 20 0a 20 20 20 20 20 20 61 64 64 72 49      .      addrI
19c20 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 20 3d 20  nitializeLoop = 
19c30 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
19c40 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61  abel(v);.      a
19c50 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65  ddrGroupByChange
19c60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
19c70 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
19c80 20 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77    addrProcessRow
19c90 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
19ca0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20  keLabel(v);..   
19cb0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
19cc0 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  s a GROUP BY cla
19cd0 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65  use we might nee
19ce0 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  d a sorting inde
19cf0 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d  x to.      ** im
19d00 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c  plement it.  All
19d10 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69  ocate that sorti
19d20 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49  ng index now.  I
19d30 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20  f it turns out. 
19d40 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
19d50 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61  do not need it a
19d60 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 70  fter all, the Op
19d70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
19d80 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ruction.      **
19d90 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
19da0 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20  ed into a Noop. 
19db0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
19dc0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
19dd0 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gIdx = pParse->n
19de0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65  Tab++;.      pKe
19df0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
19e00 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
19e10 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20  se, pGroupBy);. 
19e20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67       addrSorting
19e30 49 64 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20  Idx =.          
19e40 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
19e50 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
19e60 61 6c 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  al, sAggInfo.sor
19e70 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20  tingIdx,.       
19e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e90 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
19ea0 69 6e 67 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ingColumn,.     
19eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ec0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
19ed0 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f  nfo, P3_KEYINFO_
19ee0 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20  HANDOFF);..     
19ef0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d   /* Initialize m
19f00 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20  emory locations 
19f10 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59  used by GROUP BY
19f20 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65   aggregate proce
19f30 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20  ssing.      */. 
19f40 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20       iUseFlag = 
19f50 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
19f60 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67        iAbortFlag
19f70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
19f80 2b 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d  +;.      iAMem =
19f90 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20   pParse->nMem;. 
19fa0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
19fb0 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
19fc0 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65  Expr;.      iBMe
19fd0 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
19fe0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
19ff0 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
1a000 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->nExpr;.      s
1a010 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1a020 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c  v, OP_MemInt, 0,
1a030 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
1a040 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1a050 28 76 2c 20 22 23 20 63 6c 65 61 72 20 61 62 6f  (v, "# clear abo
1a060 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
1a070 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a080 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c  Op(v, OP_MemInt,
1a090 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   0, iUseFlag);. 
1a0a0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1a0b0 28 28 76 2c 20 22 23 20 69 6e 64 69 63 61 74 65  ((v, "# indicate
1a0c0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70   accumulator emp
1a0d0 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ty"));.      sql
1a0e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1a0f0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
1a100 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29  rInitializeLoop)
1a110 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
1a120 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
1a130 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61  e that outputs a
1a140 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
1a150 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
1a160 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73 75  ** set.  This su
1a170 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c  broutine first l
1a180 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73 65  ooks at the iUse
1a190 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c  Flag.  If iUseFl
1a1a0 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c  ag.      ** is l
1a1b0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
1a1c0 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73  l to zero, the s
1a1d0 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  ubroutine is a n
1a1e0 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20  o-op.  If.      
1a1f0 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  ** the processin
1a200 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  g calls for the 
1a210 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20  query to abort, 
1a220 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a  this subroutine.
1a230 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65        ** increme
1a240 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c  nts the iAbortFl
1a250 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ag memory locati
1a260 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  on before return
1a270 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ing in.      ** 
1a280 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20  order to signal 
1a290 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62  the caller to ab
1a2a0 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ort..      */.  
1a2b0 20 20 20 20 61 64 64 72 53 65 74 41 62 6f 72 74      addrSetAbort
1a2c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1a2d0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
1a2e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a2f0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
1a300 74 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67  t, 1, iAbortFlag
1a310 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
1a320 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 65 74 20  ment((v, "# set 
1a330 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
1a340 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a350 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75  AddOp(v, OP_Retu
1a360 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  rn, 0, 0);.     
1a370 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
1a380 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1a390 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
1a3a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a3b0 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f  Op(v, OP_IfMemPo
1a3c0 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64  s, iUseFlag, add
1a3d0 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20  rOutputRow+2);. 
1a3e0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1a3f0 28 28 76 2c 20 22 23 20 47 72 6f 75 70 62 79 20  ((v, "# Groupby 
1a400 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72  result generator
1a410 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b   entry point"));
1a420 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a430 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
1a440 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  turn, 0, 0);.   
1a450 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
1a460 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
1a470 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
1a480 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b    if( pHaving ){
1a490 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a4a0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1a4b0 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
1a4c0 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 31 29  rOutputRow+1, 1)
1a4d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a4e0 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72  rc = selectInner
1a4f0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
1a500 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p->pEList, 0, 0,
1a510 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   pOrderBy,.     
1a520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a530 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 2c 20        distinct, 
1a540 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20  eDest, iParm, . 
1a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a560 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75            addrOu
1a570 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53  tputRow+1, addrS
1a580 65 74 41 62 6f 72 74 2c 20 61 66 66 29 3b 0a 20  etAbort, aff);. 
1a590 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1a5a0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
1a5b0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
1a5c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a5d0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74  eAddOp(v, OP_Ret
1a5e0 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  urn, 0, 0);.    
1a5f0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1a600 2c 20 22 23 20 65 6e 64 20 67 72 6f 75 70 62 79  , "# end groupby
1a610 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
1a620 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
1a630 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1a640 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
1a650 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d  reset the group-
1a660 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20  by accumulator. 
1a670 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
1a680 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65  drReset = sqlite
1a690 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1a6a0 28 76 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74  (v);.      reset
1a6b0 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
1a6c0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
1a6d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a6e0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74  eAddOp(v, OP_Ret
1a6f0 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  urn, 0, 0);..   
1a700 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f     /* Begin a lo
1a710 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  op that will ext
1a720 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20  ract all source 
1a730 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59  rows in GROUP BY
1a740 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a   order..      **
1a750 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f   This might invo
1a760 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65  lve two separate
1a770 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f   loops with an O
1a780 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65  P_Sort in betwee
1a790 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  n, or.      ** i
1a7a0 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e  t might be a sin
1a7b0 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73  gle loop that us
1a7c0 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65  es an index to e
1a7d0 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69  xtract informati
1a7e0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  on.      ** in t
1a7f0 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74  he right order t
1a800 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20  o begin with..  
1a810 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
1a820 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1a830 61 62 65 6c 28 76 2c 20 61 64 64 72 49 6e 69 74  abel(v, addrInit
1a840 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20 20  ializeLoop);.   
1a850 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a860 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  dOp(v, OP_Gosub,
1a870 20 30 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a   0, addrReset);.
1a880 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
1a890 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1a8a0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
1a8b0 74 2c 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f  t, pWhere, &pGro
1a8c0 75 70 42 79 29 3b 0a 20 20 20 20 20 20 69 66 28  upBy);.      if(
1a8d0 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
1a8e0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1a8f0 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
1a900 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
1a910 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  * The optimizer 
1a920 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76  is able to deliv
1a930 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70  er rows in group
1a940 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20   by order so.   
1a950 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f       ** we do no
1a960 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20  t have to sort. 
1a970 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
1a980 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c  meral table will
1a990 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63   be.        ** c
1a9a0 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62  ancelled later b
1a9b0 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20  ecause we still 
1a9c0 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  need to use the 
1a9d0 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20  pKeyInfo.       
1a9e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 47 72 6f   */.        pGro
1a9f0 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
1aa00 42 79 3b 0a 20 20 20 20 20 20 20 20 67 72 6f 75  By;.        grou
1aa10 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20  pBySort = 0;.   
1aa20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1aa30 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f    /* Rows are co
1aa40 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65  ming out in unde
1aa50 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20  termined order. 
1aa60 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68   We have to push
1aa70 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68  .        ** each
1aa80 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74   row into a sort
1aa90 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69  ing index, termi
1aaa0 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c  nate the first l
1aab0 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  oop,.        ** 
1aac0 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74  then loop over t
1aad0 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
1aae0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
1aaf0 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20   the output.    
1ab00 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64      ** in sorted
1ab10 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a   order.        *
1ab20 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  /.        groupB
1ab30 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  ySort = 1;.     
1ab40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1ab50 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
1ab60 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  e, pGroupBy);.  
1ab70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ab80 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 71  eAddOp(v, OP_Seq
1ab90 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e  uence, sAggInfo.
1aba0 73 6f 72 74 69 6e 67 49 64 78 2c 20 30 29 3b 0a  sortingIdx, 0);.
1abb0 20 20 20 20 20 20 20 20 6a 20 3d 20 70 47 72 6f          j = pGro
1abc0 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 3b 0a 20  upBy->nExpr+1;. 
1abd0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1abe0 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
1abf0 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
1ac00 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
1ac10 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
1ac20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
1ac30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1ac40 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
1ac50 75 6d 6e 3c 6a 20 29 20 63 6f 6e 74 69 6e 75 65  umn<j ) continue
1ac60 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1ac70 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1ac80 6c 75 6d 6e 28 76 2c 20 70 43 6f 6c 2d 3e 70 54  lumn(v, pCol->pT
1ac90 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d  ab, pCol->iColum
1aca0 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 29  n, pCol->iTable)
1acb0 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b  ;.          j++;
1acc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1acd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ace0 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
1acf0 63 6f 72 64 2c 20 6a 2c 20 30 29 3b 0a 20 20 20  cord, j, 0);.   
1ad00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ad10 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49  AddOp(v, OP_IdxI
1ad20 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  nsert, sAggInfo.
1ad30 73 6f 72 74 69 6e 67 49 64 78 2c 20 30 29 3b 0a  sortingIdx, 0);.
1ad40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
1ad50 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
1ad60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ad70 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1ad80 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Sort, sAggInfo.s
1ad90 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45  ortingIdx, addrE
1ada0 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  nd);.        Vdb
1adb0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
1adc0 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29  GROUP BY sort"))
1add0 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e  ;.        sAggIn
1ade0 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78  fo.useSortingIdx
1adf0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 1;.      }.. 
1ae00 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65       /* Evaluate
1ae10 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
1ae20 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20  UP BY terms and 
1ae30 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c  store in b0, b1,
1ae40 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20   b2....      ** 
1ae50 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f  (b0 is memory lo
1ae60 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20  cation iBMem+0, 
1ae70 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61  b1 is iBMem+1, a
1ae80 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20  nd so forth).   
1ae90 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61     ** Then compa
1aea0 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  re the current G
1aeb0 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67  ROUP BY terms ag
1aec0 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20  ainst the GROUP 
1aed0 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a  BY terms.      *
1aee0 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  * from the previ
1aef0 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c  ous row currentl
1af00 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20  y stored in a0, 
1af10 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20  a1, a2....      
1af20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  */.      addrTop
1af30 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  OfLoop = sqlite3
1af40 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1af50 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  v);.      for(j=
1af60 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; j<pGroupBy->n
1af70 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
1af80 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
1af90 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ort ){.         
1afa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1afb0 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
1afc0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
1afd0 49 64 78 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20  Idx, j);.       
1afe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1aff0 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63    sAggInfo.direc
1b000 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20  tMode = 1;.     
1b010 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b020 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72  Code(pParse, pGr
1b030 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70  oupBy->a[j].pExp
1b040 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
1b050 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b060 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
1b070 53 74 6f 72 65 2c 20 69 42 4d 65 6d 2b 6a 2c 20  Store, iBMem+j, 
1b080 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  j<pGroupBy->nExp
1b090 72 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  r-1);.      }.  
1b0a0 20 20 20 20 66 6f 72 28 6a 3d 70 47 72 6f 75 70      for(j=pGroup
1b0b0 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 6a 3e 3d  By->nExpr-1; j>=
1b0c0 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 20  0; j--){.       
1b0d0 20 69 66 28 20 6a 3c 70 47 72 6f 75 70 42 79 2d   if( j<pGroupBy-
1b0e0 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20  >nExpr-1 ){.    
1b0f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b100 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
1b110 4c 6f 61 64 2c 20 69 42 4d 65 6d 2b 6a 2c 20 30  Load, iBMem+j, 0
1b120 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1b130 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b140 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c  AddOp(v, OP_MemL
1b150 6f 61 64 2c 20 69 41 4d 65 6d 2b 6a 2c 20 30 29  oad, iAMem+j, 0)
1b160 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  ;.        if( j=
1b170 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1b180 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b190 28 76 2c 20 4f 50 5f 45 71 2c 20 30 78 32 30 30  (v, OP_Eq, 0x200
1b1a0 2c 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77  , addrProcessRow
1b1b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
1b1c0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1b1d0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1b1e0 4f 50 5f 4e 65 2c 20 30 78 32 30 30 2c 20 61 64  OP_Ne, 0x200, ad
1b1f0 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 29  drGroupByChange)
1b200 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b210 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1b220 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28  hangeP3(v, -1, (
1b230 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2d 3e  void*)pKeyInfo->
1b240 61 43 6f 6c 6c 5b 6a 5d 2c 20 50 33 5f 43 4f 4c  aColl[j], P3_COL
1b250 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  LSEQ);.      }..
1b260 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
1b270 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73  e code that runs
1b280 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52   whenever the GR
1b290 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a  OUP BY changes..
1b2a0 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 20        ** Change 
1b2b0 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  in the GROUP BY 
1b2c0 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20  are detected by 
1b2d0 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
1b2e0 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  e.      ** block
1b2f0 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
1b300 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69   no changes, thi
1b310 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70  s block is skipp
1b320 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
1b330 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
1b340 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67  copies current g
1b350 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e  roup by terms in
1b360 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20   b0,b1,b2,....  
1b370 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61      ** over to a
1b380 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65  0,a1,a2.  It the
1b390 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70  n calls the outp
1b3a0 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  ut subroutine.  
1b3b0 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74      ** and reset
1b3c0 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  s the aggregate 
1b3d0 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
1b3e0 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61  sters in prepara
1b3f0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f  tion.      ** fo
1b400 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50  r the next GROUP
1b410 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20   BY batch..     
1b420 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1b430 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1b440 6c 28 76 2c 20 61 64 64 72 47 72 6f 75 70 42 79  l(v, addrGroupBy
1b450 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 66  Change);.      f
1b460 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70  or(j=0; j<pGroup
1b470 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  By->nExpr; j++){
1b480 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b490 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1b4a0 4d 65 6d 4d 6f 76 65 2c 20 69 41 4d 65 6d 2b 6a  MemMove, iAMem+j
1b4b0 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
1b4c0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1b4d0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1b4e0 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 4f  _Gosub, 0, addrO
1b4f0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
1b500 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1b510 20 22 23 20 6f 75 74 70 75 74 20 6f 6e 65 20 72   "# output one r
1b520 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ow"));.      sql
1b530 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1b540 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 41   OP_IfMemPos, iA
1b550 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e  bortFlag, addrEn
1b560 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  d);.      VdbeCo
1b570 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 63 68 65  mment((v, "# che
1b580 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  ck abort flag"))
1b590 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1b5a0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
1b5b0 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 52 65 73  osub, 0, addrRes
1b5c0 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  et);.      VdbeC
1b5d0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 72 65  omment((v, "# re
1b5e0 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22  set accumulator"
1b5f0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ));..      /* Up
1b600 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61  date the aggrega
1b610 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20  te accumulators 
1b620 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  based on the con
1b630 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tent of.      **
1b640 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
1b650 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1b660 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1b670 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 50  veLabel(v, addrP
1b680 72 6f 63 65 73 73 52 6f 77 29 3b 0a 20 20 20 20  rocessRow);.    
1b690 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
1b6a0 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
1b6b0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
1b6c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1b6d0 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20  , OP_MemInt, 1, 
1b6e0 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
1b6f0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1b700 20 22 23 20 69 6e 64 69 63 61 74 65 20 64 61 74   "# indicate dat
1b710 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72  a in accumulator
1b720 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  "));..      /* E
1b730 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  nd of the loop. 
1b740 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1b750 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
1b760 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b770 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1b780 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Next, sAggInfo.s
1b790 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54  ortingIdx, addrT
1b7a0 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  opOfLoop);.     
1b7b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b7c0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
1b7d0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
1b7e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1b7f0 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
1b800 53 6f 72 74 69 6e 67 49 64 78 2c 20 31 29 3b 0a  SortingIdx, 1);.
1b810 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1b820 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e  * Output the fin
1b830 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  al row of result
1b840 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1b850 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b860 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c  (v, OP_Gosub, 0,
1b870 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
1b880 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
1b890 6e 74 28 28 76 2c 20 22 23 20 6f 75 74 70 75 74  nt((v, "# output
1b8a0 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 20   final row"));. 
1b8b0 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65       .    } /* e
1b8c0 6e 64 69 66 20 70 47 72 6f 75 70 42 79 20 2a 2f  ndif pGroupBy */
1b8d0 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20  .    else {.    
1b8e0 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72    /* This case r
1b8f0 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65  uns if the aggre
1b900 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55  gate has no GROU
1b910 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68  P BY clause.  Th
1b920 65 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65  e.      ** proce
1b930 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69  ssing is much si
1b940 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72  mpler since ther
1b950 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  e is only a sing
1b960 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 2a 2a 20  le row.      ** 
1b970 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20  of output..     
1b980 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 74 41   */.      resetA
1b990 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
1b9a0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
1b9b0 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
1b9c0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1b9d0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
1b9e0 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  , pWhere, 0);.  
1b9f0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
1ba00 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
1ba10 65 6e 64 3b 0a 20 20 20 20 20 20 75 70 64 61 74  end;.      updat
1ba20 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
1ba30 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
1ba40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68  .      sqlite3Wh
1ba50 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
1ba60 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
1ba70 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
1ba80 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
1ba90 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
1baa0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 61  0;.      if( pHa
1bab0 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  ving ){.        
1bac0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1bad0 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
1bae0 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 31 29 3b  ng, addrEnd, 1);
1baf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1bb00 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
1bb10 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
1bb20 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31  ist, 0, 0, 0, -1
1bb30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1bb40 20 20 20 20 20 20 20 20 20 65 44 65 73 74 2c 20           eDest, 
1bb50 69 50 61 72 6d 2c 20 61 64 64 72 45 6e 64 2c 20  iParm, addrEnd, 
1bb60 61 64 64 72 45 6e 64 2c 20 61 66 66 29 3b 0a 20  addrEnd, aff);. 
1bb70 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1bb80 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1bb90 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  (v, addrEnd);.  
1bba0 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20    .  } /* endif 
1bbb0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
1bbc0 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  */..  /* If ther
1bbd0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
1bbe0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65   clause, then we
1bbf0 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68   need to sort th
1bc00 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61  e results.  ** a
1bc10 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20  nd send them to 
1bc20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65  the callback one
1bc30 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20   by one..  */.  
1bc40 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
1bc50 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
1bc60 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20  Tail(pParse, p, 
1bc70 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  v, pEList->nExpr
1bc80 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b  , eDest, iParm);
1bc90 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
1bca0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1bcb0 52 59 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  RY.  /* If this 
1bcc0 77 61 73 20 61 20 73 75 62 71 75 65 72 79 2c 20  was a subquery, 
1bcd0 77 65 20 68 61 76 65 20 6e 6f 77 20 63 6f 6e 76  we have now conv
1bce0 65 72 74 65 64 20 74 68 65 20 73 75 62 71 75 65  erted the subque
1bcf0 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74  ry into a.  ** t
1bd00 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
1bd10 20 53 6f 20 73 65 74 20 74 68 65 20 53 72 63 4c   So set the SrcL
1bd20 69 73 74 5f 69 74 65 6d 2e 69 73 50 6f 70 75 6c  ist_item.isPopul
1bd30 61 74 65 64 20 66 6c 61 67 20 74 6f 20 70 72 65  ated flag to pre
1bd40 76 65 6e 74 0a 20 20 2a 2a 20 74 68 69 73 20 73  vent.  ** this s
1bd50 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62 65 69  ubquery from bei
1bd60 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61 67 61  ng evaluated aga
1bd70 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63 65 20  in and to force 
1bd80 74 68 65 20 75 73 65 20 6f 66 0a 20 20 2a 2a 20  the use of.  ** 
1bd90 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
1bda0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
1bdb0 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 61  pParent ){.    a
1bdc0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1bdd0 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72 65 6e  pSrc->nSrc>paren
1bde0 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73 73 65  tTab );.    asse
1bdf0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  rt( pParent->pSr
1be00 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e  c->a[parentTab].
1be10 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a 20 20  pSelect==p );.  
1be20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d    pParent->pSrc-
1be30 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 69 73  >a[parentTab].is
1be40 50 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b 0a 20  Populated = 1;. 
1be50 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1be60 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69  Jump here to ski
1be70 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a  p this query.  *
1be80 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
1be90 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
1bea0 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  End);..  /* The 
1beb0 53 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65  SELECT was succe
1bec0 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20  ssfully coded.  
1bed0 20 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20   Set the return 
1bee0 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74  code to 0.  ** t
1bef0 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72  o indicate no er
1bf00 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  rors..  */.  rc 
1bf10 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72  = 0;..  /* Contr
1bf20 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65  ol jumps to here
1bf30 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
1bf40 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76  encountered abov
1bf50 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20  e, or upon.  ** 
1bf60 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e  successful codin
1bf70 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  g of the SELECT.
1bf80 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64  .  */.select_end
1bf90 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79  :..  /* Identify
1bfa0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66   column names if
1bfb0 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
1bfc0 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c  g them in a call
1bfd0 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  back.  This.  **
1bfe0 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64   step is skipped
1bff0 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   if the output i
1c000 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20  s going to some 
1c010 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74 69 6f  other destinatio
1c020 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  n..  */.  if( rc
1c030 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
1c040 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
1c050 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ck ){.    genera
1c060 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
1c070 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
1c080 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
1c090 73 71 6c 69 74 65 46 72 65 65 28 73 41 67 67 49  sqliteFree(sAggI
1c0a0 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c  nfo.aCol);.  sql
1c0b0 69 74 65 46 72 65 65 28 73 41 67 67 49 6e 66 6f  iteFree(sAggInfo
1c0c0 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72  .aFunc);.  retur
1c0d0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  n rc;.}..#if def
1c0e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1c0f0 47 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  G)./*.**********
1c100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c140 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  *****.** The fol
1c150 6c 6f 77 69 6e 67 20 63 6f 64 65 20 69 73 20 75  lowing code is u
1c160 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
1c170 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
1c180 6c 79 2e 20 20 54 68 65 20 63 6f 64 65 0a 2a 2a  ly.  The code.**
1c190 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64 6f   that follows do
1c1a0 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e  es not appear in
1c1b0 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2e 0a   normal builds..
1c1c0 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
1c1d0 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
1c1e0 20 70 72 69 6e 74 20 6f 75 74 20 74 68 65 20 63   print out the c
1c1f0 6f 6e 74 65 6e 74 20 6f 66 20 61 6c 6c 20 6f 72  ontent of all or
1c200 20 70 61 72 74 20 6f 66 20 61 20 0a 2a 2a 20 70   part of a .** p
1c210 61 72 73 65 20 73 74 72 75 63 74 75 72 65 73 20  arse structures 
1c220 73 75 63 68 20 61 73 20 53 65 6c 65 63 74 20 6f  such as Select o
1c230 72 20 45 78 70 72 2e 20 20 53 75 63 68 20 70 72  r Expr.  Such pr
1c240 69 6e 74 6f 75 74 73 20 61 72 65 20 75 73 65 66  intouts are usef
1c250 75 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c 70 69 6e  ul.** for helpin
1c260 67 20 74 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  g to understand 
1c270 77 68 61 74 20 69 73 20 68 61 70 70 65 6e 69 6e  what is happenin
1c280 67 20 69 6e 73 69 64 65 20 74 68 65 20 63 6f 64  g inside the cod
1c290 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 64  e generator.** d
1c2a0 75 72 69 6e 67 20 74 68 65 20 65 78 65 63 75 74  uring the execut
1c2b0 69 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65 78 20 53  ion of complex S
1c2c0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
1c2d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
1c2e0 75 74 69 6e 65 20 61 72 65 20 6e 6f 74 20 63 61  utine are not ca
1c2f0 6c 6c 65 64 20 61 6e 79 77 68 65 72 65 20 66 72  lled anywhere fr
1c300 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 6e 6f  om within the no
1c310 72 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20 62 61 73  rmal.** code bas
1c320 65 2e 20 20 54 68 65 6e 20 61 72 65 20 69 6e 74  e.  Then are int
1c330 65 6e 64 65 64 20 74 6f 20 62 65 20 63 61 6c 6c  ended to be call
1c340 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ed from within t
1c350 68 65 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 6f  he debugger.** o
1c360 72 20 66 72 6f 6d 20 74 65 6d 70 6f 72 61 72 79  r from temporary
1c370 20 22 70 72 69 6e 74 66 22 20 73 74 61 74 65 6d   "printf" statem
1c380 65 6e 74 73 20 69 6e 73 65 72 74 65 64 20 66 6f  ents inserted fo
1c390 72 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a  r debugging..*/.
1c3a0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e  void sqlite3Prin
1c3b0 74 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a  tExpr(Expr *p){.
1c3c0 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a    if( p->token.z
1c3d0 20 26 26 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 3e 30   && p->token.n>0
1c3e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1c3f0 65 62 75 67 50 72 69 6e 74 66 28 22 28 25 2e 2a  ebugPrintf("(%.*
1c400 73 22 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20  s", p->token.n, 
1c410 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 7d  p->token.z);.  }
1c420 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
1c430 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 25  3DebugPrintf("(%
1c440 64 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a  d", p->op);.  }.
1c450 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 29    if( p->pLeft )
1c460 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
1c470 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20  ugPrintf(" ");. 
1c480 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
1c490 78 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  xpr(p->pLeft);. 
1c4a0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67   }.  if( p->pRig
1c4b0 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ht ){.    sqlite
1c4c0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 22  3DebugPrintf(" "
1c4d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
1c4e0 69 6e 74 45 78 70 72 28 70 2d 3e 70 52 69 67 68  intExpr(p->pRigh
1c4f0 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
1c500 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 29 22  3DebugPrintf(")"
1c510 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
1c520 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 45  3PrintExprList(E
1c530 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
1c540 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1c550 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1c560 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
1c570 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
1c580 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1c590 72 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 4c  r);.    if( i<pL
1c5a0 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a  ist->nExpr-1 ){.
1c5b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
1c5c0 75 67 50 72 69 6e 74 66 28 22 2c 20 22 29 3b 0a  ugPrintf(", ");.
1c5d0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64      }.  }.}.void
1c5e0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c   sqlite3PrintSel
1c5f0 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69  ect(Select *p, i
1c600 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 73 71  nt indent){.  sq
1c610 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1c620 28 22 25 2a 73 53 45 4c 45 43 54 28 25 70 29 20  ("%*sSELECT(%p) 
1c630 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 2c 20 70  ", indent, "", p
1c640 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 72 69 6e  );.  sqlite3Prin
1c650 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c  tExprList(p->pEL
1c660 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ist);.  sqlite3D
1c670 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
1c680 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20  ;.  if( p->pSrc 
1c690 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72  ){.    char *zPr
1c6a0 65 66 69 78 3b 0a 20 20 20 20 69 6e 74 20 69 3b  efix;.    int i;
1c6b0 0a 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22  .    zPrefix = "
1c6c0 46 52 4f 4d 22 3b 0a 20 20 20 20 66 6f 72 28 69  FROM";.    for(i
1c6d0 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e  =0; i<p->pSrc->n
1c6e0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
1c6f0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1c700 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
1c710 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  ->pSrc->a[i];.  
1c720 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1c730 50 72 69 6e 74 66 28 22 25 2a 73 20 22 2c 20 69  Printf("%*s ", i
1c740 6e 64 65 6e 74 2b 36 2c 20 7a 50 72 65 66 69 78  ndent+6, zPrefix
1c750 29 3b 0a 20 20 20 20 20 20 7a 50 72 65 66 69 78  );.      zPrefix
1c760 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 69 66 28   = "";.      if(
1c770 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
1c780 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1c790 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28  e3DebugPrintf("(
1c7a0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71  \n");.        sq
1c7b0 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74  lite3PrintSelect
1c7c0 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c  (pItem->pSelect,
1c7d0 20 69 6e 64 65 6e 74 2b 31 30 29 3b 0a 20 20 20   indent+10);.   
1c7e0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
1c7f0 67 50 72 69 6e 74 66 28 22 25 2a 73 29 22 2c 20  gPrintf("%*s)", 
1c800 69 6e 64 65 6e 74 2b 38 2c 20 22 22 29 3b 0a 20  indent+8, "");. 
1c810 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1c820 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  Item->zName ){. 
1c830 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
1c840 62 75 67 50 72 69 6e 74 66 28 22 25 73 22 2c 20  bugPrintf("%s", 
1c850 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
1c860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1c870 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a   pItem->pTab ){.
1c880 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
1c890 65 62 75 67 50 72 69 6e 74 66 28 22 28 74 61 62  ebugPrintf("(tab
1c8a0 6c 65 3a 20 25 73 29 22 2c 20 70 49 74 65 6d 2d  le: %s)", pItem-
1c8b0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  >pTab->zName);. 
1c8c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1c8d0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29   pItem->zAlias )
1c8e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c8f0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 41  3DebugPrintf(" A
1c900 53 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41  S %s", pItem->zA
1c910 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lias);.      }. 
1c920 20 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 70 53       if( i<p->pS
1c930 72 63 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20  rc->nSrc-1 ){.  
1c940 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
1c950 75 67 50 72 69 6e 74 66 28 22 2c 22 29 3b 0a 20  ugPrintf(",");. 
1c960 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1c970 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1c980 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  "\n");.    }.  }
1c990 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
1c9a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1c9b0 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20  ebugPrintf("%*s 
1c9c0 57 48 45 52 45 20 22 2c 20 69 6e 64 65 6e 74 2c  WHERE ", indent,
1c9d0 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   "");.    sqlite
1c9e0 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 57  3PrintExpr(p->pW
1c9f0 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  here);.    sqlit
1ca00 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
1ca10 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n");.  }.  if( p
1ca20 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
1ca30 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1ca40 69 6e 74 66 28 22 25 2a 73 20 47 52 4f 55 50 20  intf("%*s GROUP 
1ca50 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  BY ", indent, ""
1ca60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
1ca70 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  intExprList(p->p
1ca80 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71  GroupBy);.    sq
1ca90 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1caa0 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66  ("\n");.  }.  if
1cab0 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a  ( p->pHaving ){.
1cac0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1cad0 50 72 69 6e 74 66 28 22 25 2a 73 20 48 41 56 49  Printf("%*s HAVI
1cae0 4e 47 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  NG ", indent, ""
1caf0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
1cb00 69 6e 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69  intExpr(p->pHavi
1cb10 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ng);.    sqlite3
1cb20 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
1cb30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
1cb40 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1cb50 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1cb60 74 66 28 22 25 2a 73 20 4f 52 44 45 52 20 42 59  tf("%*s ORDER BY
1cb70 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b   ", indent, "");
1cb80 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e  .    sqlite3Prin
1cb90 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72  tExprList(p->pOr
1cba0 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  derBy);.    sqli
1cbb0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1cbc0 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45  \n");.  }.}./* E
1cbd0 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  nd of the struct
1cbe0 75 72 65 20 64 65 62 75 67 20 70 72 69 6e 74 69  ure debug printi
1cbf0 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a  ng code.********
1cc00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cc10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cc20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cc30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cc40 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  *****/.#endif /*
1cc50 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1cc60 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64  TEST) || defined
1cc70 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 2a  (SQLITE_DEBUG) *
1cc80 2f 0a                                            /.