/ Hex Artifact Content
Login

Artifact 30af458c6a0a4a283c67b56c70ff0712b67d42ae:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 33 33 31  select.c,v 1.331
0200: 20 32 30 30 37 2f 30 33 2f 32 39 20 30 35 3a 35   2007/03/29 05:5
0210: 31 3a 34 39 20 64 72 68 20 45 78 70 20 24 0a 2a  1:49 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20   Delete all the 
0250: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c  content of a Sel
0260: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 62 75  ect structure bu
0270: 74 20 64 6f 20 6e 6f 74 20 64 65 61 6c 6c 6f 63  t do not dealloc
0280: 61 74 65 0a 2a 2a 20 74 68 65 20 73 65 6c 65 63  ate.** the selec
0290: 74 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  t structure itse
02a0: 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  lf..*/.static vo
02b0: 69 64 20 63 6c 65 61 72 53 65 6c 65 63 74 28 53  id clearSelect(S
02c0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c  elect *p){.  sql
02d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
02e0: 74 65 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  te(p->pEList);. 
02f0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
0300: 65 6c 65 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a  elete(p->pSrc);.
0310: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
0320: 65 74 65 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a  ete(p->pWhere);.
0330: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0340: 74 44 65 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75  tDelete(p->pGrou
0350: 70 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  pBy);.  sqlite3E
0360: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 48 61  xprDelete(p->pHa
0370: 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  ving);.  sqlite3
0380: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
0390: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73  ->pOrderBy);.  s
03a0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
03b0: 74 65 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  te(p->pPrior);. 
03c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
03d0: 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  te(p->pLimit);. 
03e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
03f0: 74 65 28 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a  te(p->pOffset);.
0400: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  }.../*.** Alloca
0410: 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20  te a new Select 
0420: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65  structure and re
0430: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
0440: 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74  o that.** struct
0450: 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a  ure..*/.Select *
0460: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77  sqlite3SelectNew
0470: 28 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  (.  ExprList *pE
0480: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69  List,     /* whi
0490: 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e  ch columns to in
04a0: 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73  clude in the res
04b0: 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ult */.  SrcList
04c0: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f   *pSrc,        /
04d0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
04e0: 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65  e -- which table
04f0: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
0500: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
0510: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
0520: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
0530: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
0540: 2c 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50  ,   /* the GROUP
0550: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
0560: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20  Expr *pHaving,  
0570: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56        /* the HAV
0580: 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ING clause */.  
0590: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
05a0: 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44  By,   /* the ORD
05b0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
05c0: 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74    int isDistinct
05d0: 2c 20 20 20 20 20 20 20 2f 2a 20 74 72 75 65 20  ,       /* true 
05e0: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
05f0: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
0600: 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  nt */.  Expr *pL
0610: 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  imit,         /*
0620: 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e   LIMIT value.  N
0630: 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73  ULL means not us
0640: 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  ed */.  Expr *pO
0650: 66 66 73 65 74 20 20 20 20 20 20 20 20 20 2f 2a  ffset         /*
0660: 20 4f 46 46 53 45 54 20 76 61 6c 75 65 2e 20 20   OFFSET value.  
0670: 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66  NULL means no of
0680: 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  fset */.){.  Sel
0690: 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
06a0: 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20 20 70  ect standin;.  p
06b0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
06c0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
06d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
06e0: 70 4f 66 66 73 65 74 20 7c 7c 20 70 4c 69 6d 69  pOffset || pLimi
06f0: 74 20 29 3b 20 20 20 2f 2a 20 43 61 6e 27 74 20  t );   /* Can't 
0700: 68 61 76 65 20 4f 46 46 53 45 54 20 77 69 74 68  have OFFSET with
0710: 6f 75 74 20 4c 49 4d 49 54 2e 20 2a 2f 0a 20 20  out LIMIT. */.  
0720: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
0730: 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61 6e 64     pNew = &stand
0740: 69 6e 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  in;.    memset(p
0750: 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  New, 0, sizeof(*
0760: 70 4e 65 77 29 29 3b 0a 20 20 7d 0a 20 20 69 66  pNew));.  }.  if
0770: 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  ( pEList==0 ){. 
0780: 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69     pEList = sqli
0790: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
07a0: 64 28 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72  d(0, sqlite3Expr
07b0: 28 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30 29 2c 20  (TK_ALL,0,0,0), 
07c0: 30 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e  0);.  }.  pNew->
07d0: 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b  pEList = pEList;
07e0: 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20  .  pNew->pSrc = 
07f0: 70 53 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  pSrc;.  pNew->pW
0800: 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
0810: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
0820: 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e  = pGroupBy;.  pN
0830: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48  ew->pHaving = pH
0840: 61 76 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70  aving;.  pNew->p
0850: 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
0860: 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69  By;.  pNew->isDi
0870: 73 74 69 6e 63 74 20 3d 20 69 73 44 69 73 74 69  stinct = isDisti
0880: 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20  nct;.  pNew->op 
0890: 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 61  = TK_SELECT;.  a
08a0: 73 73 65 72 74 28 20 70 4f 66 66 73 65 74 3d 3d  ssert( pOffset==
08b0: 30 20 7c 7c 20 70 4c 69 6d 69 74 21 3d 30 20 29  0 || pLimit!=0 )
08c0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
08d0: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65   = pLimit;.  pNe
08e0: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  w->pOffset = pOf
08f0: 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c  fset;.  pNew->iL
0900: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  imit = -1;.  pNe
0910: 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b  w->iOffset = -1;
0920: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
0930: 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20  nEphm[0] = -1;. 
0940: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
0950: 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70  phm[1] = -1;.  p
0960: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
0970: 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28  m[2] = -1;.  if(
0980: 20 70 4e 65 77 3d 3d 26 73 74 61 6e 64 69 6e 29   pNew==&standin)
0990: 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65   {.    clearSele
09a0: 63 74 28 70 4e 65 77 29 3b 0a 20 20 20 20 70 4e  ct(pNew);.    pN
09b0: 65 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ew = 0;.  }.  re
09c0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
09d0: 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67  .** Delete the g
09e0: 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75  iven Select stru
09f0: 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66  cture and all of
0a00: 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
0a10: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
0a20: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
0a30: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66  Select *p){.  if
0a40: 28 20 70 20 29 7b 0a 20 20 20 20 63 6c 65 61 72  ( p ){.    clear
0a50: 53 65 6c 65 63 74 28 70 29 3b 0a 20 20 20 20 73  Select(p);.    s
0a60: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 20 20  qliteFree(p);.  
0a70: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
0a80: 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69   1 to 3 identifi
0a90: 65 72 73 20 70 72 65 63 65 65 64 69 6e 67 20 74  ers preceeding t
0aa0: 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c  he JOIN keyword,
0ab0: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a   determine the.*
0ac0: 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20  * type of join. 
0ad0: 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
0ae0: 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74  er constant that
0af0: 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20   expresses that 
0b00: 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73  type.** in terms
0b10: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0b20: 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a  g bit values:.**
0b30: 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52  .**     JT_INNER
0b40: 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53  .**     JT_CROSS
0b50: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52  .**     JT_OUTER
0b60: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52  .**     JT_NATUR
0b70: 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46  AL.**     JT_LEF
0b80: 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48  T.**     JT_RIGH
0b90: 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f  T.**.** A full o
0ba0: 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65  uter join is the
0bb0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
0bc0: 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52  JT_LEFT and JT_R
0bd0: 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  IGHT..**.** If a
0be0: 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73  n illegal or uns
0bf0: 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79  upported join ty
0c00: 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e  pe is seen, then
0c10: 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a   still return.**
0c20: 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75   a join type, bu
0c30: 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69  t put an error i
0c40: 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
0c50: 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ucture..*/.int s
0c60: 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50  qlite3JoinType(P
0c70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
0c80: 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a  ken *pA, Token *
0c90: 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a  pB, Token *pC){.
0ca0: 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d    int jointype =
0cb0: 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41   0;.  Token *apA
0cc0: 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a  ll[3];.  Token *
0cd0: 70 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  p;.  static cons
0ce0: 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63  t struct {.    c
0cf0: 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 77 6f  onst char zKeywo
0d00: 72 64 5b 38 5d 3b 0a 20 20 20 20 75 38 20 6e 43  rd[8];.    u8 nC
0d10: 68 61 72 3b 0a 20 20 20 20 75 38 20 63 6f 64 65  har;.    u8 code
0d20: 3b 0a 20 20 7d 20 6b 65 79 77 6f 72 64 73 5b 5d  ;.  } keywords[]
0d30: 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6e 61 74 75   = {.    { "natu
0d40: 72 61 6c 22 2c 20 37 2c 20 4a 54 5f 4e 41 54 55  ral", 7, JT_NATU
0d50: 52 41 4c 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 65  RAL },.    { "le
0d60: 66 74 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45  ft",    4, JT_LE
0d70: 46 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  FT|JT_OUTER },. 
0d80: 20 20 20 7b 20 22 72 69 67 68 74 22 2c 20 20 20     { "right",   
0d90: 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  5, JT_RIGHT|JT_O
0da0: 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 66  UTER },.    { "f
0db0: 75 6c 6c 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c  ull",    4, JT_L
0dc0: 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f  EFT|JT_RIGHT|JT_
0dd0: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22  OUTER },.    { "
0de0: 6f 75 74 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f  outer",   5, JT_
0df0: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22  OUTER },.    { "
0e00: 69 6e 6e 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f  inner",   5, JT_
0e10: 49 4e 4e 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22  INNER },.    { "
0e20: 63 72 6f 73 73 22 2c 20 20 20 35 2c 20 4a 54 5f  cross",   5, JT_
0e30: 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 7d  INNER|JT_CROSS }
0e40: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20  ,.  };.  int i, 
0e50: 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20  j;.  apAll[0] = 
0e60: 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d  pA;.  apAll[1] =
0e70: 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20   pB;.  apAll[2] 
0e80: 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = pC;.  for(i=0;
0e90: 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d   i<3 && apAll[i]
0ea0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0eb0: 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f  apAll[i];.    fo
0ec0: 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66 28  r(j=0; j<sizeof(
0ed0: 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66  keywords)/sizeof
0ee0: 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20 6a  (keywords[0]); j
0ef0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
0f00: 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d  ->n==keywords[j]
0f10: 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20  .nChar .        
0f20: 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e    && sqlite3StrN
0f30: 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a  ICmp((char*)p->z
0f40: 2c 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 7a 4b  , keywords[j].zK
0f50: 65 79 77 6f 72 64 2c 20 70 2d 3e 6e 29 3d 3d 30  eyword, p->n)==0
0f60: 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e   ){.        join
0f70: 74 79 70 65 20 7c 3d 20 6b 65 79 77 6f 72 64 73  type |= keywords
0f80: 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20  [j].code;.      
0f90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
0fa0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
0fb0: 3e 3d 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64  >=sizeof(keyword
0fc0: 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72  s)/sizeof(keywor
0fd0: 64 73 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  ds[0]) ){.      
0fe0: 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45  jointype |= JT_E
0ff0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
1000: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
1010: 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70  f(.     (jointyp
1020: 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54  e & (JT_INNER|JT
1030: 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e  _OUTER))==(JT_IN
1040: 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c  NER|JT_OUTER) ||
1050: 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20  .     (jointype 
1060: 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20  & JT_ERROR)!=0. 
1070: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
1080: 61 72 20 2a 7a 53 70 31 20 3d 20 22 20 22 3b 0a  ar *zSp1 = " ";.
1090: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10a0: 7a 53 70 32 20 3d 20 22 20 22 3b 0a 20 20 20 20  zSp2 = " ";.    
10b0: 69 66 28 20 70 42 3d 3d 30 20 29 7b 20 7a 53 70  if( pB==0 ){ zSp
10c0: 31 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70  1++; }.    if( p
10d0: 43 3d 3d 30 20 29 7b 20 7a 53 70 32 2b 2b 3b 20  C==0 ){ zSp2++; 
10e0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  }.    sqlite3Err
10f0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1100: 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70  nknown or unsupp
1110: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a  orted join type:
1120: 20 22 0a 20 20 20 20 20 20 20 22 25 54 25 73 25   ".       "%T%s%
1130: 54 25 73 25 54 22 2c 20 70 41 2c 20 7a 53 70 31  T%s%T", pA, zSp1
1140: 2c 20 70 42 2c 20 7a 53 70 32 2c 20 70 43 29 3b  , pB, zSp2, pC);
1150: 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20  .    jointype = 
1160: 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73  JT_INNER;.  }els
1170: 65 20 69 66 28 20 6a 6f 69 6e 74 79 70 65 20 26  e if( jointype &
1180: 20 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20 20 20   JT_RIGHT ){.   
1190: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11a0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
11b0: 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20  "RIGHT and FULL 
11c0: 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20  OUTER JOINs are 
11d0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75  not currently su
11e0: 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a  pported");.    j
11f0: 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e  ointype = JT_INN
1200: 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
1210: 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a   jointype;.}../*
1220: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
1230: 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  ndex of a column
1240: 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65   in a table.  Re
1250: 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63  turn -1 if the c
1260: 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20  olumn.** is not 
1270: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
1280: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
1290: 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65  c int columnInde
12a0: 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  x(Table *pTab, c
12b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29  onst char *zCol)
12c0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
12d0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
12e0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
12f0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1300: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (pTab->aCol[i].z
1310: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
1320: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
1330: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
1340: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c  *.** Set the val
1350: 75 65 20 6f 66 20 61 20 74 6f 6b 65 6e 20 74 6f  ue of a token to
1360: 20 61 20 27 5c 30 30 30 27 2d 74 65 72 6d 69 6e   a '\000'-termin
1370: 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  ated string..*/.
1380: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 54  static void setT
1390: 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 2c 20 63  oken(Token *p, c
13a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
13b0: 20 70 2d 3e 7a 20 3d 20 28 75 38 2a 29 7a 3b 0a   p->z = (u8*)z;.
13c0: 20 20 70 2d 3e 6e 20 3d 20 7a 20 3f 20 73 74 72    p->n = z ? str
13d0: 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 70 2d  len(z) : 0;.  p-
13e0: 3e 64 79 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  >dyn = 0;.}../*.
13f0: 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 65 78 70  ** Create an exp
1400: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72  ression node for
1410: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 77   an identifier w
1420: 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ith the name of 
1430: 7a 4e 61 6d 65 0a 2a 2f 0a 45 78 70 72 20 2a 73  zName.*/.Expr *s
1440: 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45 78  qlite3CreateIdEx
1450: 70 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pr(const char *z
1460: 4e 61 6d 65 29 7b 0a 20 20 54 6f 6b 65 6e 20 64  Name){.  Token d
1470: 75 6d 6d 79 3b 0a 20 20 73 65 74 54 6f 6b 65 6e  ummy;.  setToken
1480: 28 26 64 75 6d 6d 79 2c 20 7a 4e 61 6d 65 29 3b  (&dummy, zName);
1490: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
14a0: 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20  3Expr(TK_ID, 0, 
14b0: 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 7d 0a 0a 0a  0, &dummy);.}...
14c0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d  /*.** Add a term
14d0: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 65 78   to the WHERE ex
14e0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45  pression in *ppE
14f0: 78 70 72 20 74 68 61 74 20 72 65 71 75 69 72 65  xpr that require
1500: 73 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f  s the.** zCol co
1510: 6c 75 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c  lumn to be equal
1520: 20 69 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c   in the two tabl
1530: 65 73 20 70 54 61 62 31 20 61 6e 64 20 70 54 61  es pTab1 and pTa
1540: 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  b2..*/.static vo
1550: 69 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28  id addWhereTerm(
1560: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1570: 43 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  Col,        /* N
1580: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
1590: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62  n */.  const Tab
15a0: 6c 65 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20  le *pTab1,      
15b0: 2f 2a 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a  /* First table *
15c0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
15d0: 7a 41 6c 69 61 73 31 2c 20 20 20 20 20 2f 2a 20  zAlias1,     /* 
15e0: 41 6c 69 61 73 20 66 6f 72 20 66 69 72 73 74 20  Alias for first 
15f0: 74 61 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e  table.  May be N
1600: 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54  ULL */.  const T
1610: 61 62 6c 65 20 2a 70 54 61 62 32 2c 20 20 20 20  able *pTab2,    
1620: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 74 61 62 6c    /* Second tabl
1630: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
1640: 72 20 2a 7a 41 6c 69 61 73 32 2c 20 20 20 20 20  r *zAlias2,     
1650: 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 73 65 63  /* Alias for sec
1660: 6f 6e 64 20 74 61 62 6c 65 2e 20 20 4d 61 79 20  ond table.  May 
1670: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
1680: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
1690: 2c 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75  ,     /* VDBE cu
16a0: 72 73 6f 72 20 66 6f 72 20 74 68 65 20 72 69 67  rsor for the rig
16b0: 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  ht table */.  Ex
16c0: 70 72 20 2a 2a 70 70 45 78 70 72 20 20 20 20 20  pr **ppExpr     
16d0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
16e0: 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
16f0: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
1700: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  on */.){.  Expr 
1710: 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c 20 2a 70  *pE1a, *pE1b, *p
1720: 45 31 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 32  E1c;.  Expr *pE2
1730: 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32 63 3b  a, *pE2b, *pE2c;
1740: 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a 20 20  .  Expr *pE;..  
1750: 70 45 31 61 20 3d 20 73 71 6c 69 74 65 33 43 72  pE1a = sqlite3Cr
1760: 65 61 74 65 49 64 45 78 70 72 28 7a 43 6f 6c 29  eateIdExpr(zCol)
1770: 3b 0a 20 20 70 45 32 61 20 3d 20 73 71 6c 69 74  ;.  pE2a = sqlit
1780: 65 33 43 72 65 61 74 65 49 64 45 78 70 72 28 7a  e3CreateIdExpr(z
1790: 43 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69  Col);.  if( zAli
17a0: 61 73 31 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41  as1==0 ){.    zA
17b0: 6c 69 61 73 31 20 3d 20 70 54 61 62 31 2d 3e 7a  lias1 = pTab1->z
17c0: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 45 31 62  Name;.  }.  pE1b
17d0: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
17e0: 49 64 45 78 70 72 28 7a 41 6c 69 61 73 31 29 3b  IdExpr(zAlias1);
17f0: 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 32 3d 3d  .  if( zAlias2==
1800: 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73 32  0 ){.    zAlias2
1810: 20 3d 20 70 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b   = pTab2->zName;
1820: 0a 20 20 7d 0a 20 20 70 45 32 62 20 3d 20 73 71  .  }.  pE2b = sq
1830: 6c 69 74 65 33 43 72 65 61 74 65 49 64 45 78 70  lite3CreateIdExp
1840: 72 28 7a 41 6c 69 61 73 32 29 3b 0a 20 20 70 45  r(zAlias2);.  pE
1850: 31 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  1c = sqlite3Expr
1860: 4f 72 46 72 65 65 28 54 4b 5f 44 4f 54 2c 20 70  OrFree(TK_DOT, p
1870: 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20  E1b, pE1a, 0);. 
1880: 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65 33 45   pE2c = sqlite3E
1890: 78 70 72 4f 72 46 72 65 65 28 54 4b 5f 44 4f 54  xprOrFree(TK_DOT
18a0: 2c 20 70 45 32 62 2c 20 70 45 32 61 2c 20 30 29  , pE2b, pE2a, 0)
18b0: 3b 0a 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33  ;.  pE = sqlite3
18c0: 45 78 70 72 4f 72 46 72 65 65 28 54 4b 5f 45 51  ExprOrFree(TK_EQ
18d0: 2c 20 70 45 31 63 2c 20 70 45 32 63 2c 20 30 29  , pE1c, pE2c, 0)
18e0: 3b 0a 20 20 69 66 28 20 70 45 20 29 7b 0a 20 20  ;.  if( pE ){.  
18f0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
1900: 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  y(pE, EP_FromJoi
1910: 6e 29 3b 0a 20 20 20 20 70 45 2d 3e 69 52 69 67  n);.    pE->iRig
1920: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 69 52  htJoinTable = iR
1930: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20  ightJoinTable;. 
1940: 20 7d 0a 20 20 70 45 20 3d 20 73 71 6c 69 74 65   }.  pE = sqlite
1950: 33 45 78 70 72 41 6e 64 28 2a 70 70 45 78 70 72  3ExprAnd(*ppExpr
1960: 2c 20 70 45 29 3b 0a 20 20 69 66 28 20 70 45 20  , pE);.  if( pE 
1970: 29 7b 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d  ){.    *ppExpr =
1980: 20 70 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   pE;.  }.}../*.*
1990: 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f  * Set the EP_Fro
19a0: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f  mJoin property o
19b0: 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
19c0: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
19d0: 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20  ion..** And set 
19e0: 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  the Expr.iRightJ
19f0: 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62  oinTable to iTab
1a00: 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65 72  le for every ter
1a10: 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72  m in the.** expr
1a20: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ession..**.** Th
1a30: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
1a40: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f  operty is used o
1a50: 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78  n terms of an ex
1a60: 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c  pression to tell
1a70: 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54  .** the LEFT OUT
1a80: 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69  ER JOIN processi
1a90: 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68  ng logic that th
1aa0: 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20  is term is part 
1ab0: 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72  of the.** join r
1ac0: 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69  estriction speci
1ad0: 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  fied in the ON o
1ae0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61  r USING clause a
1af0: 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a  nd not a part.**
1b00: 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e   of the more gen
1b10: 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  eral WHERE claus
1b20: 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  e.  These terms 
1b30: 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74  are moved over t
1b40: 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63  o the.** WHERE c
1b50: 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69  lause during joi
1b60: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74  n processing but
1b70: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   we need to reme
1b80: 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a  mber that they.*
1b90: 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20  * originated in 
1ba0: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
1bb0: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  clause..**.** Th
1bc0: 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  e Expr.iRightJoi
1bd0: 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65  nTable tells the
1be0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
1bf0: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74 68  ocessing that th
1c00: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
1c10: 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65  depends on table
1c20: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
1c30: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74 61   even if that ta
1c40: 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78  ble is not.** ex
1c50: 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e  plicitly mention
1c60: 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  ed in the expres
1c70: 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f  sion.  That info
1c80: 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65  rmation is neede
1c90: 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c  d.** for cases l
1ca0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1cb0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1cc0: 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
1cd0: 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e   ON t1.a=t2.b AN
1ce0: 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54  D t1.x=5.**.** T
1cf0: 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
1d00: 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20 74  needs to defer t
1d10: 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74  he handling of t
1d20: 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72  he t1.x=5.** ter
1d30: 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  m until after th
1d40: 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65  e t2 loop of the
1d50: 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20   join.  In that 
1d60: 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74  way, a.** NULL t
1d70: 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e  2 row will be in
1d80: 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72 20  serted whenever 
1d90: 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20  t1.x!=5.  If we 
1da0: 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20  do not.** defer 
1db0: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
1dc0: 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20  t1.x=5, it will 
1dd0: 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d  be processed imm
1de0: 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65  ediately.** afte
1df0: 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e  r the t1 loop an
1e00: 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78  d rows with t1.x
1e10: 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  !=5 will never a
1e20: 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20  ppear in.** the 
1e30: 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69 73  output, which is
1e40: 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73   incorrect..*/.s
1e50: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f  tatic void setJo
1e60: 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20  inExpr(Expr *p, 
1e70: 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77  int iTable){.  w
1e80: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45  hile( p ){.    E
1e90: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
1ea0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a  , EP_FromJoin);.
1eb0: 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69      p->iRightJoi
1ec0: 6e 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b  nTable = iTable;
1ed0: 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72  .    setJoinExpr
1ee0: 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  (p->pLeft, iTabl
1ef0: 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  e);.    p = p->p
1f00: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
1f10: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1f20: 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20  e processes the 
1f30: 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  join information
1f40: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
1f50: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61  atement..** ON a
1f60: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
1f70: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
1f80: 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20  nto extra terms 
1f90: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1fa0: 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20  use..** NATURAL 
1fb0: 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74  joins also creat
1fc0: 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c  e extra WHERE cl
1fd0: 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a  ause terms..**.*
1fe0: 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61  * The terms of a
1ff0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65   FROM clause are
2000: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
2010: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74  e Select.pSrc st
2020: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20  ructure..** The 
2030: 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20  left most table 
2040: 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  is the first ent
2050: 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72  ry in Select.pSr
2060: 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  c.  The right-mo
2070: 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74  st.** table is t
2080: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20  he last entry.  
2090: 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  The join operato
20a0: 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65  r is held in the
20b0: 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65   entry to.** the
20c0: 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74   left.  Thus ent
20d0: 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68  ry 0 contains th
20e0: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
20f0: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74  for the join bet
2100: 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ween.** entries 
2110: 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e  0 and 1.  Any ON
2120: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2130: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2140: 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a  h the join are.*
2150: 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20  * also attached 
2160: 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72  to the left entr
2170: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
2180: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
2190: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
21a0: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  rs encountered..
21b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
21c0: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
21d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
21e0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
21f0: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2210: 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  All tables in th
2220: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
2230: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2250: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2260: 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ers */.  struct 
2270: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
2280: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74  eft;     /* Left
2290: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
22a0: 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
22b0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52  SrcList_item *pR
22c0: 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68  ight;    /* Righ
22d0: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
22e0: 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20  ined */..  pSrc 
22f0: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65  = p->pSrc;.  pLe
2300: 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d  ft = &pSrc->a[0]
2310: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c  ;.  pRight = &pL
2320: 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d  eft[1];.  for(i=
2330: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
2340: 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b  1; i++, pRight++
2350: 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20  , pLeft++){.    
2360: 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20  Table *pLeftTab 
2370: 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20  = pLeft->pTab;. 
2380: 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74     Table *pRight
2390: 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54  Tab = pRight->pT
23a0: 61 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 65  ab;..    if( pLe
23b0: 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67  ftTab==0 || pRig
23c0: 68 74 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69  htTab==0 ) conti
23d0: 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65  nue;..    /* Whe
23e0: 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  n the NATURAL ke
23f0: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
2400: 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75  , add WHERE clau
2410: 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20  se terms for.   
2420: 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   ** every column
2430: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61   that the two ta
2440: 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d  bles have in com
2450: 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mon..    */.    
2460: 69 66 28 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e  if( pRight->join
2470: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
2480: 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  L ){.      if( p
2490: 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52  Right->pOn || pR
24a0: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
24b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
24c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
24d0: 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20  "a NATURAL join 
24e0: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20  may not have ". 
24f0: 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e            "an ON
2500: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2510: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  ", 0);.        r
2520: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
2530: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
2540: 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e 43 6f 6c  j<pLeftTab->nCol
2550: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
2560: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c  char *zName = pL
2570: 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  eftTab->aCol[j].
2580: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
2590: 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  f( columnIndex(p
25a0: 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29  RightTab, zName)
25b0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
25c0: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 7a 4e   addWhereTerm(zN
25d0: 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70  ame, pLeftTab, p
25e0: 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20  Left->zAlias, . 
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
2610: 67 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e  ghtTab, pRight->
2620: 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20  zAlias,.        
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 69 43        pRight->iC
2650: 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68 65 72  ursor, &p->pWher
2660: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20  e);.          . 
2670: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2680: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
2690: 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20  isallow both ON 
26a0: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
26b0: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
26c0: 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  in.    */.    if
26d0: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26  ( pRight->pOn &&
26e0: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20   pRight->pUsing 
26f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2700: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2710: 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f   "cannot have bo
2720: 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  th ON and USING 
2730: 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73  ".        "claus
2740: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
2750: 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  oin");.      ret
2760: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 1;.    }..  
2770: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20    /* Add the ON 
2780: 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e  clause to the en
2790: 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  d of the WHERE c
27a0: 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64  lause, connected
27b0: 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e   by.    ** an AN
27c0: 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20  D operator..    
27d0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
27e0: 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20  t->pOn ){.      
27f0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69 67  setJoinExpr(pRig
2800: 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d  ht->pOn, pRight-
2810: 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
2820: 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c   p->pWhere = sql
2830: 69 74 65 33 45 78 70 72 41 6e 64 28 70 2d 3e 70  ite3ExprAnd(p->p
2840: 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70  Where, pRight->p
2850: 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68  On);.      pRigh
2860: 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20  t->pOn = 0;.    
2870: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
2880: 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20   extra terms on 
2890: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
28a0: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
28b0: 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e   named.    ** in
28c0: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
28d0: 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20  e.  Example: If 
28e0: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74  the two tables t
28f0: 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20  o be joined are 
2900: 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20  .    ** A and B 
2910: 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c  and the USING cl
2920: 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c  ause names X, Y,
2930: 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64   and Z, then add
2940: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20   this.    ** to 
2950: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2960: 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44  :    A.X=B.X AND
2970: 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a   A.Y=B.Y AND A.Z
2980: 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f  =B.Z.    ** Repo
2990: 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61  rt an error if a
29a0: 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f  ny column mentio
29b0: 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47  ned in the USING
29c0: 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a   clause is.    *
29d0: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  * not contained 
29e0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74  in both tables t
29f0: 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20  o be joined..   
2a00: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
2a10: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
2a20: 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73      IdList *pLis
2a30: 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69  t = pRight->pUsi
2a40: 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ng;.      for(j=
2a50: 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; j<pList->nId;
2a60: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
2a70: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 69  har *zName = pLi
2a80: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[j].zName;.
2a90: 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75          if( colu
2aa0: 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 54 61 62  mnIndex(pLeftTab
2ab0: 2c 20 7a 4e 61 6d 65 29 3c 30 20 7c 7c 20 63 6f  , zName)<0 || co
2ac0: 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74  lumnIndex(pRight
2ad0: 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 29 7b  Tab, zName)<0 ){
2ae0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2af0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2b00: 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20  e, "cannot join 
2b10: 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20  using column %s 
2b20: 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20  - column ".     
2b30: 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73         "not pres
2b40: 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c  ent in both tabl
2b50: 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  es", zName);.   
2b60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
2b70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b80: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
2b90: 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c  zName, pLeftTab,
2ba0: 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20   pLeft->zAlias, 
2bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
2bd0: 67 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e  ghtTab, pRight->
2be0: 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20  zAlias,.        
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 20 20 20 70 52 69 67 68 74 2d 3e 69 43 75 72      pRight->iCur
2c10: 73 6f 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29  sor, &p->pWhere)
2c20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2c40: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
2c50: 63 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68  code into "v" th
2c60: 61 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65  at will push the
2c70: 20 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74   record on the t
2c80: 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61  op of the.** sta
2c90: 63 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ck into the sort
2ca0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
2cb0: 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65  id pushOntoSorte
2cc0: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
2cd0: 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  se,         /* P
2ce0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
2cf0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
2d00: 64 65 72 42 79 2c 20 20 20 20 2f 2a 20 54 68 65  derBy,    /* The
2d10: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2d20: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
2d30: 65 6c 65 63 74 20 20 20 20 20 20 20 20 2f 2a 20  elect        /* 
2d40: 54 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54  The whole SELECT
2d50: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b   statement */.){
2d60: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
2d70: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71  rse->pVdbe;.  sq
2d80: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
2d90: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
2da0: 72 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74  rderBy);.  sqlit
2db0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2dc0: 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72 64  P_Sequence, pOrd
2dd0: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
2de0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
2df0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
2e00: 6c 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  l, pOrderBy->nEx
2e10: 70 72 20 2b 20 31 2c 20 30 29 3b 0a 20 20 73 71  pr + 1, 0);.  sq
2e20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
2e30: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
2e40: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
2e50: 20 2b 20 32 2c 20 30 29 3b 0a 20 20 73 71 6c 69   + 2, 0);.  sqli
2e60: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2e70: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4f  OP_IdxInsert, pO
2e80: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
2e90: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  , 0);.  if( pSel
2ea0: 65 63 74 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29  ect->iLimit>=0 )
2eb0: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c  {.    int addr1,
2ec0: 20 61 64 64 72 32 3b 0a 20 20 20 20 61 64 64 72   addr2;.    addr
2ed0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
2ee0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d  ddOp(v, OP_IfMem
2ef0: 5a 65 72 6f 2c 20 70 53 65 6c 65 63 74 2d 3e 69  Zero, pSelect->i
2f00: 4c 69 6d 69 74 2b 31 2c 20 30 29 3b 0a 20 20 20  Limit+1, 0);.   
2f10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f20: 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c  p(v, OP_MemIncr,
2f30: 20 2d 31 2c 20 70 53 65 6c 65 63 74 2d 3e 69 4c   -1, pSelect->iL
2f40: 69 6d 69 74 2b 31 29 3b 0a 20 20 20 20 61 64 64  imit+1);.    add
2f50: 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
2f60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
2f70: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
2f80: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2f90: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
2fa0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2fb0: 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72  (v, OP_Last, pOr
2fc0: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
2fd0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
2fe0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2ff0: 44 65 6c 65 74 65 2c 20 70 4f 72 64 65 72 42 79  Delete, pOrderBy
3000: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a  ->iECursor, 0);.
3010: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
3020: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32  umpHere(v, addr2
3030: 29 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 2d 3e  );.    pSelect->
3040: 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 7d  iLimit = -1;.  }
3050: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f  .}../*.** Add co
3060: 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  de to implement 
3070: 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74  the OFFSET.*/.st
3080: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66  atic void codeOf
3090: 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c  fset(.  Vdbe *v,
30a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
30b0: 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
30c0: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c  this VM */.  Sel
30d0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f  ect *p,        /
30e0: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
30f0: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
3100: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  ed */.  int iCon
3110: 74 69 6e 75 65 2c 20 20 20 20 2f 2a 20 4a 75 6d  tinue,    /* Jum
3120: 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
3130: 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72  he current recor
3140: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 70 20  d */.  int nPop 
3150: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3160: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 6f 20 70  er of times to p
3170: 6f 70 20 73 74 61 63 6b 20 77 68 65 6e 20 6a 75  op stack when ju
3180: 6d 70 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66  mping */.){.  if
3190: 28 20 70 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20  ( p->iOffset>=0 
31a0: 26 26 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20  && iContinue!=0 
31b0: 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b  ){.    int addr;
31c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
31d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
31e0: 6e 63 72 2c 20 2d 31 2c 20 70 2d 3e 69 4f 66 66  ncr, -1, p->iOff
31f0: 73 65 74 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  set);.    addr =
3200: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3210: 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 4e 65 67  p(v, OP_IfMemNeg
3220: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 30 29  , p->iOffset, 0)
3230: 3b 0a 20 20 20 20 69 66 28 20 6e 50 6f 70 3e 30  ;.    if( nPop>0
3240: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3250: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3260: 5f 50 6f 70 2c 20 6e 50 6f 70 2c 20 30 29 3b 0a  _Pop, nPop, 0);.
3270: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
3280: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3290: 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69  _Goto, 0, iConti
32a0: 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  nue);.    VdbeCo
32b0: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 6b 69  mment((v, "# ski
32c0: 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73  p OFFSET records
32d0: 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
32e0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
32f0: 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  addr);.  }.}../*
3300: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61  .** Add code tha
3310: 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20  t will check to 
3320: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 6f  make sure the to
3330: 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  p N elements of 
3340: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 61 72 65  the.** stack are
3350: 20 64 69 73 74 69 6e 63 74 2e 20 20 69 54 61 62   distinct.  iTab
3360: 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e   is a sorting in
3370: 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70  dex that holds p
3380: 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65  reviously.** see
3390: 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f  n combinations o
33a0: 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20  f the N values. 
33b0: 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   A new entry is 
33c0: 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20  made in iTab.** 
33d0: 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e  if the current N
33e0: 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e   values are new.
33f0: 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f  .**.** A jump to
3400: 20 61 64 64 72 52 65 70 65 61 74 20 69 73 20 6d   addrRepeat is m
3410: 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b 31 20  ade and the N+1 
3420: 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65  values are poppe
3430: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74  d from the.** st
3440: 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e  ack if the top N
3450: 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f   elements are no
3460: 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73  t distinct..*/.s
3470: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44  tatic void codeD
3480: 69 73 74 69 6e 63 74 28 0a 20 20 56 64 62 65 20  istinct(.  Vdbe 
3490: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *v,           /*
34a0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
34b0: 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20  nto this VM */. 
34c0: 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20   int iTab,      
34d0: 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67      /* A sorting
34e0: 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74   index used to t
34f0: 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74  est for distinct
3500: 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ness */.  int ad
3510: 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20  drRepeat,    /* 
3520: 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20  Jump to here if 
3530: 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  not distinct */.
3540: 20 20 69 6e 74 20 4e 20 20 20 20 20 20 20 20 20    int N         
3550: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 70 20       /* The top 
3560: 4e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  N elements of th
3570: 65 20 73 74 61 63 6b 20 6d 75 73 74 20 62 65 20  e stack must be 
3580: 64 69 73 74 69 6e 63 74 20 2a 2f 0a 29 7b 0a 20  distinct */.){. 
3590: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
35a0: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
35b0: 72 64 2c 20 2d 4e 2c 20 30 29 3b 0a 20 20 73 71  rd, -N, 0);.  sq
35c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
35d0: 2c 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c 20 69  , OP_Distinct, i
35e0: 54 61 62 2c 20 73 71 6c 69 74 65 33 56 64 62 65  Tab, sqlite3Vdbe
35f0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33  CurrentAddr(v)+3
3600: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3610: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
3620: 20 4e 2b 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69   N+1, 0);.  sqli
3630: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3640: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
3650: 52 65 70 65 61 74 29 3b 0a 20 20 56 64 62 65 43  Repeat);.  VdbeC
3660: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 6b  omment((v, "# sk
3670: 69 70 20 69 6e 64 69 73 74 69 6e 63 74 20 72 65  ip indistinct re
3680: 63 6f 72 64 73 22 29 29 3b 0a 20 20 73 71 6c 69  cords"));.  sqli
3690: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
36a0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54  OP_IdxInsert, iT
36b0: 61 62 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ab, 0);.}.../*.*
36c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
36d0: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
36e0: 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65  e for the inside
36f0: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
3700: 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43  op.** of a SELEC
3710: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54  T..**.** If srcT
3720: 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61  ab and nColumn a
3730: 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68  re both zero, th
3740: 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78  en the pEList ex
3750: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  pressions.** are
3760: 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72   evaluated in or
3770: 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64  der to get the d
3780: 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77  ata for this row
3790: 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a  .  If nColumn>0.
37a0: 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73 20  ** then data is 
37b0: 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54  pulled from srcT
37c0: 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73  ab and pEList is
37d0: 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65   used only to ge
37e0: 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70  t the.** datatyp
37f0: 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  es for each colu
3800: 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  mn..*/.static in
3810: 74 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  t selectInnerLoo
3820: 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
3830: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
3840: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
3850: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
3860: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
3870: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* The complete 
3880: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
3890: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
38a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
38b0: 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  st,       /* Lis
38c0: 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e  t of values bein
38d0: 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20  g extracted */. 
38e0: 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20   int srcTab,    
38f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c           /* Pull
3900: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20   data from this 
3910: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  table */.  int n
3920: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
3930: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3940: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73  columns in the s
3950: 6f 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20  ource table */. 
3960: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
3970: 72 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e  rBy,     /* If n
3980: 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65  ot NULL, sort re
3990: 73 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73  sults using this
39a0: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69   key */.  int di
39b0: 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20  stinct,         
39c0: 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b    /* If >=0, mak
39d0: 65 20 73 75 72 65 20 72 65 73 75 6c 74 73 20 61  e sure results a
39e0: 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  re distinct */. 
39f0: 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20   int eDest,     
3a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
3a10: 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68  to dispose of th
3a20: 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
3a30: 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20  nt iParm,       
3a40: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 72 67         /* An arg
3a50: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 64 69 73  ument to the dis
3a60: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
3a70: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
3a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
3a90: 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
3aa0: 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77  ue with next row
3ab0: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
3ac0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
3ad0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
3ae0: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69  eak out of the i
3af0: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63  nner loop */.  c
3b00: 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20  har *aff        
3b10: 20 20 20 20 20 20 20 2f 2a 20 61 66 66 69 6e 69         /* affini
3b20: 74 79 20 73 74 72 69 6e 67 20 69 66 20 65 44 65  ty string if eDe
3b30: 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 20  st is SRT_Union 
3b40: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
3b50: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
3b60: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
3b70: 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20  hasDistinct;    
3b80: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
3b90: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
3ba0: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
3bb0: 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  /..  if( v==0 ) 
3bc0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
3bd0: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
3be0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
3bf0: 77 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75  was a LIMIT clau
3c00: 73 65 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  se on the SELECT
3c10: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
3c20: 20 64 6f 20 74 68 65 20 63 68 65 63 6b 0a 20 20   do the check.  
3c30: 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ** to see if thi
3c40: 73 20 72 6f 77 20 73 68 6f 75 6c 64 20 62 65 20  s row should be 
3c50: 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 68  output..  */.  h
3c60: 61 73 44 69 73 74 69 6e 63 74 20 3d 20 64 69 73  asDistinct = dis
3c70: 74 69 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c 69  tinct>=0 && pELi
3c80: 73 74 2d 3e 6e 45 78 70 72 3e 30 3b 0a 20 20 69  st->nExpr>0;.  i
3c90: 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26  f( pOrderBy==0 &
3ca0: 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29  & !hasDistinct )
3cb0: 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  {.    codeOffset
3cc0: 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65  (v, p, iContinue
3cd0: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
3ce0: 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74  Pull the request
3cf0: 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f  ed columns..  */
3d00: 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30  .  if( nColumn>0
3d10: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
3d20: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
3d30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
3d40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
3d50: 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69  olumn, srcTab, i
3d60: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
3d70: 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20  {.    nColumn = 
3d80: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
3d90: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
3da0: 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
3db0: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
3dc0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53  .  /* If the DIS
3dd0: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61  TINCT keyword wa
3de0: 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65  s present on the
3df0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3e00: 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20  t.  ** and this 
3e10: 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65  row has been see
3e20: 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64  n before, then d
3e30: 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20  o not make this 
3e40: 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66  row.  ** part of
3e50: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
3e60: 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69  /.  if( hasDisti
3e70: 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nct ){.    asser
3e80: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
3e90: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
3ea0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c 75  st->nExpr==nColu
3eb0: 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64 65 44 69  mn );.    codeDi
3ec0: 73 74 69 6e 63 74 28 76 2c 20 64 69 73 74 69 6e  stinct(v, distin
3ed0: 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e  ct, iContinue, n
3ee0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 69 66 28  Column);.    if(
3ef0: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
3f00: 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74        codeOffset
3f10: 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65  (v, p, iContinue
3f20: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
3f30: 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  }.  }..  switch(
3f40: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a   eDest ){.    /*
3f50: 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77   In this mode, w
3f60: 72 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20  rite each query 
3f70: 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65  result to the ke
3f80: 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  y of the tempora
3f90: 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  ry.    ** table 
3fa0: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69  iParm..    */.#i
3fb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3fc0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
3fd0: 54 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55  T.    case SRT_U
3fe0: 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 73 71  nion: {.      sq
3ff0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4000: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
4010: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
4020: 20 20 20 20 69 66 28 20 61 66 66 20 29 7b 0a 20      if( aff ){. 
4030: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4040: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
4050: 2c 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49 43  , aff, P3_STATIC
4060: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
4070: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4080: 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  p(v, OP_IdxInser
4090: 74 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  t, iParm, 0);.  
40a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
40b0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75  ..    /* Constru
40c0: 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d  ct a record from
40d0: 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
40e0: 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f  t, but instead o
40f0: 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20  f.    ** saving 
4100: 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65  that record, use
4110: 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20   it as a key to 
4120: 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20  delete elements 
4130: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
4140: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
4150: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  iParm..    */.  
4160: 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70    case SRT_Excep
4170: 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  t: {.      int a
4180: 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ddr;.      addr 
4190: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
41a0: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
41b0: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  ord, nColumn, 0)
41c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
41d0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
41e0: 31 2c 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49  1, aff, P3_STATI
41f0: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
4200: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4210: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d  _NotFound, iParm
4220: 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20  , addr+3);.     
4230: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4240: 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  p(v, OP_Delete, 
4250: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
4260: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
4270: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f  ndif..    /* Sto
4280: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
4290: 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
42a0: 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
42b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
42c0: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
42d0: 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
42e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
42f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
4300: 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  ecord, nColumn, 
4310: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  0);.      if( pO
4320: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
4330: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
4340: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
4350: 79 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c  y, p);.      }el
4360: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
4370: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4380: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
4390: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rm, 0);.        
43a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
43b0: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
43c0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
43d0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
43e0: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
43f0: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
4400: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4410: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
4420: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4430: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
4440: 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
4450: 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
4460: 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
4470: 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
4480: 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
4490: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
44a0: 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
44b0: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
44c0: 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
44d0: 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
44e0: 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
44f0: 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
4500: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
4510: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
4520: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
4530: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
4540: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 32 3b        int addr2;
4550: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
4560: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
4570: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4580: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  ddOp(v, OP_NotNu
4590: 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 31 2b 33 29  ll, -1, addr1+3)
45a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
45b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
45c0: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
45d0: 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
45e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
45f0: 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Goto, 0, 0);.   
4600: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
4610: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
4620: 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f   first glance yo
4630: 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65  u would think we
4640: 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20   could optimize 
4650: 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20  out the.        
4660: 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74  ** ORDER BY in t
4670: 68 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74  his case since t
4680: 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72  he order of entr
4690: 69 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20  ies in the set. 
46a0: 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e         ** does n
46b0: 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20  ot matter.  But 
46c0: 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61  there might be a
46d0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69   LIMIT clause, i
46e0: 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  n which.        
46f0: 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65  ** case the orde
4700: 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f  r does matter */
4710: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
4720: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
4730: 70 4f 72 64 65 72 42 79 2c 20 70 29 3b 0a 20 20  pOrderBy, p);.  
4740: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4750: 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79     char affinity
4760: 20 3d 20 28 69 50 61 72 6d 3e 3e 31 36 29 26 30   = (iParm>>16)&0
4770: 78 46 46 3b 0a 20 20 20 20 20 20 20 20 61 66 66  xFF;.        aff
4780: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 43  inity = sqlite3C
4790: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
47a0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
47b0: 72 2c 20 61 66 66 69 6e 69 74 79 29 3b 0a 20 20  r, affinity);.  
47c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
47d0: 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  eOp3(v, OP_MakeR
47e0: 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66  ecord, 1, 0, &af
47f0: 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20  finity, 1);.    
4800: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4810: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e  ddOp(v, OP_IdxIn
4820: 73 65 72 74 2c 20 28 69 50 61 72 6d 26 30 78 30  sert, (iParm&0x0
4830: 30 30 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20  000FFFF), 0);.  
4840: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
4850: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
4860: 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 20  v, addr2);.     
4870: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
4880: 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77     /* If any row
4890: 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65   exist in the re
48a0: 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64  sult set, record
48b0: 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61   that fact and a
48c0: 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  bort..    */.   
48d0: 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73   case SRT_Exists
48e0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
48f0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4900: 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 69 50 61 72  _MemInt, 1, iPar
4910: 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
4920: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4930: 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  _Pop, nColumn, 0
4940: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
4950: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
4960: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
4970: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
4980: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4990: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
49a0: 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
49b0: 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
49c0: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
49d0: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
49e0: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
49f0: 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
4a00: 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
4a10: 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20   and break out. 
4a20: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61     ** of the sca
4a30: 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
4a40: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
4a50: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
4a60: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
4a70: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
4a80: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
4a90: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
4aa0: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 29  se, pOrderBy, p)
4ab0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4ac0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4ad0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
4ae0: 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31  mStore, iParm, 1
4af0: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  );.        /* Th
4b00: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
4b10: 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20  ill jump out of 
4b20: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
4b30: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
4b40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
4b50: 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
4b60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
4b70: 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
4b80: 53 65 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f  Send the data to
4b90: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75   the callback fu
4ba0: 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73  nction or to a s
4bb0: 75 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74  ubroutine.  In t
4bc0: 68 65 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 6f  he.    ** case o
4bd0: 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2c 20  f a subroutine, 
4be0: 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69  the subroutine i
4bf0: 74 73 65 6c 66 20 69 73 20 72 65 73 70 6f 6e 73  tself is respons
4c00: 69 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20  ible for.    ** 
4c10: 70 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  popping the data
4c20: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e   from the stack.
4c30: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
4c40: 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a   SRT_Subroutine:
4c50: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 61  .    case SRT_Ca
4c60: 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20  llback: {.      
4c70: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
4c80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4c90: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
4ca0: 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75  akeRecord, nColu
4cb0: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  mn, 0);.        
4cc0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
4cd0: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
4ce0: 20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   p);.      }else
4cf0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
4d00: 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  Subroutine ){.  
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 47 6f 73  eAddOp(v, OP_Gos
4d30: 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20  ub, 0, iParm);. 
4d40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4d50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4d60: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62  ddOp(v, OP_Callb
4d70: 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  ack, nColumn, 0)
4d80: 3b 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 0a 23 69  break;.    }..#i
4da0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
4db0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a  E_OMIT_TRIGGER).
4dc0: 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
4dd0: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69  he results.  Thi
4de0: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  s is used for SE
4df0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
4e00: 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68  inside.    ** th
4e10: 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47  e body of a TRIG
4e20: 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73  GER.  The purpos
4e30: 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74  e of such select
4e40: 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20  s is to call.   
4e50: 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64   ** user-defined
4e60: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
4e70: 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74  have side effect
4e80: 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61  s.  We do not ca
4e90: 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20  re.    ** about 
4ea0: 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c  the actual resul
4eb0: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
4ec0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
4ed0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
4ee0: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
4ef0: 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20  _Discard );.    
4f00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4f10: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43  Op(v, OP_Pop, nC
4f20: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
4f30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
4f40: 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  ndif.  }..  /* J
4f50: 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
4f60: 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68  f the loop if th
4f70: 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
4f80: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
4f90: 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 26 26 20 70  ->iLimit>=0 && p
4fa0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
4fb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4fc0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72  Op(v, OP_MemIncr
4fd0: 2c 20 2d 31 2c 20 70 2d 3e 69 4c 69 6d 69 74 29  , -1, p->iLimit)
4fe0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4ff0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d  eAddOp(v, OP_IfM
5000: 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  emZero, p->iLimi
5010: 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a  t, iBreak);.  }.
5020: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
5030: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78  *.** Given an ex
5040: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67  pression list, g
5050: 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66  enerate a KeyInf
5060: 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
5070: 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20   records.** the 
5080: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
5090: 63 65 20 66 6f 72 20 65 61 63 68 20 65 78 70 72  ce for each expr
50a0: 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65  ession in that e
50b0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
50c0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70  **.** If the Exp
50d0: 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45  rList is an ORDE
50e0: 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
50f0: 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65   clause then the
5100: 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65   resulting.** Ke
5110: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
5120: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
5130: 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  or initializing 
5140: 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20  a virtual index 
5150: 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  to.** implement 
5160: 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66  that clause.  If
5170: 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73   the ExprList is
5180: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
5190: 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74  of a SELECT.** t
51a0: 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  hen the KeyInfo 
51b0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70  structure is app
51c0: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69  ropriate for ini
51d0: 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74  tializing a virt
51e0: 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20  ual.** index to 
51f0: 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54  implement a DIST
5200: 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a  INCT test..**.**
5210: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
5220: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
5230: 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 20 66  ture is obtain f
5240: 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65  rom malloc.  The
5250: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
5260: 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69  tion is responsi
5270: 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74  ble for seeing t
5280: 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75  hat this structu
5290: 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  re is eventually
52a0: 0a 2a 2a 20 66 72 65 65 64 2e 20 20 41 64 64 20  .** freed.  Add 
52b0: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
52c0: 63 74 75 72 65 20 74 6f 20 74 68 65 20 50 33 20  cture to the P3 
52d0: 66 69 65 6c 64 20 6f 66 20 61 6e 20 6f 70 63 6f  field of an opco
52e0: 64 65 20 75 73 69 6e 67 0a 2a 2a 20 50 33 5f 4b  de using.** P3_K
52f0: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69  EYINFO_HANDOFF i
5300: 73 20 74 68 65 20 75 73 75 61 6c 20 77 61 79 20  s the usual way 
5310: 6f 66 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  of dealing with 
5320: 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  this..*/.static 
5330: 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f  KeyInfo *keyInfo
5340: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 50 61 72  FromExprList(Par
5350: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
5360: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
5370: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
5380: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
5390: 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f  nExpr;.  KeyInfo
53a0: 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   *pInfo;.  struc
53b0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
53c0: 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  *pItem;.  int i;
53d0: 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73  ..  nExpr = pLis
53e0: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66  t->nExpr;.  pInf
53f0: 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  o = sqliteMalloc
5400: 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29  ( sizeof(*pInfo)
5410: 20 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66   + nExpr*(sizeof
5420: 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b  (CollSeq*)+1) );
5430: 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a  .  if( pInfo ){.
5440: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74      pInfo->aSort
5450: 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49  Order = (u8*)&pI
5460: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72  nfo->aColl[nExpr
5470: 5d 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46  ];.    pInfo->nF
5480: 69 65 6c 64 20 3d 20 6e 45 78 70 72 3b 0a 20 20  ield = nExpr;.  
5490: 20 20 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45    pInfo->enc = E
54a0: 4e 43 28 64 62 29 3b 0a 20 20 20 20 66 6f 72 28  NC(db);.    for(
54b0: 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  i=0, pItem=pList
54c0: 2d 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  ->a; i<nExpr; i+
54d0: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
54e0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
54f0: 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  l;.      pColl =
5500: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
5510: 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
5520: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
5530: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
5540: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64         pColl = d
5550: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
5560: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66      }.      pInf
5570: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43  o->aColl[i] = pC
5580: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f  oll;.      pInfo
5590: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
55a0: 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  = pItem->sortOrd
55b0: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  er;.    }.  }.  
55c0: 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a  return pInfo;.}.
55d0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ../*.** If the i
55e0: 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65  nner loop was ge
55f0: 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20  nerated using a 
5600: 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42  non-null pOrderB
5610: 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74  y argument,.** t
5620: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
5630: 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61  were placed in a
5640: 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20   sorter.  After 
5650: 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d  the loop is term
5660: 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65  inated.** we nee
5670: 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72  d to run the sor
5680: 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74  ter and output t
5690: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65  he results.  The
56a0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f   following.** ro
56b0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
56c0: 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20  the code needed 
56d0: 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73  to do that..*/.s
56e0: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
56f0: 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50  ateSortTail(.  P
5700: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5710: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
5720: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
5730: 70 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p,       /* The 
5740: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
5750: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20   */.  Vdbe *v,  
5760: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
5770: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
5780: 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  s VDBE */.  int 
5790: 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20  nColumn,     /* 
57a0: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
57b0: 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 69  s of data */.  i
57c0: 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20  nt eDest,       
57d0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72  /* Write the sor
57e0: 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65  ted results here
57f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20   */.  int iParm 
5800: 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e         /* Option
5810: 61 6c 20 70 61 72 61 6d 65 74 65 72 20 61 73 73  al parameter ass
5820: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 44 65  ociated with eDe
5830: 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62  st */.){.  int b
5840: 72 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rk = sqlite3Vdbe
5850: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
5860: 69 6e 74 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74  int cont = sqlit
5870: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
5880: 76 29 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  v);.  int addr;.
5890: 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e    int iTab;.  in
58a0: 74 20 70 73 65 75 64 6f 54 61 62 3b 0a 20 20 45  t pseudoTab;.  E
58b0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
58c0: 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
58d0: 0a 0a 20 20 69 54 61 62 20 3d 20 70 4f 72 64 65  ..  iTab = pOrde
58e0: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20  rBy->iECursor;. 
58f0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
5900: 43 61 6c 6c 62 61 63 6b 20 7c 7c 20 65 44 65 73  Callback || eDes
5910: 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74 69 6e  t==SRT_Subroutin
5920: 65 20 29 7b 0a 20 20 20 20 70 73 65 75 64 6f 54  e ){.    pseudoT
5930: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
5940: 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  b++;.    sqlite3
5950: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5960: 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 73 65 75  OpenPseudo, pseu
5970: 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73  doTab, 0);.    s
5980: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5990: 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75  v, OP_SetNumColu
59a0: 6d 6e 73 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  mns, pseudoTab, 
59b0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 7d 0a 20 20  nColumn);.  }.  
59c0: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
59d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
59e0: 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 62 72  P_Sort, iTab, br
59f0: 6b 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74  k);.  codeOffset
5a00: 28 76 2c 20 70 2c 20 63 6f 6e 74 2c 20 30 29 3b  (v, p, cont, 0);
5a10: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
5a20: 54 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c 20 65 44  T_Callback || eD
5a30: 65 73 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74  est==SRT_Subrout
5a40: 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ine ){.    sqlit
5a50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5a60: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29  P_Integer, 1, 0)
5a70: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
5a80: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
5a90: 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72  olumn, iTab, pOr
5aa0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31  derBy->nExpr + 1
5ab0: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  );.  switch( eDe
5ac0: 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  st ){.    case S
5ad0: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
5ae0: 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
5af0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
5b00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5b10: 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c  NewRowid, iParm,
5b20: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
5b30: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5b40: 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20  P_Pull, 1, 0);. 
5b50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5b60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 73 65  AddOp(v, OP_Inse
5b70: 72 74 2c 20 69 50 61 72 6d 2c 20 4f 50 46 4c 41  rt, iParm, OPFLA
5b80: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
5b90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
5ba0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5bb0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
5bc0: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
5bd0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
5be0: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
5bf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5c00: 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  p(v, OP_NotNull,
5c10: 20 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62 65   -1, sqlite3Vdbe
5c20: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33  CurrentAddr(v)+3
5c30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5c40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5c50: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
5c60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5c70: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
5c80: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
5c90: 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a  rentAddr(v)+3);.
5ca0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5cb0: 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  eOp3(v, OP_MakeR
5cc0: 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 22 63 22  ecord, 1, 0, "c"
5cd0: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
5ce0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5cf0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e  ddOp(v, OP_IdxIn
5d00: 73 65 72 74 2c 20 28 69 50 61 72 6d 26 30 78 30  sert, (iParm&0x0
5d10: 30 30 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20  000FFFF), 0);.  
5d20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5d30: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
5d40: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
5d50: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
5d60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5d70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
5d80: 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31  mStore, iParm, 1
5d90: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
5da0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
5db0: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
5dc0: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
5dd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5de0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
5df0: 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a  e SRT_Callback:.
5e00: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 75 62      case SRT_Sub
5e10: 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20  routine: {.     
5e20: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71   int i;.      sq
5e30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5e40: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 73 65  , OP_Insert, pse
5e50: 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  udoTab, 0);.    
5e60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
5e70: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
5e80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5e90: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
5ea0: 6e 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 69 29  n, pseudoTab, i)
5eb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5ec0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
5ed0: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
5ee0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5ef0: 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61  dOp(v, OP_Callba
5f00: 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  ck, nColumn, 0);
5f10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5f20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5f30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73  eAddOp(v, OP_Gos
5f40: 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20  ub, 0, iParm);. 
5f50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
5f60: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
5f70: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
5f80: 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
5f90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5fa0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d   }.  }..  /* Jum
5fb0: 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
5fc0: 74 68 65 20 6c 6f 6f 70 20 77 68 65 6e 20 74 68  the loop when th
5fd0: 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
5fe0: 65 64 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ed.  */.  if( p-
5ff0: 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20  >iLimit>=0 ){.  
6000: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6010: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72  Op(v, OP_MemIncr
6020: 2c 20 2d 31 2c 20 70 2d 3e 69 4c 69 6d 69 74 29  , -1, p->iLimit)
6030: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6040: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d  eAddOp(v, OP_IfM
6050: 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  emZero, p->iLimi
6060: 74 2c 20 62 72 6b 29 3b 0a 20 20 7d 0a 0a 20 20  t, brk);.  }..  
6070: 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66  /* The bottom of
6080: 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20   the loop.  */. 
6090: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
60a0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74  lveLabel(v, cont
60b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
60c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74  AddOp(v, OP_Next
60d0: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20  , iTab, addr);. 
60e0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
60f0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29  lveLabel(v, brk)
6100: 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  ;.  if( eDest==S
6110: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c 20 65  RT_Callback || e
6120: 44 65 73 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75  Dest==SRT_Subrou
6130: 74 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  tine ){.    sqli
6140: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6150: 4f 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f  OP_Close, pseudo
6160: 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 7d 0a  Tab, 0);.  }..}.
6170: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
6180: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
6190: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
61a0: 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20  he 'declaration 
61b0: 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20  type' of the.** 
61c0: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
61d0: 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79  . The string may
61e0: 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73   be treated as s
61f0: 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c  tatic by the cal
6200: 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ler..**.** The d
6210: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
6220: 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74  is the exact dat
6230: 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e  atype definition
6240: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
6250: 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
6260: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
6270: 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78  tement if the ex
6280: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
6290: 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63  lumn. The.** dec
62a0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
62b0: 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20  r a ROWID field 
62c0: 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63  is INTEGER. Exac
62d0: 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72  tly when an expr
62e0: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e  ession.** is con
62f0: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
6300: 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20   can be complex 
6310: 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  in the presence 
6320: 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54  of subqueries. T
6330: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74  he.** result-set
6340: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
6350: 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
6360: 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65  ing SELECT state
6370: 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e  ments is .** con
6380: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
6390: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
63a0: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  n..**.**   SELEC
63b0: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
63c0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
63d0: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
63e0: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53  ;.**   SELECT (S
63f0: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
6400: 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  bl);.**   SELECT
6410: 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43   abc FROM (SELEC
6420: 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f  T col AS abc FRO
6430: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54  M tbl);.** .** T
6440: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
6450: 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72  ype for any expr
6460: 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  ession other tha
6470: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55  n a column is NU
6480: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  LL..*/.static co
6490: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e  nst char *column
64a0: 54 79 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74  Type(.  NameCont
64b0: 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70  ext *pNC, .  Exp
64c0: 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73  r *pExpr,.  cons
64d0: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69  t char **pzOrigi
64e0: 6e 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  nDb,.  const cha
64f0: 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c  r **pzOriginTab,
6500: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
6510: 70 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20  pzOriginCol.){. 
6520: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79   char const *zTy
6530: 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  pe = 0;.  char c
6540: 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20  onst *zOriginDb 
6550: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
6560: 74 20 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20  t *zOriginTab = 
6570: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
6580: 2a 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b  *zOriginCol = 0;
6590: 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20  .  int j;.  if( 
65a0: 70 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 43 2d  pExpr==0 || pNC-
65b0: 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72  >pSrcList==0 ) r
65c0: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54  eturn 0;..  /* T
65d0: 68 65 20 54 4b 5f 41 53 20 6f 70 65 72 61 74 6f  he TK_AS operato
65e0: 72 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72  r can only occur
65f0: 20 69 6e 20 4f 52 44 45 52 20 42 59 2c 20 47 52   in ORDER BY, GR
6600: 4f 55 50 20 42 59 2c 20 48 41 56 49 4e 47 2c 0a  OUP BY, HAVING,.
6610: 20 20 2a 2a 20 61 6e 64 20 4c 49 4d 49 54 20 63    ** and LIMIT c
6620: 6c 61 75 73 65 73 2e 20 20 42 75 74 20 70 45 78  lauses.  But pEx
6630: 70 72 20 6f 72 69 67 69 6e 61 74 65 73 20 69 6e  pr originates in
6640: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
6650: 6f 66 20 61 0a 20 20 2a 2a 20 53 45 4c 45 43 54  of a.  ** SELECT
6660: 2e 20 20 53 6f 20 70 45 78 70 72 20 63 61 6e 20  .  So pExpr can 
6670: 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e 20 61 6e  never contain an
6680: 20 41 53 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   AS operator..  
6690: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  */.  assert( pEx
66a0: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 53 20 29 3b  pr->op!=TK_AS );
66b0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
66c0: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
66d0: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
66e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
66f0: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UMN: {.      /* 
6700: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
6710: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61  s a column. Loca
6720: 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65  te the table the
6730: 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67   column is being
6740: 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63  .      ** extrac
6750: 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65  ted from in Name
6760: 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74  Context.pSrcList
6770: 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79  . This table may
6780: 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a   be real.      *
6790: 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  * database table
67a0: 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
67b0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
67c0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
67d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
67e0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  ble structure co
67f0: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
6800: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
6810: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20  Select *pS = 0; 
6820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
6830: 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e  elect the column
6840: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
6850: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  om */.      int 
6860: 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43  iCol = pExpr->iC
6870: 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78  olumn;  /* Index
6880: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54   of column in pT
6890: 61 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  ab */.      whil
68a0: 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20  e( pNC && !pTab 
68b0: 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69  ){.        SrcLi
68c0: 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
68d0: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
68e0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c        for(j=0;j<
68f0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26  pTabList->nSrc &
6900: 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  & pTabList->a[j]
6910: 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d  .iCursor!=pExpr-
6920: 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20  >iTable;j++);.  
6930: 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62        if( j<pTab
6940: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20  List->nSrc ){.  
6950: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70          pTab = p
6960: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
6970: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ab;.          pS
6980: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
6990: 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ].pSelect;.     
69a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
69b0: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
69c0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
69d0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
69e0: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
69f0: 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a        /* FIX ME:
6a00: 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
6a10: 20 63 61 6e 20 6f 63 63 75 72 73 20 69 66 20 79   can occurs if y
6a20: 6f 75 20 68 61 76 65 20 73 6f 6d 65 74 68 69 6e  ou have somethin
6a30: 67 20 6c 69 6b 65 20 22 53 45 4c 45 43 54 20 6e  g like "SELECT n
6a40: 65 77 2e 78 3b 22 20 69 6e 73 69 64 65 0a 20 20  ew.x;" inside.  
6a50: 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67        ** a trigg
6a60: 65 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  er.  In other wo
6a70: 72 64 73 2c 20 69 66 20 79 6f 75 20 72 65 66 65  rds, if you refe
6a80: 72 65 6e 63 65 20 74 68 65 20 73 70 65 63 69 61  rence the specia
6a90: 6c 20 22 6e 65 77 22 0a 20 20 20 20 20 20 20 20  l "new".        
6aa0: 2a 2a 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ** table in the 
6ab0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
6ac0: 73 65 6c 65 63 74 2e 20 20 57 65 20 64 6f 20 6e  select.  We do n
6ad0: 6f 74 20 68 61 76 65 20 61 20 67 6f 6f 64 20 77  ot have a good w
6ae0: 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ay.        ** to
6af0: 20 66 69 6e 64 20 74 68 65 20 61 63 74 75 61 6c   find the actual
6b00: 20 74 61 62 6c 65 20 74 79 70 65 2c 20 73 6f 20   table type, so 
6b10: 63 61 6c 6c 20 69 74 20 22 54 45 58 54 22 2e 20  call it "TEXT". 
6b20: 20 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79 0a   This is really.
6b30: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74          ** somet
6b40: 68 69 6e 67 20 6f 66 20 61 20 62 75 67 2c 20 62  hing of a bug, b
6b50: 75 74 20 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  ut I do not know
6b60: 20 68 6f 77 20 74 6f 20 66 69 78 20 69 74 2e 0a   how to fix it..
6b70: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
6b80: 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
6b90: 64 6f 65 73 20 6e 6f 74 20 70 72 6f 64 75 63 65  does not produce
6ba0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   the correct ans
6bb0: 77 65 72 20 2d 20 69 74 20 6a 75 73 74 20 70 72  wer - it just pr
6bc0: 65 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a  events.        *
6bd0: 2a 20 61 20 73 65 67 66 61 75 6c 74 2e 20 20 53  * a segfault.  S
6be0: 65 65 20 74 69 63 6b 65 74 20 23 31 32 32 39 2e  ee ticket #1229.
6bf0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
6c00: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58      zType = "TEX
6c10: 54 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  T";.        brea
6c20: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
6c30: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20 29    assert( pTab )
6c40: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29  ;.      if( pS )
6c50: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
6c60: 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75   "table" is actu
6c70: 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63  ally a sub-selec
6c80: 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74  t or a view in t
6c90: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
6ca0: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
6cb0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6cc0: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  t. Return the de
6cd0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61  claration type a
6ce0: 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20  nd origin.      
6cf0: 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68    ** data for th
6d00: 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c  e result-set col
6d10: 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73  umn of the sub-s
6d20: 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a  elect..        *
6d30: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  /.        if( iC
6d40: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53  ol>=0 && iCol<pS
6d50: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
6d60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
6d70: 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20  If iCol is less 
6d80: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
6d90: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
6da0: 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20  equests the.    
6db0: 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f        ** rowid o
6dc0: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
6dd0: 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65   or view. This e
6de0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67  xpression is leg
6df0: 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20  al (see .       
6e00: 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20     ** test case 
6e10: 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20  misc2.2.2) - it 
6e20: 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73  always evaluates
6e30: 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20   to NULL..      
6e40: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
6e50: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
6e60: 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  ;.          Expr
6e70: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
6e80: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b  ->a[iCol].pExpr;
6e90: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
6ea0: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
6eb0: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  rc;.          sN
6ec0: 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  C.pNext = 0;.   
6ed0: 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73         sNC.pPars
6ee0: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
6ef0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
6f00: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
6f10: 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44  NC, p, &zOriginD
6f20: 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20  b, &zOriginTab, 
6f30: 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20  &zOriginCol); . 
6f40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6f50: 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 70  else if( pTab->p
6f60: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
6f70: 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c    /* A real tabl
6f80: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
6f90: 65 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20 20  ert( !pS );.    
6fa0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
6fb0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
6fc0: 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Key;.        ass
6fd0: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
6fe0: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
6ff0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
7000: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
7010: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<0 ){.         
7020: 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45   zType = "INTEGE
7030: 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  R";.          zO
7040: 72 69 67 69 6e 43 6f 6c 20 3d 20 22 72 6f 77 69  riginCol = "rowi
7050: 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d";.        }els
7060: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e{.          zTy
7070: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
7080: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20  iCol].zType;.   
7090: 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f         zOriginCo
70a0: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
70b0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
70c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f      }.        zO
70d0: 72 69 67 69 6e 54 61 62 20 3d 20 70 54 61 62 2d  riginTab = pTab-
70e0: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
70f0: 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20  if( pNC->pParse 
7100: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
7110: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
7120: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d  hemaToIndex(pNC-
7130: 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  >pParse->db, pTa
7140: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
7150: 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 44 62         zOriginDb
7160: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e   = pNC->pParse->
7170: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
7180: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  me;.        }.  
7190: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
71a0: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
71b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
71c0: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
71d0: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
71e0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
71f0: 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c  ion is a sub-sel
7200: 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ect. Return the 
7210: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
7220: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72   and.      ** or
7230: 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68  igin info for th
7240: 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  e single column 
7250: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
7260: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  t of the SELECT.
7270: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
7280: 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
7290: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
72a0: 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  NC;.      Select
72b0: 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 70 53   *pS = pExpr->pS
72c0: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70  elect;.      Exp
72d0: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
72e0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
72f0: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
7300: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
7310: 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20      sNC.pNext = 
7320: 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  pNC;.      sNC.p
7330: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
7340: 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  rse;.      zType
7350: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
7360: 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44  NC, p, &zOriginD
7370: 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20  b, &zOriginTab, 
7380: 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20  &zOriginCol); . 
7390: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
73a0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a  }.#endif.  }.  .
73b0: 20 20 69 66 28 20 70 7a 4f 72 69 67 69 6e 44 62    if( pzOriginDb
73c0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
73d0: 70 7a 4f 72 69 67 69 6e 54 61 62 20 26 26 20 70  pzOriginTab && p
73e0: 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b 0a 20 20  zOriginCol );.  
73f0: 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62 20 3d 20    *pzOriginDb = 
7400: 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20 20 20 2a  zOriginDb;.    *
7410: 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 7a 4f  pzOriginTab = zO
7420: 72 69 67 69 6e 54 61 62 3b 0a 20 20 20 20 2a 70  riginTab;.    *p
7430: 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72  zOriginCol = zOr
7440: 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72  iginCol;.  }.  r
7450: 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
7460: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
7470: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
7480: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
7490: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
74a0: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
74b0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
74c0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
74d0: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
74e0: 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Types(.  Parse *
74f0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
7500: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
7510: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
7520: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
7530: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
7540: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
7550: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
7560: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
7570: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
7580: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
7590: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
75a0: 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
75b0: 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72  t sNC;.  sNC.pSr
75c0: 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
75d0: 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
75e0: 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69   pParse;.  for(i
75f0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
7600: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
7610: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
7620: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
7630: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
7640: 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  igDb = 0;.    co
7650: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54  nst char *zOrigT
7660: 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ab = 0;.    cons
7670: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c  t char *zOrigCol
7680: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
7690: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 63 6f  char *zType = co
76a0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
76b0: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
76c0: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
76d0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76  );..    /* The v
76e0: 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74  dbe must make it
76f0: 27 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74  's own copy of t
7700: 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61  he column-type a
7710: 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a  nd other .    **
7720: 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63   column specific
7730: 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73   strings, in cas
7740: 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  e the schema is 
7750: 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69  reset before thi
7760: 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c  s.    ** virtual
7770: 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65   machine is dele
7780: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
7790: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
77a0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
77b0: 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54  AME_DECLTYPE, zT
77c0: 79 70 65 2c 20 50 33 5f 54 52 41 4e 53 49 45 4e  ype, P3_TRANSIEN
77d0: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
77e0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
77f0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41   i, COLNAME_DATA
7800: 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 50  BASE, zOrigDb, P
7810: 33 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  3_TRANSIENT);.  
7820: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
7830: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
7840: 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72  LNAME_TABLE, zOr
7850: 69 67 54 61 62 2c 20 50 33 5f 54 52 41 4e 53 49  igTab, P3_TRANSI
7860: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
7870: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
7880: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f  v, i, COLNAME_CO
7890: 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20  LUMN, zOrigCol, 
78a0: 50 33 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  P3_TRANSIENT);. 
78b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
78c0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
78d0: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
78e0: 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63  E the names of c
78f0: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
7900: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68   result set.  Th
7910: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
7920: 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64  s used to provid
7930: 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d  e the.** azCol[]
7940: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63   values in the c
7950: 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  allback..*/.stat
7960: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
7970: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50  ColumnNames(.  P
7980: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7990: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
79a0: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
79b0: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
79c0: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
79d0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
79e0: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
79f0: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
7a00: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
7a10: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
7a20: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
7a30: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73  .  int i, j;.  s
7a40: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
7a50: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66  rse->db;.  int f
7a60: 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e  ullNames, shortN
7a70: 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ames;..#ifndef S
7a80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
7a90: 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  IN.  /* If this 
7aa0: 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73  is an EXPLAIN, s
7ab0: 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f  kip this step */
7ac0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
7ad0: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65  xplain ){.    re
7ae0: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
7af0: 0a 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ..  assert( v!=0
7b00: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
7b10: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c  ->colNamesSet ||
7b20: 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33   v==0 || sqlite3
7b30: 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
7b40: 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73   return;.  pPars
7b50: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
7b60: 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20   1;.  fullNames 
7b70: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
7b80: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
7b90: 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e  es)!=0;.  shortN
7ba0: 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ames = (db->flag
7bb0: 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
7bc0: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
7bd0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
7be0: 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d  mCols(v, pEList-
7bf0: 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69  >nExpr);.  for(i
7c00: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
7c10: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
7c20: 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20  xpr *p;.    p = 
7c30: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
7c40: 70 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  pr;.    if( p==0
7c50: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7c60: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
7c70: 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
7c80: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
7c90: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
7ca0: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
7cb0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
7cc0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
7cd0: 45 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  E, zName, strlen
7ce0: 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  (zName));.      
7cf0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
7d00: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
7d10: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62  K_COLUMN && pTab
7d20: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61  List ){.      Ta
7d30: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
7d40: 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
7d50: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
7d60: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
7d70: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c  for(j=0; j<pTabL
7d80: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
7d90: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
7da0: 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20  sor!=p->iTable; 
7db0: 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73  j++){}.      ass
7dc0: 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d  ert( j<pTabList-
7dd0: 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70  >nSrc );.      p
7de0: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
7df0: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
7e00: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
7e10: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
7e20: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
7e30: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
7e40: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
7e50: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
7e60: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
7e70: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22          zCol = "
7e80: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65  rowid";.      }e
7e90: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  lse{.        zCo
7ea0: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
7eb0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
7ec0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73    }.      if( !s
7ed0: 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75  hortNames && !fu
7ee0: 6c 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73 70  llNames && p->sp
7ef0: 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e  an.z && p->span.
7f00: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  z[0] ){.        
7f10: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
7f20: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
7f30: 41 4d 45 5f 4e 41 4d 45 2c 20 28 63 68 61 72 2a  AME_NAME, (char*
7f40: 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73  )p->span.z, p->s
7f50: 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 65  pan.n);.      }e
7f60: 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65  lse if( fullName
7f70: 73 20 7c 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65  s || (!shortName
7f80: 73 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s && pTabList->n
7f90: 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20  Src>1) ){.      
7fa0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
7fb0: 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  0;.        char 
7fc0: 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20 20 20  *zTab;. .       
7fd0: 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   zTab = pTabList
7fe0: 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20  ->a[j].zAlias;. 
7ff0: 20 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e         if( fullN
8000: 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20  ames || zTab==0 
8010: 29 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a  ) zTab = pTab->z
8020: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71  Name;.        sq
8030: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
8040: 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22  zName, zTab, "."
8050: 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30  , zCol, (char*)0
8060: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
8070: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
8080: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
8090: 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 50 33 5f 44  AME, zName, P3_D
80a0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d  YNAMIC);.      }
80b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
80c0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
80d0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
80e0: 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 73 74  E_NAME, zCol, st
80f0: 72 6c 65 6e 28 7a 43 6f 6c 29 29 3b 0a 20 20 20  rlen(zCol));.   
8100: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
8110: 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20  f( p->span.z && 
8120: 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a  p->span.z[0] ){.
8130: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8140: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8150: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
8160: 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a  (char*)p->span.z
8170: 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20  , p->span.n);.  
8180: 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 56 64      /* sqlite3Vd
8190: 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63 65 28  beCompressSpace(
81a0: 76 2c 20 61 64 64 72 29 3b 20 2a 2f 0a 20 20 20  v, addr); */.   
81b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
81c0: 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20  ar zName[30];.  
81d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
81e0: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
81f0: 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  pTabList==0 );. 
8200: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4e 61       sprintf(zNa
8210: 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20  me, "column%d", 
8220: 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  i+1);.      sqli
8230: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8240: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8250: 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b  NAME, zName, 0);
8260: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e  .    }.  }.  gen
8270: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
8280: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
8290: 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 23  t, pEList);.}..#
82a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
82b0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
82c0: 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66  CT./*.** Name of
82d0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
82e0: 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66  operator, used f
82f0: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
8300: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s..*/.static con
8310: 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f  st char *selectO
8320: 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20  pName(int id){. 
8330: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74   char *z;.  swit
8340: 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61  ch( id ){.    ca
8350: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20  se TK_ALL:      
8360: 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22   z = "UNION ALL"
8370: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
8380: 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
8390: 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54  : z = "INTERSECT
83a0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
83b0: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20  case TK_EXCEPT: 
83c0: 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b     z = "EXCEPT";
83d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
83e0: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
83f0: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b      z = "UNION";
8400: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8410: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
8420: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
8430: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
8440: 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ELECT */../*.** 
8450: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
8460: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion.*/.static in
8470: 74 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74  t prepSelectStmt
8480: 28 50 61 72 73 65 2a 2c 20 53 65 6c 65 63 74 2a  (Parse*, Select*
8490: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  );../*.** Given 
84a0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
84b0: 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54  nt, generate a T
84c0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
84d0: 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a  hat describes.**
84e0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
84f0: 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a  of that SELECT..
8500: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
8510: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
8520: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
8530: 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65  , char *zTabName
8540: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
8550: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  t){.  Table *pTa
8560: 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  b;.  int i, j;. 
8570: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
8580: 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  t;.  Column *aCo
8590: 6c 2c 20 2a 70 43 6f 6c 3b 0a 0a 20 20 77 68 69  l, *pCol;..  whi
85a0: 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  le( pSelect->pPr
85b0: 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20  ior ) pSelect = 
85c0: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b  pSelect->pPrior;
85d0: 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65 63  .  if( prepSelec
85e0: 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 53  tStmt(pParse, pS
85f0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65  elect) ){.    re
8600: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
8610: 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52  ( sqlite3SelectR
8620: 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70  esolve(pParse, p
8630: 53 65 6c 65 63 74 2c 20 30 29 20 29 7b 0a 20 20  Select, 0) ){.  
8640: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
8650: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 4d    pTab = sqliteM
8660: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61  alloc( sizeof(Ta
8670: 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
8680: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ab==0 ){.    ret
8690: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 0;.  }.  pTa
86a0: 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70  b->nRef = 1;.  p
86b0: 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61  Tab->zName = zTa
86c0: 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 53 74  bName ? sqliteSt
86d0: 72 44 75 70 28 7a 54 61 62 4e 61 6d 65 29 20 3a  rDup(zTabName) :
86e0: 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   0;.  pEList = p
86f0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
8700: 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70    pTab->nCol = p
8710: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
8720: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
8730: 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e  ol>0 );.  pTab->
8740: 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20 73 71  aCol = aCol = sq
8750: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
8760: 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d  of(pTab->aCol[0]
8770: 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  )*pTab->nCol );.
8780: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
8790: 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  aCol; i<pTab->nC
87a0: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
87b0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 2c 20 2a  {.    Expr *p, *
87c0: 70 52 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  pR;.    char *zT
87d0: 79 70 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ype;.    char *z
87e0: 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6e 4e  Name;.    int nN
87f0: 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  ame;.    CollSeq
8800: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74   *pColl;.    int
8810: 20 63 6e 74 3b 0a 20 20 20 20 4e 61 6d 65 43 6f   cnt;.    NameCo
8820: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 0a  ntext sNC;.    .
8830: 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70      /* Get an ap
8840: 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66  propriate name f
8850: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20  or the column.  
8860: 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c    */.    p = pEL
8870: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
8880: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
8890: 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e  pRight==0 || p->
88a0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d  pRight->token.z=
88b0: 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d  =0 || p->pRight-
88c0: 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29  >token.z[0]!=0 )
88d0: 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65  ;.    if( (zName
88e0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
88f0: 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
8900: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
8910: 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  umn contains an 
8920: 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61  "AS <name>" phra
8930: 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61  se, use <name> a
8940: 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  s the name */.  
8950: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
8960: 74 65 53 74 72 44 75 70 28 7a 4e 61 6d 65 29 3b  teStrDup(zName);
8970: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
8980: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20  ->op==TK_DOT .  
8990: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
89a0: 70 52 3d 70 2d 3e 70 52 69 67 68 74 29 21 3d 30  pR=p->pRight)!=0
89b0: 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20   && pR->token.z 
89c0: 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  && pR->token.z[0
89d0: 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f  ] ){.      /* Fo
89e0: 72 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  r columns of the
89f0: 20 66 72 6f 6d 20 41 2e 42 20 75 73 65 20 42 20   from A.B use B 
8a00: 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  as the name */. 
8a10: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
8a20: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 54 22  ite3MPrintf("%T"
8a30: 2c 20 26 70 52 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  , &pR->token);. 
8a40: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
8a50: 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61  span.z && p->spa
8a60: 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  n.z[0] ){.      
8a70: 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69  /* Use the origi
8a80: 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20  nal text of the 
8a90: 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f  column expressio
8aa0: 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f  n as its name */
8ab0: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
8ac0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25  qlite3MPrintf("%
8ad0: 54 22 2c 20 26 70 2d 3e 73 70 61 6e 29 3b 0a 20  T", &p->span);. 
8ae0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8af0: 2f 2a 20 49 66 20 61 6c 6c 20 65 6c 73 65 20 66  /* If all else f
8b00: 61 69 6c 73 2c 20 6d 61 6b 65 20 75 70 20 61 20  ails, make up a 
8b10: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e  name */.      zN
8b20: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
8b30: 69 6e 74 66 28 22 63 6f 6c 75 6d 6e 25 64 22 2c  intf("column%d",
8b40: 20 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20   i+1);.    }.   
8b50: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
8b60: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  zName);.    if( 
8b70: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
8b80: 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 20 20 73  led() ){.      s
8b90: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
8ba0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
8bb0: 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 54  eleteTable(0, pT
8bc0: 61 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ab);.      retur
8bd0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 0;.    }..    
8be0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
8bf0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
8c00: 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20  unique.  If the 
8c10: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71  name is not uniq
8c20: 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e  ue,.    ** appen
8c30: 64 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74  d a integer to t
8c40: 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20  he name so that 
8c50: 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75  it becomes uniqu
8c60: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e  e..    */.    nN
8c70: 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61  ame = strlen(zNa
8c80: 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63  me);.    for(j=c
8c90: 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  nt=0; j<i; j++){
8ca0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
8cb0: 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a  e3StrICmp(aCol[j
8cc0: 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d  ].zName, zName)=
8cd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e  =0 ){.        zN
8ce0: 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a  ame[nName] = 0;.
8cf0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
8d00: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
8d10: 25 7a 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b  %z:%d", zName, +
8d20: 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 6a  +cnt);.        j
8d30: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69   = -1;.        i
8d40: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72  f( zName==0 ) br
8d50: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
8d60: 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61   }.    pCol->zNa
8d70: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20 20  me = zName;..   
8d80: 20 2f 2a 20 47 65 74 20 74 68 65 20 74 79 70 65   /* Get the type
8d90: 6e 61 6d 65 2c 20 74 79 70 65 20 61 66 66 69 6e  name, type affin
8da0: 69 74 79 2c 20 61 6e 64 20 63 6f 6c 6c 61 74 69  ity, and collati
8db0: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
8dc0: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  the.    ** colum
8dd0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65  n..    */.    me
8de0: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
8df0: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
8e00: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
8e10: 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
8e20: 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65    zType = sqlite
8e30: 53 74 72 44 75 70 28 63 6f 6c 75 6d 6e 54 79 70  StrDup(columnTyp
8e40: 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c  e(&sNC, p, 0, 0,
8e50: 20 30 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e   0));.    pCol->
8e60: 7a 54 79 70 65 20 3d 20 7a 54 79 70 65 3b 0a 20  zType = zType;. 
8e70: 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74     pCol->affinit
8e80: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  y = sqlite3ExprA
8e90: 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20  ffinity(p);.    
8ea0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
8eb0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
8ec0: 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e, p);.    if( p
8ed0: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43  Coll ){.      pC
8ee0: 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ol->zColl = sqli
8ef0: 74 65 53 74 72 44 75 70 28 70 43 6f 6c 6c 2d 3e  teStrDup(pColl->
8f00: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
8f10: 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20  }.  pTab->iPKey 
8f20: 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  = -1;.  return p
8f30: 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  Tab;.}../*.** Pr
8f40: 65 70 61 72 65 20 61 20 53 45 4c 45 43 54 20 73  epare a SELECT s
8f50: 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f  tatement for pro
8f60: 63 65 73 73 69 6e 67 20 62 79 20 64 6f 69 6e 67  cessing by doing
8f70: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
8f80: 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20  * things:.**.** 
8f90: 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72     (1)  Make sur
8fa0: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
8fb0: 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
8fc0: 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72  assigned to ever
8fd0: 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65  y.**         ele
8fe0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  ment of the FROM
8ff0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
9000: 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74    (2)  Fill in t
9010: 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  he pTabList->a[]
9020: 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20  .pTab fields in 
9030: 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
9040: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66   .**         def
9050: 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  ines FROM clause
9060: 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70  .  When views ap
9070: 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
9080: 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20   clause,.**     
9090: 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73      fill pTabLis
90a0: 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77  t->a[].pSelect w
90b0: 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
90c0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
90d0: 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  nt.**         th
90e0: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
90f0: 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20  e view.  A copy 
9100: 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76  is made of the v
9110: 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20  iew's SELECT.** 
9120: 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
9130: 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  t so that we can
9140: 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f   freely modify o
9150: 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74  r delete that st
9160: 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
9170: 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79     without worry
9180: 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e  ing about messin
9190: 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74  g up the presist
91a0: 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ent representati
91b0: 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66  on.**         of
91c0: 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a   the view..**.**
91d0: 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72      (3)  Add ter
91e0: 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ms to the WHERE 
91f0: 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f  clause to accomo
9200: 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c  date the NATURAL
9210: 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20   keyword.**     
9220: 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64      on joins and
9230: 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
9240: 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e  G clause of join
9250: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20  s..**.**    (4) 
9260: 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f   Scan the list o
9270: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
9280: 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c   result set (pEL
9290: 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20  ist) looking.** 
92a0: 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74          for inst
92b0: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22  ances of the "*"
92c0: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65   operator or the
92d0: 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f   TABLE.* operato
92e0: 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66  r..**         If
92f0: 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65   found, expand e
9300: 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76  ach "*" to be ev
9310: 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76  ery column in ev
9320: 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  ery table.**    
9330: 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a       and TABLE.*
9340: 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
9350: 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a  umn in TABLE..**
9360: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20  .** Return 0 on 
9370: 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
9380: 72 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c  re are problems,
9390: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
93a0: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
93b0: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
93c0: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  non-zero..*/.sta
93d0: 74 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65  tic int prepSele
93e0: 63 74 53 74 6d 74 28 50 61 72 73 65 20 2a 70 50  ctStmt(Parse *pP
93f0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
9400: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c  {.  int i, j, k,
9410: 20 72 63 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   rc;.  SrcList *
9420: 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
9430: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
9440: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
9450: 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 69  tem *pFrom;..  i
9460: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53  f( p==0 || p->pS
9470: 72 63 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  rc==0 || sqlite3
9480: 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
9490: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
94a0: 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d    }.  pTabList =
94b0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
94c0: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
94d0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
94e0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
94f0: 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
9500: 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73  d to all entries
9510: 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f   in.  ** the FRO
9520: 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
9530: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
9540: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
9550: 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
9560: 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 2d 3e  sors(pParse, p->
9570: 70 53 72 63 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  pSrc);..  /* Loo
9580: 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65  k up every table
9590: 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
95a0: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
95b0: 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a   select.  If.  *
95c0: 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  * an entry of th
95d0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
95e0: 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74   a subquery inst
95f0: 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ead of a table o
9600: 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65  r view,.  ** the
9610: 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73  n create a trans
9620: 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
9630: 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65  ture to describe
9640: 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
9650: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
9660: 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
9670: 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
9680: 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
9690: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
96a0: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  ab;.    if( pFro
96b0: 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20  m->pTab!=0 ){.  
96c0: 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61 74      /* This stat
96d0: 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61 64  ement has alread
96e0: 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64 2e  y been prepared.
96f0: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
9700: 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67  ed.      ** to g
9710: 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20  o further. */.  
9720: 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30      assert( i==0
9730: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
9740: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
9750: 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFrom->zName==
9760: 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
9770: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
9780: 59 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  Y.      /* A sub
9790: 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
97a0: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
97b0: 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61  ELECT */.      a
97c0: 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53  ssert( pFrom->pS
97d0: 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20  elect!=0 );.    
97e0: 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c    if( pFrom->zAl
97f0: 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ias==0 ){.      
9800: 20 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20    pFrom->zAlias 
9810: 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  =.          sqli
9820: 74 65 33 4d 50 72 69 6e 74 66 28 22 73 71 6c 69  te3MPrintf("sqli
9830: 74 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22  te_subquery_%p_"
9840: 2c 20 28 76 6f 69 64 2a 29 70 46 72 6f 6d 2d 3e  , (void*)pFrom->
9850: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
9860: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
9870: 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
9880: 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
9890: 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20  Tab = pTab = .  
98a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73        sqlite3Res
98b0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
98c0: 50 61 72 73 65 2c 20 70 46 72 6f 6d 2d 3e 7a 41  Parse, pFrom->zA
98d0: 6c 69 61 73 2c 20 70 46 72 6f 6d 2d 3e 70 53 65  lias, pFrom->pSe
98e0: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28  lect);.      if(
98f0: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
9900: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
9910: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54      }.      /* T
9920: 68 65 20 69 73 45 70 68 65 6d 20 66 6c 61 67 20  he isEphem flag 
9930: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
9940: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
9950: 72 65 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20  re has been.    
9960: 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79    ** dynamically
9970: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d   allocated and m
9980: 61 79 20 62 65 20 66 72 65 65 64 20 61 74 20 61  ay be freed at a
9990: 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68  ny time.  In oth
99a0: 65 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 20 20  er words,.      
99b0: 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f 74 20 70  ** pTab is not p
99c0: 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 70 65 72  ointing to a per
99d0: 73 69 73 74 65 6e 74 20 74 61 62 6c 65 20 73 74  sistent table st
99e0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66  ructure that def
99f0: 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 70 61  ines.      ** pa
9a00: 72 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61  rt of the schema
9a10: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d  . */.      pTab-
9a20: 3e 69 73 45 70 68 65 6d 20 3d 20 31 3b 0a 23 65  >isEphem = 1;.#e
9a30: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
9a40: 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69        /* An ordi
9a50: 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69  nary table or vi
9a60: 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46  ew name in the F
9a70: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
9a80: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
9a90: 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
9aa0: 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
9ab0: 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20  = pTab = .      
9ac0: 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54    sqlite3LocateT
9ad0: 61 62 6c 65 28 70 50 61 72 73 65 2c 70 46 72 6f  able(pParse,pFro
9ae0: 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e  m->zName,pFrom->
9af0: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
9b00: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
9b10: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
9b20: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
9b30: 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23   pTab->nRef++;.#
9b40: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
9b50: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
9b60: 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54   !defined (SQLIT
9b70: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
9b80: 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 70  BLE).      if( p
9b90: 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20  Tab->pSelect || 
9ba0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
9bb0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
9bc0: 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74   reach here if t
9bd0: 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
9be0: 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65  s a really a vie
9bf0: 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  w */.        if(
9c00: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
9c10: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
9c20: 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20  e, pTab) ){.    
9c30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
9c40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9c50: 20 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70    /* If pFrom->p
9c60: 53 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61  Select!=0 it mea
9c70: 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
9c80: 67 20 77 69 74 68 20 61 0a 20 20 20 20 20 20 20  g with a.       
9c90: 20 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20   ** view within 
9ca0: 61 20 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c  a view.  The SEL
9cb0: 45 43 54 20 73 74 72 75 63 74 75 72 65 20 68 61  ECT structure ha
9cc0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20  s already been. 
9cd0: 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64         ** copied
9ce0: 20 62 79 20 74 68 65 20 6f 75 74 65 72 20 76 69   by the outer vi
9cf0: 65 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69  ew so we can ski
9d00: 70 20 74 68 65 20 63 6f 70 79 20 73 74 65 70 20  p the copy step 
9d10: 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  here.        ** 
9d20: 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65  in the inner vie
9d30: 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  w..        */.  
9d40: 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d        if( pFrom-
9d50: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
9d60: 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e           pFrom->
9d70: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
9d80: 33 53 65 6c 65 63 74 44 75 70 28 70 54 61 62 2d  3SelectDup(pTab-
9d90: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
9da0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
9db0: 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  dif.    }.  }.. 
9dc0: 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55   /* Process NATU
9dd0: 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e  RAL keywords, an
9de0: 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  d ON and USING c
9df0: 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e  lauses of joins.
9e00: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
9e10: 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50  teProcessJoin(pP
9e20: 61 72 73 65 2c 20 70 29 20 29 20 72 65 74 75 72  arse, p) ) retur
9e30: 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65  n 1;..  /* For e
9e40: 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63  very "*" that oc
9e50: 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75  curs in the colu
9e60: 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20  mn list, insert 
9e70: 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a  the names of.  *
9e80: 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  * all columns in
9e90: 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e   all tables.  An
9ea0: 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c  d for every TABL
9eb0: 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e  E.* insert the n
9ec0: 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c  ames.  ** of all
9ed0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c   columns in TABL
9ee0: 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  E.  The parser i
9ef0: 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61  nserted a specia
9f00: 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  l expression.  *
9f10: 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c  * with the TK_AL
9f20: 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65  L operator for e
9f30: 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20  ach "*" that it 
9f40: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c  found in the col
9f50: 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54  umn list..  ** T
9f60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
9f70: 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f  e just has to lo
9f80: 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20  cate the TK_ALL 
9f90: 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20  expressions and 
9fa0: 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68  expand.  ** each
9fb0: 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74   one to the list
9fc0: 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
9fd0: 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20  in all tables.. 
9fe0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
9ff0: 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65  st loop just che
a000: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68  cks to see if th
a010: 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20  ere are any "*" 
a020: 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74  operators.  ** t
a030: 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69  hat need expandi
a040: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b  ng..  */.  for(k
a050: 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
a060: 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45  xpr; k++){.    E
a070: 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74  xpr *pE = pEList
a080: 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[k].pExpr;.  
a090: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
a0a0: 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
a0b0: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
a0c0: 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67  _DOT && pE->pRig
a0d0: 68 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  ht && pE->pRight
a0e0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20  ->op==TK_ALL.   
a0f0: 20 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65        && pE->pLe
a100: 66 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d  ft && pE->pLeft-
a110: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65  >op==TK_ID ) bre
a120: 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30  ak;.  }.  rc = 0
a130: 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74  ;.  if( k<pEList
a140: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f  ->nExpr ){.    /
a150: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67  *.    ** If we g
a160: 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73  et here it means
a170: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
a180: 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
a190: 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20  more "*".    ** 
a1a0: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e  operators that n
a1b0: 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
a1c0: 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ed.  Loop throug
a1d0: 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
a1e0: 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  n.    ** in the 
a1f0: 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65  result set and e
a200: 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62  xpand them one b
a210: 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  y one..    */.  
a220: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
a230: 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69  t_item *a = pELi
a240: 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c  st->a;.    ExprL
a250: 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ist *pNew = 0;. 
a260: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
a270: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
a280: 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61  ;.    int longNa
a290: 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53  mes = (flags & S
a2a0: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
a2b0: 65 73 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  es)!=0 &&.      
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2d0: 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
a2e0: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d  ShortColNames)==
a2f0: 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b  0;..    for(k=0;
a300: 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
a310: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; k++){.      Ex
a320: 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45  pr *pE = a[k].pE
a330: 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
a340: 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26  E->op!=TK_ALL &&
a350: 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 45 2d  .           (pE-
a360: 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
a370: 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20  E->pRight==0 || 
a380: 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d  pE->pRight->op!=
a390: 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20  TK_ALL) ){.     
a3a0: 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
a3b0: 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
a3c0: 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
a3d0: 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
a3e0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a3f0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
a400: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
a410: 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c  New, a[k].pExpr,
a420: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
a430: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
a440: 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
a450: 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20  >nExpr-1].zName 
a460: 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  = a[k].zName;.  
a470: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a480: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
a490: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a4a0: 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
a4b0: 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e  .        a[k].zN
a4c0: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ame = 0;.      }
a4d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
a4e0: 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
a4f0: 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22   is a "*" or a "
a500: 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65  TABLE.*" and nee
a510: 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20  ds to be.       
a520: 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f   ** expanded. */
a530: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62  .        int tab
a540: 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20  leSeen = 0;     
a550: 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65   /* Set to 1 whe
a560: 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20  n TABLE matches 
a570: 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
a580: 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  *zTName;        
a590: 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e      /* text of n
a5a0: 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a  ame of TABLE */.
a5b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
a5c0: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
a5d0: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
a5e0: 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71       zTName = sq
a5f0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
a600: 65 6e 28 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74  en(&pE->pLeft->t
a610: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  oken);.        }
a620: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
a630: 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  zTName = 0;.    
a640: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
a650: 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
a660: 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
a670: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
a680: 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
a690: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
a6a0: 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
a6b0: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
a6c0: 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d  zTabName = pFrom
a6d0: 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ->zAlias;.      
a6e0: 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
a6f0: 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b  ==0 || zTabName[
a700: 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20  0]==0 ){ .      
a710: 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d        zTabName =
a720: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
a730: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a740: 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26      if( zTName &
a750: 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c  & (zTabName==0 |
a760: 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30  | zTabName[0]==0
a770: 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
a780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
a790: 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61  ICmp(zTName, zTa
a7a0: 62 4e 61 6d 65 29 21 3d 30 29 20 29 7b 0a 20 20  bName)!=0) ){.  
a7b0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
a7c0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
a7d0: 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53            tableS
a7e0: 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
a7f0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
a800: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
a810: 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
a820: 20 2a 70 45 78 70 72 2c 20 2a 70 52 69 67 68 74   *pExpr, *pRight
a830: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
a840: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62  ar *zName = pTab
a850: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
a860: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
a870: 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( i>0 ){.       
a880: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
a890: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66  cList_item *pLef
a8a0: 74 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  t = &pTabList->a
a8b0: 5b 69 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  [i-1];.         
a8c0: 20 20 20 20 20 69 66 28 20 28 70 4c 65 66 74 5b       if( (pLeft[
a8d0: 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  1].jointype & JT
a8e0: 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20 26 26 0a  _NATURAL)!=0 &&.
a8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a900: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e          columnIn
a910: 64 65 78 28 70 4c 65 66 74 2d 3e 70 54 61 62 2c  dex(pLeft->pTab,
a920: 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
a930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a940: 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f   In a NATURAL jo
a950: 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69  in, omit the joi
a960: 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74  n columns from t
a970: 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
a980: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20      ** table on 
a990: 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20  the right */.   
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
a9b0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
a9c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
a9d0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
a9e0: 49 64 4c 69 73 74 49 6e 64 65 78 28 70 4c 65 66  IdListIndex(pLef
a9f0: 74 5b 31 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e 61  t[1].pUsing, zNa
aa00: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
aa10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
aa20: 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53  a join with a US
aa30: 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74  ING clause, omit
aa40: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a   columns in the.
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa60: 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20  ** using clause 
aa70: 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f  from the table o
aa80: 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a  n the right. */.
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aaa0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
aab0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
aac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
aad0: 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c      pRight = sql
aae0: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20  ite3Expr(TK_ID, 
aaf0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
ab00: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
ab10: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
ab20: 20 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b 65           setToke
ab30: 6e 28 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  n(&pRight->token
ab40: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
ab50: 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
ab60: 6d 65 20 26 26 20 28 6c 6f 6e 67 4e 61 6d 65 73  me && (longNames
ab70: 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   || pTabList->nS
ab80: 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20  rc>1) ){.       
ab90: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65         Expr *pLe
aba0: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
abb0: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29  (TK_ID, 0, 0, 0)
abc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
abd0: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
abe0: 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  xpr(TK_DOT, pLef
abf0: 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  t, pRight, 0);. 
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
ac10: 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61   pExpr==0 ) brea
ac20: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
ac30: 20 73 65 74 54 6f 6b 65 6e 28 26 70 4c 65 66 74   setToken(&pLeft
ac40: 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d  ->token, zTabNam
ac50: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
ac60: 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 45 78 70    setToken(&pExp
ac70: 72 2d 3e 73 70 61 6e 2c 20 73 71 6c 69 74 65 33  r->span, sqlite3
ac80: 4d 50 72 69 6e 74 66 28 22 25 73 2e 25 73 22 2c  MPrintf("%s.%s",
ac90: 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65   zTabName, zName
aca0: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
acb0: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79    pExpr->span.dy
acc0: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
acd0: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
ace0: 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  n.z = 0;.       
acf0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
ad00: 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  ken.n = 0;.     
ad10: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
ad20: 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20  token.dyn = 0;. 
ad30: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
ad40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
ad50: 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
ad70: 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70  xpr->span = pExp
ad80: 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  r->token;.      
ad90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ada0: 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
adb0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
adc0: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
add0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
ade0: 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70 45  pNew, pExpr, &pE
adf0: 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  xpr->span);.    
ae00: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
ae20: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
ae30: 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20  istAppend(pNew, 
ae40: 70 45 78 70 72 2c 20 26 70 52 69 67 68 74 2d 3e  pExpr, &pRight->
ae50: 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  token);.        
ae60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
ae70: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
ae80: 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
ae90: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
aea0: 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
aeb0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
aec0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
aed0: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
aee0: 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
aef0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
af00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
af10: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
af20: 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
af30: 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
af40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
af50: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
af60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
af70: 69 74 65 46 72 65 65 28 7a 54 4e 61 6d 65 29 3b  iteFree(zTName);
af80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
af90: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
afa0: 73 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29  stDelete(pEList)
afb0: 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20  ;.    p->pEList 
afc0: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65  = pNew;.  }.  re
afd0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
afe0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
aff0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
b000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
b010: 6e 65 20 61 73 73 6f 63 69 61 74 65 73 20 65 6e  ne associates en
b020: 74 72 69 65 73 20 69 6e 20 61 6e 20 4f 52 44 45  tries in an ORDE
b030: 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20  R BY expression 
b040: 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 63 6f 6c  list with.** col
b050: 75 6d 6e 73 20 69 6e 20 61 20 72 65 73 75 6c 74  umns in a result
b060: 2e 20 20 46 6f 72 20 65 61 63 68 20 4f 52 44 45  .  For each ORDE
b070: 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 2c  R BY expression,
b080: 20 74 68 65 20 6f 70 63 6f 64 65 20 6f 66 0a 2a   the opcode of.*
b090: 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  * the top-level 
b0a0: 6e 6f 64 65 20 69 73 20 63 68 61 6e 67 65 64 20  node is changed 
b0b0: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64  to TK_COLUMN and
b0c0: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 76 61 6c   the iColumn val
b0d0: 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70  ue of.** the top
b0e0: 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66  -level node is f
b0f0: 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 63 6f  illed in with co
b100: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20  lumn number and 
b110: 74 68 65 20 69 54 61 62 6c 65 0a 2a 2a 20 76 61  the iTable.** va
b120: 6c 75 65 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c  lue of the top-l
b130: 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c  evel node is fil
b140: 6c 65 64 20 77 69 74 68 20 69 54 61 62 6c 65 20  led with iTable 
b150: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
b160: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 70 72   If there are pr
b170: 69 6f 72 20 53 45 4c 45 43 54 20 63 6c 61 75 73  ior SELECT claus
b180: 65 73 2c 20 74 68 65 79 20 61 72 65 20 70 72 6f  es, they are pro
b190: 63 65 73 73 65 64 20 66 69 72 73 74 2e 20 20 41  cessed first.  A
b1a0: 20 6d 61 74 63 68 0a 2a 2a 20 69 6e 20 61 6e 20   match.** in an 
b1b0: 65 61 72 6c 69 65 72 20 53 45 4c 45 43 54 20 74  earlier SELECT t
b1c0: 61 6b 65 73 20 70 72 65 63 65 64 65 6e 63 65 20  akes precedence 
b1d0: 6f 76 65 72 20 61 20 6c 61 74 65 72 20 53 45 4c  over a later SEL
b1e0: 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65  ECT..**.** Any e
b1f0: 6e 74 72 79 20 74 68 61 74 20 64 6f 65 73 20 6e  ntry that does n
b200: 6f 74 20 6d 61 74 63 68 20 69 73 20 66 6c 61 67  ot match is flag
b210: 67 65 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2e  ged as an error.
b220: 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20    The number.** 
b230: 6f 66 20 65 72 72 6f 72 73 20 69 73 20 72 65 74  of errors is ret
b240: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
b250: 20 69 6e 74 20 6d 61 74 63 68 4f 72 64 65 72 62   int matchOrderb
b260: 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  yToColumn(.  Par
b270: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
b280: 20 20 20 20 20 2f 2a 20 41 20 70 6c 61 63 65 20       /* A place 
b290: 74 6f 20 6c 65 61 76 65 20 65 72 72 6f 72 20 6d  to leave error m
b2a0: 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c  essages */.  Sel
b2b0: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
b2c0: 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74 6f       /* Match to
b2d0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
b2e0: 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a  of this SELECT *
b2f0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
b300: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54  rderBy,     /* T
b310: 68 65 20 4f 52 44 45 52 20 42 59 20 76 61 6c 75  he ORDER BY valu
b320: 65 73 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69  es to match agai
b330: 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  nst columns */. 
b340: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
b350: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
b360: 72 74 20 74 68 69 73 20 76 61 6c 75 65 20 69 6e  rt this value in
b370: 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   iTable */.  int
b380: 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 20 20   mustComplete   
b390: 20 20 20 20 20 2f 2a 20 49 66 20 54 52 55 45 20       /* If TRUE 
b3a0: 61 6c 6c 20 4f 52 44 45 52 20 42 59 73 20 6d 75  all ORDER BYs mu
b3b0: 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20  st match */.){. 
b3c0: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20   int nErr = 0;. 
b3d0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70   int i, j;.  Exp
b3e0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a  rList *pEList;..
b3f0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30    if( pSelect==0
b400: 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   || pOrderBy==0 
b410: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
b420: 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29  ( mustComplete )
b430: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
b440: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
b450: 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72 42 79  ; i++){ pOrderBy
b460: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b  ->a[i].done = 0;
b470: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 65   }.  }.  if( pre
b480: 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72  pSelectStmt(pPar
b490: 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a  se, pSelect) ){.
b4a0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
b4b0: 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d  }.  if( pSelect-
b4c0: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
b4d0: 66 28 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  f( matchOrderbyT
b4e0: 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  oColumn(pParse, 
b4f0: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2c  pSelect->pPrior,
b500: 20 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c   pOrderBy, iTabl
b510: 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72  e, 0) ){.      r
b520: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
b530: 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53   }.  pEList = pS
b540: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
b550: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
b560: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
b570: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20  ){.    Expr *pE 
b580: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
b590: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20  .pExpr;.    int 
b5a0: 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69  iCol = -1;.    i
b5b0: 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  f( pOrderBy->a[i
b5c0: 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75  ].done ) continu
b5d0: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
b5e0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
b5f0: 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20  pE, &iCol) ){.  
b600: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20      if( iCol<=0 
b610: 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e  || iCol>pEList->
b620: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
b630: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
b640: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
b650: 20 20 20 22 4f 52 44 45 52 20 42 59 20 70 6f 73     "ORDER BY pos
b660: 69 74 69 6f 6e 20 25 64 20 73 68 6f 75 6c 64 20  ition %d should 
b670: 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  be between 1 and
b680: 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
b690: 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  iCol, pEList->nE
b6a0: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 45  xpr);.        nE
b6b0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72  rr++;.        br
b6c0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
b6d0: 20 20 20 69 66 28 20 21 6d 75 73 74 43 6f 6d 70     if( !mustComp
b6e0: 6c 65 74 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lete ) continue;
b6f0: 0a 20 20 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20  .      iCol--;. 
b700: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30     }.    for(j=0
b710: 3b 20 69 43 6f 6c 3c 30 20 26 26 20 6a 3c 70 45  ; iCol<0 && j<pE
b720: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  List->nExpr; j++
b730: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c  ){.      if( pEL
b740: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20  ist->a[j].zName 
b750: 26 26 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49  && (pE->op==TK_I
b760: 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f  D || pE->op==TK_
b770: 53 54 52 49 4e 47 29 20 29 7b 0a 20 20 20 20 20  STRING) ){.     
b780: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20     char *zName, 
b790: 2a 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20 20  *zLabel;.       
b7a0: 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d   zName = pEList-
b7b0: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[j].zName;.   
b7c0: 20 20 20 20 20 7a 4c 61 62 65 6c 20 3d 20 73 71       zLabel = sq
b7d0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
b7e0: 65 6e 28 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a  en(&pE->token);.
b7f0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b800: 7a 4c 61 62 65 6c 21 3d 30 20 29 3b 0a 20 20 20  zLabel!=0 );.   
b810: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
b820: 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a  StrICmp(zName, z
b830: 4c 61 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20  Label)==0 ){ .  
b840: 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a          iCol = j
b850: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b860: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
b870: 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  Label);.      }.
b880: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
b890: 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
b8a0: 6f 6d 70 61 72 65 28 70 45 2c 20 70 45 4c 69 73  ompare(pE, pELis
b8b0: 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29  t->a[j].pExpr) )
b8c0: 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d  {.        iCol =
b8d0: 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   j;.      }.    
b8e0: 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d  }.    if( iCol>=
b8f0: 30 20 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e 6f  0 ){.      pE->o
b900: 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
b910: 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
b920: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70   = iCol;.      p
b930: 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  E->iTable = iTab
b940: 6c 65 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 41  le;.      pE->iA
b950: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  gg = -1;.      p
b960: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f  OrderBy->a[i].do
b970: 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ne = 1;.    }.  
b980: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20    if( iCol<0 && 
b990: 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a  mustComplete ){.
b9a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
b9b0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
b9c0: 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
b9d0: 74 65 72 6d 20 6e 75 6d 62 65 72 20 25 64 20 64  term number %d d
b9e0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e  oes not match an
b9f0: 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 22  y result column"
ba00: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 6e 45  , i+1);.      nE
ba10: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61  rr++;.      brea
ba20: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
ba30: 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a  eturn nErr;  .}.
ba40: 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
ba50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
ba60: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
ba70: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44  ../*.** Get a VD
ba80: 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  BE for the given
ba90: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e   parser context.
baa0: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
bab0: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
bac0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
bad0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
bae0: 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20  ULL and leave a 
baf0: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
bb00: 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69  e..*/.Vdbe *sqli
bb10: 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65  te3GetVdbe(Parse
bb20: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
bb30: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
bb40: 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30  Vdbe;.  if( v==0
bb50: 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72   ){.    v = pPar
bb60: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
bb70: 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50  te3VdbeCreate(pP
bb80: 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20  arse->db);.  }. 
bb90: 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f   return v;.}.../
bba0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
bbb0: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
bbc0: 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  set fields of th
bbd0: 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f  e SELECT based o
bbe0: 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20  n the.** pLimit 
bbf0: 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70 72  and pOffset expr
bc00: 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74  essions.  pLimit
bc10: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c   and pOffset hol
bc20: 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
bc30: 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72  s.** that appear
bc40: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
bc50: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61   SQL statement a
bc60: 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61  fter the LIMIT a
bc70: 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79  nd OFFSET.** key
bc80: 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20  words.  Or NULL 
bc90: 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64  if those keyword
bca0: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69  s are omitted. i
bcb0: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
bcc0: 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e  t .** are the in
bcd0: 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67  teger memory reg
bce0: 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f  ister numbers fo
bcf0: 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  r counters used 
bd00: 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74  to compute .** t
bd10: 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  he limit and off
bd20: 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69  set.  If there i
bd30: 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f  s no limit and/o
bd40: 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a  r offset, then .
bd50: 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  ** iLimit and iO
bd60: 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69  ffset are negati
bd70: 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ve..**.** This r
bd80: 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74  outine changes t
bd90: 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69  he values of iLi
bda0: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
bdb0: 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d  only if.** a lim
bdc0: 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20  it or offset is 
bdd0: 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69  defined by pLimi
bde0: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20  t and pOffset.  
bdf0: 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f  iLimit and.** iO
be00: 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76  ffset should hav
be10: 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f  e been preset to
be20: 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66   appropriate def
be30: 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28  ault values.** (
be40: 75 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20  usually but not 
be50: 61 6c 77 61 79 73 20 2d 31 29 20 70 72 69 6f 72  always -1) prior
be60: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
be70: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c   routine..** Onl
be80: 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f  y if pLimit!=0 o
be90: 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20  r pOffset!=0 do 
bea0: 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
beb0: 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66  ers get.** redef
bec0: 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e  ined.  The UNION
bed0: 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73   ALL operator us
bee0: 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79  es this property
bef0: 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65   to force.** the
bf00: 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61   reuse of the sa
bf10: 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  me limit and off
bf20: 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63  set registers ac
bf30: 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  ross multiple.**
bf40: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
bf50: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
bf60: 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  id computeLimitR
bf70: 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a  egisters(Parse *
bf80: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
bf90: 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a  p, int iBreak){.
bfa0: 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20    Vdbe *v = 0;. 
bfb0: 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b   int iLimit = 0;
bfc0: 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a  .  int iOffset;.
bfd0: 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64    int addr1, add
bfe0: 72 32 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  r2;..  /* .  ** 
bff0: 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79  "LIMIT -1" alway
c000: 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73  s shows all rows
c010: 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65  .  There is some
c020: 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73  .  ** contravers
c030: 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65  y about what the
c040: 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
c050: 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a  r should be..  *
c060: 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d  * The current im
c070: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74  plementation int
c080: 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30  erprets "LIMIT 0
c090: 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e  " to mean.  ** n
c0a0: 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69  o rows..  */.  i
c0b0: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
c0c0: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
c0d0: 69 4c 69 6d 69 74 20 3d 20 70 50 61 72 73 65 2d  iLimit = pParse-
c0e0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 50 61 72 73  >nMem;.    pPars
c0f0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20  e->nMem += 2;.  
c100: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
c110: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
c120: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
c130: 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
c140: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
c150: 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
c160: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c170: 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  p(v, OP_MustBeIn
c180: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  t, 0, 0);.    sq
c190: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c1a0: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
c1b0: 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 56  Limit, 0);.    V
c1c0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
c1d0: 23 20 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22  # LIMIT counter"
c1e0: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
c1f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
c200: 66 4d 65 6d 5a 65 72 6f 2c 20 69 4c 69 6d 69 74  fMemZero, iLimit
c210: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 20  , iBreak);.  }. 
c220: 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20   if( p->pOffset 
c230: 29 7b 0a 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  ){.    p->iOffse
c240: 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 70 50  t = iOffset = pP
c250: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
c260: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
c270: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
c280: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
c290: 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
c2a0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
c2b0: 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20   p->pOffset);.  
c2c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c2d0: 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  Op(v, OP_MustBeI
c2e0: 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  nt, 0, 0);.    s
c2f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c300: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
c310: 69 4f 66 66 73 65 74 2c 20 70 2d 3e 70 4c 69 6d  iOffset, p->pLim
c320: 69 74 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62 65  it==0);.    Vdbe
c330: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 4f  Comment((v, "# O
c340: 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29  FFSET counter"))
c350: 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  ;.    addr1 = sq
c360: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c370: 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69  , OP_IfMemPos, i
c380: 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20  Offset, 0);.    
c390: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c3a0: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
c3b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
c3c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
c3d0: 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  teger, 0, 0);.  
c3e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
c3f0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
c400: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  .    if( p->pLim
c410: 69 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  it ){.      sqli
c420: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c430: 4f 50 5f 41 64 64 2c 20 30 2c 20 30 29 3b 0a 20  OP_Add, 0, 0);. 
c440: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
c450: 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
c460: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
c470: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
c480: 66 4d 65 6d 50 6f 73 2c 20 69 4c 69 6d 69 74 2c  fMemPos, iLimit,
c490: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
c4a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c4b0: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
c4c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c4d0: 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 2d  (v, OP_MemInt, -
c4e0: 31 2c 20 69 4c 69 6d 69 74 2b 31 29 3b 0a 20 20  1, iLimit+1);.  
c4f0: 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
c500: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c510: 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20  _Goto, 0, 0);.  
c520: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
c530: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
c540: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c550: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
c560: 74 6f 72 65 2c 20 69 4c 69 6d 69 74 2b 31 2c 20  tore, iLimit+1, 
c570: 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  1);.    VdbeComm
c580: 65 6e 74 28 28 76 2c 20 22 23 20 4c 49 4d 49 54  ent((v, "# LIMIT
c590: 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20  +OFFSET"));.    
c5a0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
c5b0: 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20  ere(v, addr2);. 
c5c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
c5d0: 63 61 74 65 20 61 20 76 69 72 74 75 61 6c 20 69  cate a virtual i
c5e0: 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
c5f0: 73 6f 72 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  sorting..*/.stat
c600: 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 53 6f  ic void createSo
c610: 72 74 69 6e 67 49 6e 64 65 78 28 50 61 72 73 65  rtingIndex(Parse
c620: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
c630: 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70   *p, ExprList *p
c640: 4f 72 64 65 72 42 79 29 7b 0a 20 20 69 66 28 20  OrderBy){.  if( 
c650: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
c660: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 61 73  int addr;.    as
c670: 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e  sert( pOrderBy->
c680: 69 45 43 75 72 73 6f 72 3d 3d 30 20 29 3b 0a 20  iECursor==0 );. 
c690: 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43     pOrderBy->iEC
c6a0: 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
c6b0: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 61 64 64 72  nTab++;.    addr
c6c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c6d0: 64 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64 62  dOp(pParse->pVdb
c6e0: 65 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  e, OP_OpenEpheme
c6f0: 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ral,.           
c700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c710: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
c720: 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  sor, pOrderBy->n
c730: 45 78 70 72 2b 31 29 3b 0a 20 20 20 20 61 73 73  Expr+1);.    ass
c740: 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
c750: 45 70 68 6d 5b 32 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[2] == -1 );
c760: 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e  .    p->addrOpen
c770: 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[2] = addr;.
c780: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
c790: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
c7a0: 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
c7b0: 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   Return the appr
c7c0: 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e  opriate collatin
c7d0: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
c7e0: 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
c7f0: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75  n of.** the resu
c800: 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63  lt set for the c
c810: 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73  ompound-select s
c820: 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52  tatement "p".  R
c830: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a  eturn NULL if.**
c840: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
c850: 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  no default colla
c860: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
c870: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
c880: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
c890: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
c8a0: 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  ect is taken fro
c8b0: 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  m the.** left-mo
c8c0: 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73  st term of the s
c8d0: 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61  elect that has a
c8e0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
c8f0: 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43  nce..*/.static C
c900: 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c  ollSeq *multiSel
c910: 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  ectCollSeq(Parse
c920: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
c930: 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a   *p, int iCol){.
c940: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b    CollSeq *pRet;
c950: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
c960: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d   ){.    pRet = m
c970: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
c980: 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72  q(pParse, p->pPr
c990: 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65  ior, iCol);.  }e
c9a0: 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  lse{.    pRet = 
c9b0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 65  0;.  }.  if( pRe
c9c0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 52 65 74  t==0 ){.    pRet
c9d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
c9e0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
c9f0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
ca00: 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72  .pExpr);.  }.  r
ca10: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
ca20: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
ca30: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
ca40: 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ECT */..#ifndef 
ca50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
ca60: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
ca70: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
ca80: 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
ca90: 65 73 73 20 61 20 71 75 65 72 79 20 74 68 61 74  ess a query that
caa0: 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 75   is really the u
cab0: 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72  nion.** or inter
cac0: 73 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f  section of two o
cad0: 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20  r more separate 
cae0: 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22  queries..**.** "
caf0: 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  p" points to the
cb00: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74   right-most of t
cb10: 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20  he two queries. 
cb20: 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68   the query on th
cb30: 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e  e.** left is p->
cb40: 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66  pPrior.  The lef
cb50: 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c  t query could al
cb60: 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64  so be a compound
cb70: 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69   query.** in whi
cb80: 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f 75  ch case this rou
cb90: 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c  tine will be cal
cba0: 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e  led recursively.
cbb0: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75   .**.** The resu
cbc0: 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c  lts of the total
cbd0: 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62 65   query are to be
cbe0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20   written into a 
cbf0: 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  destination.** o
cc00: 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69 74  f type eDest wit
cc10: 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61 72  h parameter iPar
cc20: 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65  m..**.** Example
cc30: 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20   1:  Consider a 
cc40: 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75  three-way compou
cc50: 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  nd SQL statement
cc60: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  ..**.**     SELE
cc70: 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49  CT a FROM t1 UNI
cc80: 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  ON SELECT b FROM
cc90: 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t2 UNION SELECT
cca0: 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a   c FROM t3.**.**
ccb0: 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
ccc0: 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73 20  is parsed up as 
ccd0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
cce0: 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d     SELECT c FROM
ccf0: 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a   t3.**      |.**
cd00: 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53        `----->  S
cd10: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a  ELECT b FROM t2.
cd20: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
cd30: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
cd40: 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20        `------>  
cd50: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
cd60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77  .**.** The arrow
cd70: 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d  s in the diagram
cd80: 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74   above represent
cd90: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69   the Select.pPri
cda0: 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53  or pointer..** S
cdb0: 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
cdc0: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  e is called with
cdd0: 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20   p equal to the 
cde0: 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  t3 query, then.*
cdf0: 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65  * pPrior will be
ce00: 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20 20   the t2 query.  
ce10: 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b  p->op will be TK
ce20: 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63  _UNION in this c
ce30: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63  ase..**.** Notic
ce40: 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20 6f  e that because o
ce50: 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74 65  f the way SQLite
ce60: 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64   parses compound
ce70: 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a   SELECTs, the.**
ce80: 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65   individual sele
ce90: 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70  cts always group
cea0: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
ceb0: 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ght..*/.static i
cec0: 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a  nt multiSelect(.
ced0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
cee0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
cef0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
cf00: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
cf10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
cf20: 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
cf30: 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
cf40: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20  /.  int eDest,  
cf50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5c 5f 5f            /* \__
cf60: 5f 20 20 53 74 6f 72 65 20 71 75 65 72 79 20 72  _  Store query r
cf70: 65 73 75 6c 74 73 20 61 73 20 73 70 65 63 69 66  esults as specif
cf80: 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ied */.  int iPa
cf90: 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  rm,            /
cfa0: 2a 20 2f 20 20 20 20 20 62 79 20 74 68 65 73 65  * /     by these
cfb0: 20 74 77 6f 20 70 61 72 61 6d 65 74 65 72 73 2e   two parameters.
cfc0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 63 68           */.  ch
cfd0: 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20  ar *aff         
cfe0: 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20      /* If eDest 
cff0: 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68  is SRT_Union, th
d000: 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
d010: 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  g */.){.  int rc
d020: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
d030: 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20  /* Success code 
d040: 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e  from a subroutin
d050: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
d060: 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
d070: 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
d080: 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
d090: 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
d0a0: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
d0b0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
d0c0: 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
d0d0: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  */.  int nCol;  
d0e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
d0f0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
d100: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
d110: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
d120: 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20  *pOrderBy;   /* 
d130: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
d140: 75 73 65 20 6f 6e 20 70 20 2a 2f 0a 20 20 69 6e  use on p */.  in
d150: 74 20 61 53 65 74 50 32 5b 32 5d 3b 20 20 20 20  t aSetP2[2];    
d160: 20 20 20 20 2f 2a 20 53 65 74 20 50 32 20 76 61      /* Set P2 va
d170: 6c 75 65 20 6f 66 20 74 68 65 73 65 20 6f 70 20  lue of these op 
d180: 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  to number of col
d190: 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  umns */.  int nS
d1a0: 65 74 50 32 20 3d 20 30 3b 20 20 20 20 20 20 20  etP2 = 0;       
d1b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f  /* Number of slo
d1c0: 74 73 20 69 6e 20 61 53 65 74 50 32 5b 5d 20 75  ts in aSetP2[] u
d1d0: 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b  sed */..  /* Mak
d1e0: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
d1f0: 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  no ORDER BY or L
d200: 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70  IMIT clause on p
d210: 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f  rior SELECTs.  O
d220: 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73  nly.  ** the las
d230: 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53  t (right-most) S
d240: 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72  ELECT in the ser
d250: 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20  ies may have an 
d260: 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
d270: 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d  T..  */.  if( p=
d280: 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d  =0 || p->pPrior=
d290: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31  =0 ){.    rc = 1
d2a0: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
d2b0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
d2c0: 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
d2d0: 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
d2e0: 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d   pPrior->pRightm
d2f0: 6f 73 74 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20  ost!=pPrior );. 
d300: 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
d310: 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e  >pRightmost==p->
d320: 70 52 69 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20  pRightmost );.  
d330: 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  if( pPrior->pOrd
d340: 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
d350: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
d360: 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61  se,"ORDER BY cla
d370: 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
d380: 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
d390: 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
d3a0: 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
d3b0: 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
d3c0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
d3d0: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69  ect_end;.  }.  i
d3e0: 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  f( pPrior->pLimi
d3f0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
d400: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
d410: 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68  "LIMIT clause sh
d420: 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
d430: 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
d440: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
d450: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
d460: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
d470: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
d480: 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  d;.  }..  /* Mak
d490: 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
d4a0: 20 76 61 6c 69 64 20 71 75 65 72 79 20 65 6e 67   valid query eng
d4b0: 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72  ine.  If not, cr
d4c0: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a  eate a new one..
d4d0: 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
d4e0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
d4f0: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  );.  if( v==0 ){
d500: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
d510: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
d520: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
d530: 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73  * Create the des
d540: 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61  tination tempora
d550: 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65  ry table if nece
d560: 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28  ssary.  */.  if(
d570: 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65   eDest==SRT_Ephe
d580: 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  mTab ){.    asse
d590: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
d5a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 53 65  .    assert( nSe
d5b0: 74 50 32 3c 73 69 7a 65 6f 66 28 61 53 65 74 50  tP2<sizeof(aSetP
d5c0: 32 29 2f 73 69 7a 65 6f 66 28 61 53 65 74 50 32  2)/sizeof(aSetP2
d5d0: 5b 30 5d 29 20 29 3b 0a 20 20 20 20 61 53 65 74  [0]) );.    aSet
d5e0: 50 32 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d 20 73  P2[nSetP2++] = s
d5f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d600: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
d610: 72 61 6c 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  ral, iParm, 0);.
d620: 20 20 20 20 65 44 65 73 74 20 3d 20 53 52 54 5f      eDest = SRT_
d630: 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Table;.  }..  /*
d640: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
d650: 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  or the left and 
d660: 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61  right SELECT sta
d670: 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
d680: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
d690: 72 64 65 72 42 79 3b 0a 20 20 73 77 69 74 63 68  rderBy;.  switch
d6a0: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
d6b0: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20  ase TK_ALL: {.  
d6c0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
d6d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
d6e0: 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20  nt addr = 0;.   
d6f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
d700: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a  rior->pLimit );.
d710: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e          pPrior->
d720: 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
d730: 69 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69  it;.        pPri
d740: 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d  or->pOffset = p-
d750: 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
d760: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
d770: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
d780: 69 6f 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72  ior, eDest, iPar
d790: 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  m, 0, 0, 0, aff)
d7a0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69  ;.        p->pLi
d7b0: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mit = 0;.       
d7c0: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
d7d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
d7e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
d7f0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
d800: 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
d810: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
d820: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
d830: 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d  iLimit = pPrior-
d840: 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  >iLimit;.       
d850: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50   p->iOffset = pP
d860: 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  rior->iOffset;. 
d870: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c         if( p->iL
d880: 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  imit>=0 ){.     
d890: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
d8a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d8b0: 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 2d  OP_IfMemZero, p-
d8c0: 3e 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20  >iLimit, 0);.   
d8d0: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
d8e0: 6e 74 28 28 76 2c 20 22 23 20 4a 75 6d 70 20 61  nt((v, "# Jump a
d8f0: 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65  head if LIMIT re
d900: 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ached"));.      
d910: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
d920: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
d930: 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c  Parse, p, eDest,
d940: 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c   iParm, 0, 0, 0,
d950: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 70   aff);.        p
d960: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
d970: 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  r;.        if( r
d980: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
d990: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
d9a0: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
d9b0: 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72          if( addr
d9c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
d9d0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
d9e0: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
d9f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
da00: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
da10: 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e 20     /* For UNION 
da20: 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59  ALL ... ORDER BY
da30: 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
da40: 20 74 68 65 20 6e 65 78 74 20 63 61 73 65 20 2a   the next case *
da50: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  /.    }.    case
da60: 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20   TK_EXCEPT:.    
da70: 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b  case TK_UNION: {
da80: 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e  .      int union
da90: 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f  Tab;    /* Curso
daa0: 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
dab0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
dac0: 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a  holding result *
dad0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d  /.      int op =
dae0: 20 30 3b 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20   0;      /* One 
daf0: 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72  of the SRT_ oper
db00: 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20  ations to apply 
db10: 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20  to self */.     
db20: 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20   int priorOp;   
db30: 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70    /* The SRT_ op
db40: 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79  eration to apply
db50: 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74   to prior select
db60: 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  s */.      Expr 
db70: 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
db80: 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75  t; /* Saved valu
db90: 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20  es of p->nLimit 
dba0: 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a  and p->nOffset *
dbb0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
dbc0: 3b 0a 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70  ;..      priorOp
dbd0: 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c   = p->op==TK_ALL
dbe0: 20 3f 20 53 52 54 5f 54 61 62 6c 65 20 3a 20 53   ? SRT_Table : S
dbf0: 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
dc00: 69 66 28 20 65 44 65 73 74 3d 3d 70 72 69 6f 72  if( eDest==prior
dc10: 4f 70 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d  Op && pOrderBy==
dc20: 30 20 26 26 20 21 70 2d 3e 70 4c 69 6d 69 74 20  0 && !p->pLimit 
dc30: 26 26 20 21 70 2d 3e 70 4f 66 66 73 65 74 20 29  && !p->pOffset )
dc40: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
dc50: 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70  can reuse a temp
dc60: 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65  orary table gene
dc70: 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43  rated by a SELEC
dc80: 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20  T to our.       
dc90: 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20   ** right..     
dca0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
dcb0: 69 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a  ionTab = iParm;.
dcc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
dcd0: 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20       /* We will 
dce0: 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f  need to create o
dcf0: 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79  ur own temporary
dd00: 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74   table to hold t
dd10: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  he.        ** in
dd20: 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
dd30: 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ts..        */. 
dd40: 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
dd50: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
dd60: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
dd70: 72 64 65 72 42 79 20 26 26 20 6d 61 74 63 68 4f  rderBy && matchO
dd80: 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70  rderbyToColumn(p
dd90: 50 61 72 73 65 2c 20 70 2c 20 70 4f 72 64 65 72  Parse, p, pOrder
dda0: 42 79 2c 20 75 6e 69 6f 6e 54 61 62 2c 31 29 20  By, unionTab,1) 
ddb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
ddc0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67  = 1;.          g
ddd0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
dde0: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
ddf0: 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
de00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
de10: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
de20: 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  ral, unionTab, 0
de30: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
de40: 72 69 6f 72 4f 70 3d 3d 53 52 54 5f 54 61 62 6c  riorOp==SRT_Tabl
de50: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  e ){.          a
de60: 73 73 65 72 74 28 20 6e 53 65 74 50 32 3c 73 69  ssert( nSetP2<si
de70: 7a 65 6f 66 28 61 53 65 74 50 32 29 2f 73 69 7a  zeof(aSetP2)/siz
de80: 65 6f 66 28 61 53 65 74 50 32 5b 30 5d 29 20 29  eof(aSetP2[0]) )
de90: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 53 65 74  ;.          aSet
dea0: 50 32 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d 20 61  P2[nSetP2++] = a
deb0: 64 64 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ddr;.        }el
dec0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
ded0: 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
dee0: 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
def0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  ;.          p->a
df00: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
df10: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 20   addr;.         
df20: 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e   p->pRightmost->
df30: 75 73 65 73 45 70 68 6d 20 3d 20 31 3b 0a 20 20  usesEphm = 1;.  
df40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
df50: 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64  createSortingInd
df60: 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f  ex(pParse, p, pO
df70: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20  rderBy);.       
df80: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
df90: 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  st );.      }.. 
dfa0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
dfb0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
dfc0: 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20  ts to our left. 
dfd0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
dfe0: 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
dff0: 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20  OrderBy );.     
e000: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
e010: 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
e020: 6f 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69  or, priorOp, uni
e030: 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20  onTab, 0, 0, 0, 
e040: 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  aff);.      if( 
e050: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
e060: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
e070: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
e080: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
e090: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73  current SELECT s
e0a0: 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a  tatement.      *
e0b0: 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  /.      switch( 
e0c0: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20  p->op ){.       
e0d0: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
e0e0: 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65  :  op = SRT_Exce
e0f0: 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  pt;   break;.   
e100: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e        case TK_UN
e110: 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f  ION:   op = SRT_
e120: 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b  Union;    break;
e130: 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54  .         case T
e140: 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20  K_ALL:     op = 
e150: 53 52 54 5f 54 61 62 6c 65 3b 20 20 20 20 62 72  SRT_Table;    br
e160: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
e170: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
e180: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65  ;.      p->pOrde
e190: 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rBy = 0;.      p
e1a0: 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42  ->disallowOrderB
e1b0: 79 20 3d 20 70 4f 72 64 65 72 42 79 21 3d 30 3b  y = pOrderBy!=0;
e1c0: 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
e1d0: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
e1e0: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
e1f0: 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
e200: 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
e210: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
e220: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
e230: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
e240: 65 2c 20 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e 54  e, p, op, unionT
e250: 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  ab, 0, 0, 0, aff
e260: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
e270: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
e280: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
e290: 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20   pOrderBy;.     
e2a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
e2b0: 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  te(p->pLimit);. 
e2c0: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
e2d0: 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
e2e0: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
e2f0: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  set;.      p->iL
e300: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  imit = -1;.     
e310: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31   p->iOffset = -1
e320: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
e330: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
e340: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
e350: 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20  .      }...     
e360: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
e370: 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
e380: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
e390: 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
e3a0: 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68       ** it is th
e3b0: 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20  at we currently 
e3c0: 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20  need..      */  
e3d0: 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 65      .      if( e
e3e0: 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c  Dest!=priorOp ||
e3f0: 20 75 6e 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d   unionTab!=iParm
e400: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
e410: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
e420: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Start;.        a
e430: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
e440: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
e450: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
e460: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ack ){.         
e470: 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
e480: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77  = p;.          w
e490: 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
e4a0: 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
e4b0: 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
e4c0: 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61            genera
e4d0: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
e4e0: 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d  arse, 0, pFirst-
e4f0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
e500: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65    }.        iBre
e510: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
e520: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
e530: 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
e540: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
e550: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63  el(v);.        c
e560: 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
e570: 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
e580: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
e590: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e5a0: 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  p(v, OP_Rewind, 
e5b0: 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b  unionTab, iBreak
e5c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  );.        iStar
e5d0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
e5e0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
e5f0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65         rc = sele
e600: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
e610: 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
e620: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70  , unionTab, p->p
e630: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
e640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e650: 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65             pOrde
e660: 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  rBy, -1, eDest, 
e670: 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20  iParm, .        
e680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e690: 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65       iCont, iBre
e6a0: 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ak, 0);.        
e6b0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
e6c0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
e6d0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
e6e0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
e6f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
e700: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
e710: 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
e720: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
e730: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
e740: 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  _Next, unionTab,
e750: 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   iStart);.      
e760: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
e770: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
e780: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
e790: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
e7a0: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f  , OP_Close, unio
e7b0: 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
e7c0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
e7d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
e7e0: 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20 20  _INTERSECT: {.  
e7f0: 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
e800: 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b2;.      int iC
e810: 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
e820: 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  art;.      Expr 
e830: 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
e840: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
e850: 72 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54  r;..      /* INT
e860: 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72  ERSECT is differ
e870: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  ent from the oth
e880: 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71  ers since it req
e890: 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74  uires.      ** t
e8a0: 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wo temporary tab
e8b0: 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68  les.  Hence it h
e8c0: 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e  as its own case.
e8d0: 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a    Begin.      **
e8e0: 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74   by allocating t
e8f0: 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c  he tables we wil
e900: 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  l need..      */
e910: 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50  .      tab1 = pP
e920: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
e930: 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73      tab2 = pPars
e940: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
e950: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26   if( pOrderBy &&
e960: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
e970: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70  olumn(pParse,p,p
e980: 4f 72 64 65 72 42 79 2c 74 61 62 31 2c 31 29 20  OrderBy,tab1,1) 
e990: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
e9a0: 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
e9b0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
e9c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e9d0: 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64  createSortingInd
e9e0: 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f  ex(pParse, p, pO
e9f0: 72 64 65 72 42 79 29 3b 0a 0a 20 20 20 20 20 20  rderBy);..      
ea00: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
ea10: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
ea20: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62  enEphemeral, tab
ea30: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  1, 0);.      ass
ea40: 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
ea50: 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[0] == -1 );
ea60: 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
ea70: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72  enEphm[0] = addr
ea80: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68  ;.      p->pRigh
ea90: 74 6d 6f 73 74 2d 3e 75 73 65 73 45 70 68 6d 20  tmost->usesEphm 
eaa0: 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 1;.      asser
eab0: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
eac0: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
ead0: 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75  he SELECTs to ou
eae0: 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70  r left into temp
eaf0: 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
eb00: 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  1"..      */.   
eb10: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
eb20: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
eb30: 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c  rior, SRT_Union,
eb40: 20 74 61 62 31 2c 20 30 2c 20 30 2c 20 30 2c 20   tab1, 0, 0, 0, 
eb50: 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  aff);.      if( 
eb60: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
eb70: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
eb80: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
eb90: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
eba0: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
ebb0: 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
ebc0: 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20  ble "tab2".     
ebd0: 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d   */.      addr =
ebe0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ebf0: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  p(v, OP_OpenEphe
ec00: 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b  meral, tab2, 0);
ec10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
ec20: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
ec30: 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
ec40: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
ec50: 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [1] = addr;.    
ec60: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
ec70: 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
ec80: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
ec90: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
eca0: 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
ecb0: 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
ecc0: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
ecd0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
ece0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
ecf0: 65 2c 20 70 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c  e, p, SRT_Union,
ed00: 20 74 61 62 32 2c 20 30 2c 20 30 2c 20 30 2c 20   tab2, 0, 0, 0, 
ed10: 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  aff);.      p->p
ed20: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
ed30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ed40: 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69  rDelete(p->pLimi
ed50: 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
ed60: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
ed70: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
ed80: 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20   pOffset;.      
ed90: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
eda0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
edb0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
edc0: 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
edd0: 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65  ate code to take
ede0: 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f   the intersectio
edf0: 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d  n of the two tem
ee00: 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20  porary.      ** 
ee10: 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f  tables..      */
ee20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
ee30: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
ee40: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
ee50: 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
ee60: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
ee70: 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
ee80: 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e   while( pFirst->
ee90: 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20  pPrior ) pFirst 
eea0: 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  = pFirst->pPrior
eeb0: 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61  ;.        genera
eec0: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
eed0: 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d  arse, 0, pFirst-
eee0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
eef0: 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d  }.      iBreak =
ef00: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
ef10: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
ef20: 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
ef30: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
ef40: 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69  .      computeLi
ef50: 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
ef60: 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
ef70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ef80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
ef90: 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65  wind, tab1, iBre
efa0: 61 6b 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72  ak);.      iStar
efb0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
efc0: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 4b 65  ddOp(v, OP_RowKe
efd0: 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  y, tab1, 0);.   
efe0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
eff0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  dOp(v, OP_NotFou
f000: 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 29  nd, tab2, iCont)
f010: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c  ;.      rc = sel
f020: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
f030: 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
f040: 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69  t, tab1, p->pELi
f050: 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  st->nExpr,.     
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f070: 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
f080: 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61  , -1, eDest, iPa
f090: 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rm, .           
f0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0b0: 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c    iCont, iBreak,
f0c0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
f0d0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  c ){.        rc 
f0e0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
f0f0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
f100: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
f110: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
f120: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
f130: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
f140: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f150: 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53  P_Next, tab1, iS
f160: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  tart);.      sql
f170: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
f180: 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
f190: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f1a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
f1b0: 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ose, tab2, 0);. 
f1c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f1d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
f1e0: 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  e, tab1, 0);.   
f1f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f200: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
f210: 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
f220: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
f230: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
f240: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
f250: 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
f260: 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
f270: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
f280: 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
f290: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28  >pEList );.  if(
f2a0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
f2b0: 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r!=pPrior->pELis
f2c0: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
f2d0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f2e0: 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73  pParse, "SELECTs
f2f0: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
f300: 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20   right of %s".  
f310: 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76      " do not hav
f320: 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
f330: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
f340: 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  mns", selectOpNa
f350: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
f360: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
f370: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
f380: 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  d;.  }..  /* Set
f390: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
f3a0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 65 6d 70 6f 72  olumns in tempor
f3b0: 61 72 79 20 74 61 62 6c 65 73 0a 20 20 2a 2f 0a  ary tables.  */.
f3c0: 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69    nCol = p->pELi
f3d0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 77 68 69  st->nExpr;.  whi
f3e0: 6c 65 28 20 6e 53 65 74 50 32 20 29 7b 0a 20 20  le( nSetP2 ){.  
f3f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
f400: 6e 67 65 50 32 28 76 2c 20 61 53 65 74 50 32 5b  ngeP2(v, aSetP2[
f410: 2d 2d 6e 53 65 74 50 32 5d 2c 20 6e 43 6f 6c 29  --nSetP2], nCol)
f420: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
f430: 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ute collating se
f440: 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20  quences used by 
f450: 65 69 74 68 65 72 20 74 68 65 20 4f 52 44 45 52  either the ORDER
f460: 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 20 20   BY clause or.  
f470: 2a 2a 20 62 79 20 61 6e 79 20 74 65 6d 70 6f 72  ** by any tempor
f480: 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65  ary tables neede
f490: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
f4a0: 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
f4b0: 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20  ct..  ** Attach 
f4c0: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
f4d0: 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d  cture to all tem
f4e0: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
f4f0: 49 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20  Invoke the.  ** 
f500: 4f 52 44 45 52 20 42 59 20 70 72 6f 63 65 73 73  ORDER BY process
f510: 69 6e 67 20 69 66 20 74 68 65 72 65 20 69 73 20  ing if there is 
f520: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
f530: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  se..  **.  ** Th
f540: 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75  is section is ru
f550: 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d  n by the right-m
f560: 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
f570: 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20  ment only..  ** 
f580: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
f590: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c  s to the left al
f5a0: 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70  ways skip this p
f5b0: 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d  art.  The right-
f5c0: 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54  most.  ** SELECT
f5d0: 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70   might also skip
f5e0: 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74   this part if it
f5f0: 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59   has no ORDER BY
f600: 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a   clause and.  **
f610: 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20   no temp tables 
f620: 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20  are required..  
f630: 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
f640: 79 20 7c 7c 20 70 2d 3e 75 73 65 73 45 70 68 6d  y || p->usesEphm
f650: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20   ){.    int i;  
f660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f670: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
f680: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79  unter */.    Key
f690: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
f6a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
f6b0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
f6c0: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20   for the result 
f6d0: 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63  set */.    Selec
f6e0: 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  t *pLoop;       
f6f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
f700: 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
f710: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
f720: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65  s */.    int nKe
f730: 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  yCol;           
f740: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
f750: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70   of entries in p
f760: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  KeyInfo->aCol[] 
f770: 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  */.    CollSeq *
f780: 2a 61 70 43 6f 6c 6c 3b 0a 20 20 20 20 43 6f 6c  *apColl;.    Col
f790: 6c 53 65 71 20 2a 2a 61 43 6f 70 79 3b 0a 0a 20  lSeq **aCopy;.. 
f7a0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
f7b0: 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20  ightmost==p );. 
f7c0: 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f     nKeyCol = nCo
f7d0: 6c 20 2b 20 28 70 4f 72 64 65 72 42 79 20 3f 20  l + (pOrderBy ? 
f7e0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
f7f0: 3a 20 30 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e  : 0);.    pKeyIn
f800: 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  fo = sqliteMallo
f810: 63 28 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e  c(sizeof(*pKeyIn
f820: 66 6f 29 2b 6e 4b 65 79 43 6f 6c 2a 28 73 69 7a  fo)+nKeyCol*(siz
f830: 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20  eof(CollSeq*) + 
f840: 31 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b  1));.    if( !pK
f850: 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
f860: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
f870: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  M;.      goto mu
f880: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
f890: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49      }..    pKeyI
f8a0: 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 70  nfo->enc = ENC(p
f8b0: 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20  Parse->db);.    
f8c0: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
f8d0: 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f   = nCol;..    fo
f8e0: 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b  r(i=0, apColl=pK
f8f0: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69  eyInfo->aColl; i
f900: 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f  <nCol; i++, apCo
f910: 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70  ll++){.      *ap
f920: 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
f930: 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
f940: 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , p, i);.      i
f950: 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b  f( 0==*apColl ){
f960: 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  .        *apColl
f970: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
f980: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
f990: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  }.    }..    for
f9a0: 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b  (pLoop=p; pLoop;
f9b0: 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50   pLoop=pLoop->pP
f9c0: 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72  rior){.      for
f9d0: 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b  (i=0; i<2; i++){
f9e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
f9f0: 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f  r = pLoop->addrO
fa00: 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20  penEphm[i];.    
fa10: 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 29      if( addr<0 )
fa20: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
fa30: 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20  f [0] is unused 
fa40: 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f  then [1] is also
fa50: 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20   unused.  So we 
fa60: 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  can.          **
fa70: 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61   always safely a
fa80: 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20  bort as soon as 
fa90: 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65 64  the first unused
faa0: 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a   slot is found *
fab0: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
fac0: 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f  rt( pLoop->addrO
fad0: 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a  penEphm[1]<0 );.
fae0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
faf0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
fb00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
fb10: 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20  angeP2(v, addr, 
fb20: 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
fb30: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
fb40: 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61  P3(v, addr, (cha
fb50: 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f  r*)pKeyInfo, P3_
fb60: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
fb70: 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65    pLoop->addrOpe
fb80: 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20  nEphm[i] = -1;. 
fb90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
fba0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
fbb0: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
fbc0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f  xprList_item *pO
fbd0: 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d  Term = pOrderBy-
fbe0: 3e 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f  >a;.      int nO
fbf0: 72 64 65 72 42 79 45 78 70 72 20 3d 20 70 4f 72  rderByExpr = pOr
fc00: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
fc10: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
fc20: 20 20 20 20 75 38 20 2a 70 53 6f 72 74 4f 72 64      u8 *pSortOrd
fc30: 65 72 3b 0a 0a 20 20 20 20 20 20 61 43 6f 70 79  er;..      aCopy
fc40: 20 3d 20 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43   = &pKeyInfo->aC
fc50: 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 45 78 70 72  oll[nOrderByExpr
fc60: 5d 3b 0a 20 20 20 20 20 20 70 53 6f 72 74 4f 72  ];.      pSortOr
fc70: 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  der = pKeyInfo->
fc80: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
fc90: 2a 29 26 61 43 6f 70 79 5b 6e 43 6f 6c 5d 3b 0a  *)&aCopy[nCol];.
fca0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 43 6f        memcpy(aCo
fcb0: 70 79 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  py, pKeyInfo->aC
fcc0: 6f 6c 6c 2c 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66  oll, nCol*sizeof
fcd0: 28 43 6f 6c 6c 53 65 71 2a 29 29 3b 0a 20 20 20  (CollSeq*));.   
fce0: 20 20 20 61 70 43 6f 6c 6c 20 3d 20 70 4b 65 79     apColl = pKey
fcf0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 0a 20 20 20  Info->aColl;.   
fd00: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
fd10: 72 64 65 72 42 79 45 78 70 72 3b 20 69 2b 2b 2c  rderByExpr; i++,
fd20: 20 70 4f 54 65 72 6d 2b 2b 2c 20 61 70 43 6f 6c   pOTerm++, apCol
fd30: 6c 2b 2b 2c 20 70 53 6f 72 74 4f 72 64 65 72 2b  l++, pSortOrder+
fd40: 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
fd50: 20 2a 70 45 78 70 72 20 3d 20 70 4f 54 65 72 6d   *pExpr = pOTerm
fd60: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
fd70: 20 69 66 28 20 28 70 45 78 70 72 2d 3e 66 6c 61   if( (pExpr->fla
fd80: 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
fd90: 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  te) ){.         
fda0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
fdb0: 70 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 20 20  pColl!=0 );.    
fdc0: 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
fdd0: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20  pExpr->pColl;.  
fde0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fdf0: 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
fe00: 20 61 43 6f 70 79 5b 70 45 78 70 72 2d 3e 69 43   aCopy[pExpr->iC
fe10: 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20 20 20 20  olumn];.        
fe20: 7d 0a 20 20 20 20 20 20 20 20 2a 70 53 6f 72 74  }.        *pSort
fe30: 4f 72 64 65 72 20 3d 20 70 4f 54 65 72 6d 2d 3e  Order = pOTerm->
fe40: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  sortOrder;.     
fe50: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
fe60: 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d   p->pRightmost==
fe70: 70 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  p );.      asser
fe80: 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
fe90: 68 6d 5b 32 5d 3e 3d 30 20 29 3b 0a 20 20 20 20  hm[2]>=0 );.    
fea0: 20 20 61 64 64 72 20 3d 20 70 2d 3e 61 64 64 72    addr = p->addr
feb0: 4f 70 65 6e 45 70 68 6d 5b 32 5d 3b 0a 20 20 20  OpenEphm[2];.   
fec0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
fed0: 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20  angeP2(v, addr, 
fee0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
fef0: 2b 32 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  +2);.      pKeyI
ff00: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 4f  nfo->nField = nO
ff10: 72 64 65 72 42 79 45 78 70 72 3b 0a 20 20 20 20  rderByExpr;.    
ff20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
ff30: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28  ngeP3(v, addr, (
ff40: 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
ff50: 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
ff60: 46 46 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  FF);.      pKeyI
ff70: 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 67  nfo = 0;.      g
ff80: 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
ff90: 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 2d  pParse, p, v, p-
ffa0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
ffb0: 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20  eDest, iParm);. 
ffc0: 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
ffd0: 46 72 65 65 28 70 4b 65 79 49 6e 66 6f 29 3b 0a  Free(pKeyInfo);.
ffe0: 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63    }..multi_selec
fff0: 74 5f 65 6e 64 3a 0a 20 20 72 65 74 75 72 6e 20  t_end:.  return 
10000 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
10010 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
10020 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
10030 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10040 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 53  MIT_VIEW./*.** S
10050 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
10060 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
10070 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79  .  Replace every
10080 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a   reference to.**
10090 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62   a column in tab
100a0 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65  le number iTable
100b0 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
100c0 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a  the iColumn-th.*
100d0 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73  * entry in pELis
100e0 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72  t.  (But leave r
100f0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
10100 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a   ROWID column .*
10110 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a  * unchanged.).**
10120 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10130 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
10140 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65  flattening proce
10150 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72  dure.  A subquer
10160 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c  y.** whose resul
10170 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  t set is defined
10180 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61   by pEList appea
10190 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74  rs as entry in t
101a0 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  he.** FROM claus
101b0 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75  e of a SELECT su
101c0 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45  ch that the VDBE
101d0 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64   cursor assigned
101e0 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d   to that.** FORM
101f0 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73   clause entry is
10200 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72   iTable.  This r
10210 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20  outine make the 
10220 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68  necessary .** ch
10230 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73  anges to pExpr s
10240 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73  o that it refers
10250 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
10260 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a   source table.**
10270 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
10280 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75   rather the resu
10290 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75  lt set of the su
102a0 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  bquery..*/.stati
102b0 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
102c0 4c 69 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 69  List(ExprList*,i
102d0 6e 74 2c 45 78 70 72 4c 69 73 74 2a 29 3b 20 20  nt,ExprList*);  
102e0 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20  /* Forward Decl 
102f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
10300 75 62 73 74 53 65 6c 65 63 74 28 53 65 6c 65 63  ubstSelect(Selec
10310 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  t *, int, ExprLi
10320 73 74 20 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61  st *);  /* Forwa
10330 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69  rd Decl */.stati
10340 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
10350 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e  (Expr *pExpr, in
10360 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69  t iTable, ExprLi
10370 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69  st *pEList){.  i
10380 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
10390 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70  turn;.  if( pExp
103a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
103b0 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
103c0 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  e==iTable ){.   
103d0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
103e0 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  umn<0 ){.      p
103f0 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55  Expr->op = TK_NU
10400 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
10410 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
10420 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10430 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70  EList!=0 && pExp
10440 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73  r->iColumn<pELis
10450 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
10460 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
10470 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
10480 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26  pr->pRight==0 &&
10490 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
104a0 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   );.      pNew =
104b0 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72   pEList->a[pExpr
104c0 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
104d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
104e0 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20  pNew!=0 );.     
104f0 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65   pExpr->op = pNe
10500 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73 73  w->op;.      ass
10510 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
10520 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45  t==0 );.      pE
10530 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  xpr->pLeft = sql
10540 69 74 65 33 45 78 70 72 44 75 70 28 70 4e 65 77  ite3ExprDup(pNew
10550 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
10560 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
10570 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
10580 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
10590 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
105a0 28 70 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a  (pNew->pRight);.
105b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
105c0 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b  xpr->pList==0 );
105d0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  .      pExpr->pL
105e0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
105f0 72 4c 69 73 74 44 75 70 28 70 4e 65 77 2d 3e 70  rListDup(pNew->p
10600 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 45 78  List);.      pEx
10610 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65  pr->iTable = pNe
10620 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  w->iTable;.     
10630 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70   pExpr->pTab = p
10640 4e 65 77 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  New->pTab;.     
10650 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
10660 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b  = pNew->iColumn;
10670 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41  .      pExpr->iA
10680 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b  gg = pNew->iAgg;
10690 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f  .      sqlite3To
106a0 6b 65 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e  kenCopy(&pExpr->
106b0 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f  token, &pNew->to
106c0 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ken);.      sqli
106d0 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45  te3TokenCopy(&pE
106e0 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77  xpr->span, &pNew
106f0 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 70  ->span);.      p
10700 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20  Expr->pSelect = 
10710 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
10720 28 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 29 3b  (pNew->pSelect);
10730 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c  .      pExpr->fl
10740 61 67 73 20 3d 20 70 4e 65 77 2d 3e 66 6c 61 67  ags = pNew->flag
10750 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  s;.    }.  }else
10760 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  {.    substExpr(
10770 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54  pExpr->pLeft, iT
10780 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
10790 20 20 20 73 75 62 73 74 45 78 70 72 28 70 45 78     substExpr(pEx
107a0 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62  pr->pRight, iTab
107b0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
107c0 20 73 75 62 73 74 53 65 6c 65 63 74 28 70 45 78   substSelect(pEx
107d0 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61  pr->pSelect, iTa
107e0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
107f0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
10800 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54  pExpr->pList, iT
10810 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
10820 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
10830 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 45   substExprList(E
10840 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
10850 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72  int iTable, Expr
10860 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20  List *pEList){. 
10870 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
10880 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
10890 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
108a0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
108b0 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  {.    substExpr(
108c0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
108d0 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
108e0 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
108f0 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
10900 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  t(Select *p, int
10910 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73   iTable, ExprLis
10920 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 66  t *pEList){.  if
10930 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !p ) return;. 
10940 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
10950 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65  ->pEList, iTable
10960 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
10970 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47  stExprList(p->pG
10980 72 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20  roupBy, iTable, 
10990 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
109a0 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64  ExprList(p->pOrd
109b0 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45  erBy, iTable, pE
109c0 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78  List);.  substEx
109d0 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69  pr(p->pHaving, i
109e0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
109f0 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
10a00 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70  Where, iTable, p
10a10 45 4c 69 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  EList);.}.#endif
10a20 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
10a30 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
10a40 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
10a50 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
10a60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
10a70 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
10a80 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  en subqueries in
10a90 20 6f 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a   order to speed.
10aa0 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49  ** execution.  I
10ab0 74 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69  t returns 1 if i
10ac0 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20  t makes changes 
10ad0 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74  and 0 if no flat
10ae0 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73  tening.** occurs
10af0 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72  ..**.** To under
10b00 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70  stand the concep
10b10 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c  t of flattening,
10b20 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f   consider the fo
10b30 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79  llowing.** query
10b40 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
10b50 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT a FROM (SELEC
10b60 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
10b70 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20  t1 WHERE z<100) 
10b80 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  WHERE a>5.**.** 
10b90 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79 20  The default way 
10ba0 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  of implementing 
10bb0 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74 6f  this query is to
10bc0 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20   execute the.** 
10bd0 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20 61  subquery first a
10be0 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
10bf0 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72  ults in a tempor
10c00 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a  ary table, then.
10c10 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72  ** run the outer
10c20 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74   query on that t
10c30 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
10c40 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20 74   This requires t
10c50 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65  wo.** passes ove
10c60 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75 72  r the data.  Fur
10c70 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73  thermore, becaus
10c80 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
10c90 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20  table.** has no 
10ca0 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48 45  indices, the WHE
10cb0 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  RE clause on the
10cc0 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e   outer query can
10cd0 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69  not be.** optimi
10ce0 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  zed..**.** This 
10cf0 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
10d00 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65 72   to rewrite quer
10d10 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65 20  ies such as the 
10d20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20  above into.** a 
10d30 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65  single flat sele
10d40 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ct, like this:.*
10d50 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
10d60 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
10d70 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44   WHERE z<100 AND
10d80 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   a>5.**.** The c
10d90 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f  ode generated fo
10da0 72 20 74 68 69 73 20 73 69 6d 70 69 66 69 63 61  r this simpifica
10db0 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73  tion gives the s
10dc0 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75  ame result.** bu
10dd0 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63  t only has to sc
10de0 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65  an the data once
10df0 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69  .  And because i
10e00 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a  ndices might .**
10e10 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61   exist on the ta
10e20 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65  ble t1, a comple
10e30 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64  te scan of the d
10e40 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  ata might be.** 
10e50 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  avoided..**.** F
10e60 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c  lattening is onl
10e70 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61  y attempted if a
10e80 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
10e90 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
10ea0 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73  .**   (1)  The s
10eb0 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
10ec0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
10ed0 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67 67 72  ot both use aggr
10ee0 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  egates..**.**   
10ef0 28 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (2)  The subquer
10f00 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
10f10 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74  egate or the out
10f20 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
10f30 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
10f40 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (3)  The subquer
10f50 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67  y is not the rig
10f60 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
10f70 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c  left outer join,
10f80 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 74 68   or.**        th
10f90 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
10fa0 74 20 69 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e  t itself a join.
10fb0 20 20 28 54 69 63 6b 65 74 20 23 33 30 36 29 0a    (Ticket #306).
10fc0 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65  **.**   (4)  The
10fd0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
10fe0 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65   DISTINCT or the
10ff0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
11000 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
11010 2a 20 20 20 28 35 29 20 20 54 68 65 20 73 75 62  *   (5)  The sub
11020 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53  query is not DIS
11030 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74  TINCT or the out
11040 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
11050 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
11060 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
11070 2a 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62  *   (6)  The sub
11080 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
11090 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
110a0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
110b0 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20   is not.**      
110c0 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a    DISTINCT..**.*
110d0 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62  *   (7)  The sub
110e0 71 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d  query has a FROM
110f0 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
11100 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65   (8)  The subque
11110 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
11120 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
11130 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
11140 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
11150 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (9)  The subquer
11160 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
11170 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
11180 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
11190 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
111a0 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
111b0 20 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71    (10)  The subq
111c0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
111d0 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
111e0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
111f0 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  does not.**     
11200 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a     use LIMIT..**
11210 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73  .**  (11)  The s
11220 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
11230 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
11240 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44  ot both have ORD
11250 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a  ER BY clauses..*
11260 2a 0a 2a 2a 20 20 28 31 32 29 20 20 54 68 65 20  *.**  (12)  The 
11270 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
11280 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f  the right term o
11290 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
112a0 4f 49 4e 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20  OIN or the.**   
112b0 20 20 20 20 20 73 75 62 71 75 65 72 79 20 68 61       subquery ha
112c0 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
112d0 65 2e 20 20 28 61 64 64 65 64 20 62 79 20 74 69  e.  (added by ti
112e0 63 6b 65 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a  cket #350).**.**
112f0 20 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71    (13)  The subq
11300 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71  uery and outer q
11310 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
11320 20 75 73 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a   use LIMIT.**.**
11330 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71    (14)  The subq
11340 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
11350 65 20 4f 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20 49  e OFFSET.**.** I
11360 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  n this routine, 
11370 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  the "p" paramete
11380 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
11390 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
113a0 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65  y..** The subque
113b0 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61  ry is p->pSrc->a
113c0 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20  [iFrom].  isAgg 
113d0 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
113e0 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73  uter query.** us
113f0 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e  es aggregates an
11400 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  d subqueryIsAgg 
11410 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73  is true if the s
11420 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
11430 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  regates..**.** I
11440 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
11450 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74  not attempted, t
11460 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
11470 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72   no-op and retur
11480 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74  ns 0..** If flat
11490 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70  tening is attemp
114a0 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ted this routine
114b0 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a   returns 1..**.*
114c0 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70  * All of the exp
114d0 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
114e0 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62   must occur on b
114f0 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75  oth the outer qu
11500 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ery and.** the s
11510 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74  ubquery before t
11520 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
11530 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11540 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
11550 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
11560 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
11570 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53  arent or outer S
11580 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
11590 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
115a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
115b0 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61  ex in p->pSrc->a
115c0 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  [] of the inner 
115d0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
115e0 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20  t isAgg,        
115f0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75     /* True if ou
11600 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20  ter SELECT uses 
11610 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
11620 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62  ons */.  int sub
11630 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a  queryIsAgg    /*
11640 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62   True if the sub
11650 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
11660 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
11670 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
11680 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Sub;       /* Th
11690 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72  e inner query or
116a0 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20   "subquery" */. 
116b0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
116c0 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
116d0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
116e0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
116f0 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63  SrcList *pSubSrc
11700 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
11710 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
11720 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72  bquery */.  Expr
11730 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
11740 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
11750 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  t of the outer q
11760 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50  uery */.  int iP
11770 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  arent;        /*
11780 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
11790 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20  ber of the pSub 
117a0 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20  result set temp 
117b0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
117c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
117d0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
117e0 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
117f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11800 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
11810 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
11820 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
11830 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f  m *pSubitem;   /
11840 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 2a  * The subquery *
11850 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  /..  /* Check to
11860 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69   see if flatteni
11870 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
11880 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
11890 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d  t..  */.  if( p=
118a0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
118b0 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
118c0 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
118d0 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69  && iFrom>=0 && i
118e0 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20  From<pSrc->nSrc 
118f0 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20  );.  pSubitem = 
11900 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b  &pSrc->a[iFrom];
11910 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
11920 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
11930 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
11940 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  ;.  if( isAgg &&
11950 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
11960 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
11970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
11980 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a  striction (1)  *
11990 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  /.  if( subquery
119a0 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e  IsAgg && pSrc->n
119b0 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30  Src>1 ) return 0
119c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
119d0 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a  striction (2)  *
119e0 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  /.  pSubSrc = pS
119f0 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
11a00 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
11a10 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72   /* Prior to ver
11a20 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e  sion 3.1.2, when
11a30 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
11a40 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70  T had to be simp
11a50 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20  le constants,.  
11a60 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79  ** not arbitrary
11a70 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77   expresssions, w
11a80 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
11a90 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
11aa0 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
11ab0 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
11ac0 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
11ad0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
11ae0 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
11af0 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
11b00 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
11b10 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
11b20 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
11b30 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
11b40 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
11b50 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
11b60 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
11b70 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
11b80 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
11b90 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
11ba0 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
11bb0 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20  pSub->pOffset ) 
11bc0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
11bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11be0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
11bf0 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
11c00 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  pSubSrc->nSrc==0
11c10 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
11c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c30 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
11c40 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (7)  */.  if( 
11c50 28 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63  (pSub->isDistinc
11c60 74 20 7c 7c 20 70 53 75 62 2d 3e 70 4c 69 6d 69  t || pSub->pLimi
11c70 74 29 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  t) .         && 
11c80 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c  (pSrc->nSrc>1 ||
11c90 20 69 73 41 67 67 29 20 29 7b 20 20 20 20 20 20   isAgg) ){      
11ca0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
11cb0 6f 6e 73 20 28 34 29 28 35 29 28 38 29 28 39 29  ons (4)(5)(8)(9)
11cc0 20 2a 2f 0a 20 20 20 20 20 72 65 74 75 72 6e 20   */.     return 
11cd0 30 3b 20 20 20 20 20 20 20 0a 20 20 7d 0a 20 20  0;       .  }.  
11ce0 69 66 28 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  if( p->isDistinc
11cf0 74 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41  t && subqueryIsA
11d00 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  gg ) return 0;  
11d10 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
11d20 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20  ction (6)  */.  
11d30 69 66 28 20 28 70 2d 3e 64 69 73 61 6c 6c 6f 77  if( (p->disallow
11d40 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e 70 4f  OrderBy || p->pO
11d50 72 64 65 72 42 79 29 20 26 26 20 70 53 75 62 2d  rderBy) && pSub-
11d60 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
11d70 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
11d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11da0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
11db0 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d  tion (11) */.  }
11dc0 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  ..  /* Restricti
11dd0 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75  on 3:  If the su
11de0 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e  bquery is a join
11df0 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
11e00 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a  subquery is .  *
11e10 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68  * not used as th
11e20 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
11e30 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  of an outer join
11e40 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77  .  Examples of w
11e50 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20  hy this.  ** is 
11e60 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
11e70 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
11e80 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
11e90 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20  N (t2 JOIN t3). 
11ea0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
11eb0 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
11ec0 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
11ed0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
11ee0 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
11ef0 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33  JOIN t2) JOIN t3
11f00 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68  .  **.  ** which
11f10 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74   is not at all t
11f20 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20  he same thing.. 
11f30 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 53 72   */.  if( pSubSr
11f40 63 2d 3e 6e 53 72 63 3e 31 20 26 26 20 28 70 53  c->nSrc>1 && (pS
11f50 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ubitem->jointype
11f60 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
11f70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
11f80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72  .  }..  /* Restr
11f90 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74  iction 12:  If t
11fa0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74  he subquery is t
11fb0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
11fc0 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
11fd0 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65  .  ** join, make
11fe0 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
11ff0 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20  ry has no WHERE 
12000 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20  clause..  ** An 
12010 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  examples of why 
12020 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  this is not allo
12030 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
12040 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
12050 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43  UTER JOIN (SELEC
12060 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T * FROM t2 WHER
12070 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20  E t2.x>0).  **. 
12080 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
12090 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
120a0 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
120b0 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
120c0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
120d0 74 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30  t2) WHERE t2.x>0
120e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74  .  **.  ** But t
120f0 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77  he t2.x>0 test w
12100 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20  ill always fail 
12110 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66  on a NULL row of
12120 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20   t2, which.  ** 
12130 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76  effectively conv
12140 65 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a  erts the OUTER J
12150 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45  OIN into an INNE
12160 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69  R JOIN..  */.  i
12170 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f  f( (pSubitem->jo
12180 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
12190 52 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70  R)!=0 && pSub->p
121a0 57 68 65 72 65 21 3d 30 20 29 7b 0a 20 20 20 20  Where!=0 ){.    
121b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
121c0 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
121d0 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
121e0 65 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67 20  eans flattening 
121f0 69 73 20 70 65 72 6d 69 74 74 65 64 20 66 6f 72  is permitted for
12200 20 74 68 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d   the.  ** iFrom-
12210 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  th entry of the 
12220 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
12230 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
12240 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20    */..  /* Move 
12250 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
12260 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
12270 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
12280 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
12290 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
122a0 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
122b0 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
122c0 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
122d0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
122e0 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
122f0 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
12300 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
12310 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
12320 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
12330 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
12340 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
12350 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
12360 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
12370 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
12380 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
12390 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
123a0 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
123b0 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
123c0 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
123d0 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
123e0 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
123f0 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
12400 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50  ng in..  */.  iP
12410 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d  arent = pSubitem
12420 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20  ->iCursor;.  {. 
12430 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 20 3d     int nSubSrc =
12440 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a   pSubSrc->nSrc;.
12450 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65      int jointype
12460 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69   = pSubitem->joi
12470 6e 74 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69  ntype;..    sqli
12480 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30  te3DeleteTable(0
12490 2c 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  , pSubitem->pTab
124a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
124b0 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74  e(pSubitem->zDat
124c0 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  abase);.    sqli
124d0 74 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d  teFree(pSubitem-
124e0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
124f0 69 74 65 46 72 65 65 28 70 53 75 62 69 74 65 6d  iteFree(pSubitem
12500 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69  ->zAlias);.    i
12510 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a  f( nSubSrc>1 ){.
12520 20 20 20 20 20 20 69 6e 74 20 65 78 74 72 61 20        int extra 
12530 3d 20 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a 20  = nSubSrc - 1;. 
12540 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
12550 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
12560 20 20 20 20 20 20 20 70 53 72 63 20 3d 20 73 71         pSrc = sq
12570 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
12580 6e 64 28 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a  nd(pSrc, 0, 0);.
12590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
125a0 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
125b0 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e      for(i=pSrc->
125c0 6e 53 72 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e  nSrc-1; i-extra>
125d0 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20  =iFrom; i--){.  
125e0 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d        pSrc->a[i]
125f0 20 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74   = pSrc->a[i-ext
12600 72 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ra];.      }.   
12610 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
12620 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b  i<nSubSrc; i++){
12630 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  .      pSrc->a[i
12640 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72  +iFrom] = pSubSr
12650 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d  c->a[i];.      m
12660 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e  emset(&pSubSrc->
12670 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  a[i], 0, sizeof(
12680 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b  pSubSrc->a[i]));
12690 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d  .    }.    pSrc-
126a0 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79  >a[iFrom].jointy
126b0 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20  pe = jointype;. 
126c0 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65 67   }..  /* Now beg
126d0 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20  in substituting 
126e0 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20  subquery result 
126f0 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  set expressions 
12700 66 6f 72 20 0a 20 20 2a 2a 20 72 65 66 65 72 65  for .  ** refere
12710 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72  nces to the iPar
12720 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ent in the outer
12730 20 71 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20 20   query..  ** .  
12740 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  ** Example:.  **
12750 0a 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61  .  **   SELECT a
12760 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53  +5, b*10 FROM (S
12770 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20  ELECT x*3 AS a, 
12780 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74  y+10 AS b FROM t
12790 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20  1) WHERE a>b;.  
127a0 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20  **   \          
127b0 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
127c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65  _________ subque
127d0 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  ry __________/  
127e0 20 20 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20 20          /.  **  
127f0 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
12800 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
12810 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
12820 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
12830 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ___/.  **.  ** W
12840 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20  e look at every 
12850 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
12860 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
12870 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
12880 20 73 65 65 0a 20 20 2a 2a 20 22 61 22 20 77 65   see.  ** "a" we
12890 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33   substitute "x*3
128a0 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  " and every plac
128b0 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20  e we see "b" we 
128c0 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30  substitute "y+10
128d0 22 2e 0a 20 20 2a 2f 0a 20 20 70 4c 69 73 74 20  "..  */.  pList 
128e0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66  = p->pEList;.  f
128f0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
12900 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
12910 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20    Expr *pExpr;. 
12920 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b     if( pList->a[
12930 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28  i].zName==0 && (
12940 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
12950 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e  [i].pExpr)->span
12960 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  .z!=0 ){.      p
12970 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
12980 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
12990 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 73  ((char*)pExpr->s
129a0 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70  pan.z, pExpr->sp
129b0 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  an.n);.    }.  }
129c0 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
129d0 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72  (p->pEList, iPar
129e0 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
129f0 74 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20  t);.  if( isAgg 
12a00 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  ){.    substExpr
12a10 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79  List(p->pGroupBy
12a20 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
12a30 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75  >pEList);.    su
12a40 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69  bstExpr(p->pHavi
12a50 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  ng, iParent, pSu
12a60 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  b->pEList);.  }.
12a70 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64    if( pSub->pOrd
12a80 65 72 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65  erBy ){.    asse
12a90 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
12aa0 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  =0 );.    p->pOr
12ab0 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f  derBy = pSub->pO
12ac0 72 64 65 72 42 79 3b 0a 20 20 20 20 70 53 75 62  rderBy;.    pSub
12ad0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
12ae0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70    }else if( p->p
12af0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
12b00 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
12b10 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e  pOrderBy, iParen
12b20 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
12b30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  ;.  }.  if( pSub
12b40 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ->pWhere ){.    
12b50 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
12b60 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70 57  ExprDup(pSub->pW
12b70 68 65 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  here);.  }else{.
12b80 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a      pWhere = 0;.
12b90 20 20 7d 0a 20 20 69 66 28 20 73 75 62 71 75 65    }.  if( subque
12ba0 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 61  ryIsAgg ){.    a
12bb0 73 73 65 72 74 28 20 70 2d 3e 70 48 61 76 69 6e  ssert( p->pHavin
12bc0 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70  g==0 );.    p->p
12bd0 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68 65  Having = p->pWhe
12be0 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72  re;.    p->pWher
12bf0 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20  e = pWhere;.    
12c00 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61  substExpr(p->pHa
12c10 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70  ving, iParent, p
12c20 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
12c30 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73    p->pHaving = s
12c40 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 2d  qlite3ExprAnd(p-
12c50 3e 70 48 61 76 69 6e 67 2c 20 73 71 6c 69 74 65  >pHaving, sqlite
12c60 33 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70  3ExprDup(pSub->p
12c70 48 61 76 69 6e 67 29 29 3b 0a 20 20 20 20 61 73  Having));.    as
12c80 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
12c90 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70  y==0 );.    p->p
12ca0 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
12cb0 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 53 75  3ExprListDup(pSu
12cc0 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  b->pGroupBy);.  
12cd0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74  }else{.    subst
12ce0 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
12cf0 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
12d00 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
12d10 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
12d20 78 70 72 41 6e 64 28 70 2d 3e 70 57 68 65 72 65  xprAnd(p->pWhere
12d30 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 7d 0a 0a  , pWhere);.  }..
12d40 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e    /* The flatten
12d50 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74  ed query is dist
12d60 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74  inct if either t
12d70 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a  he inner or the.
12d80 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
12d90 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20   is distinct. . 
12da0 20 2a 2f 0a 20 20 70 2d 3e 69 73 44 69 73 74 69   */.  p->isDisti
12db0 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
12dc0 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69 73 44  nct || pSub->isD
12dd0 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 0a 20  istinct;..  /*. 
12de0 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46   ** SELECT ... F
12df0 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
12e00 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62  LIMIT a OFFSET b
12e10 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54  ) LIMIT x OFFSET
12e20 20 79 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e   y;.  **.  ** On
12e30 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20  e is tempted to 
12e40 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64  try to add a and
12e50 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68   b to combine th
12e60 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74  e limits.  But t
12e70 68 69 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  his.  ** does no
12e80 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72  t work if either
12e90 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69   limit is negati
12ea0 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ve..  */.  if( p
12eb0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
12ec0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
12ed0 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  Sub->pLimit;.   
12ee0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20   pSub->pLimit = 
12ef0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e  0;.  }..  /* Fin
12f00 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68  ially, delete wh
12f10 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68  at is left of th
12f20 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72  e subquery and r
12f30 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65  eturn.  ** succe
12f40 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
12f50 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
12f60 53 75 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  Sub);.  return 1
12f70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
12f80 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
12f90 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  /../*.** Analyze
12fa0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
12fb0 65 6d 65 6e 74 20 70 61 73 73 65 64 20 69 6e 20  ement passed in 
12fc0 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74  as an argument t
12fd0 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69  o see if it.** i
12fe0 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29  s a simple min()
12ff0 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e   or max() query.
13000 20 20 49 66 20 69 74 20 69 73 20 61 6e 64 20 74    If it is and t
13010 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65  his query can be
13020 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75 73  .** satisfied us
13030 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 73 65 65  ing a single see
13040 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
13050 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e 20  ng or end of an 
13060 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 67  index,.** then g
13070 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
13080 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54   for this SELECT
13090 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 20   and return 1.  
130a0 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  If this is not a
130b0 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e 28   .** simple min(
130c0 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
130d0 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30 3b  , then return 0;
130e0 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79 20  .**.** A simply 
130f0 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
13100 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  uery looks like 
13110 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
13120 45 4c 45 43 54 20 6d 69 6e 28 61 29 20 46 52 4f  ELECT min(a) FRO
13130 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20 53  M table;.**    S
13140 45 4c 45 43 54 20 6d 61 78 28 61 29 20 46 52 4f  ELECT max(a) FRO
13150 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54  M table;.**.** T
13160 68 65 20 71 75 65 72 79 20 6d 61 79 20 68 61 76  he query may hav
13170 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  e only a single 
13180 74 61 62 6c 65 20 69 6e 20 69 74 73 20 46 52 4f  table in its FRO
13190 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65  M argument.  The
131a0 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f 20  re.** can be no 
131b0 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49  GROUP BY or HAVI
131c0 4e 47 20 6f 72 20 57 48 45 52 45 20 63 6c 61 75  NG or WHERE clau
131d0 73 65 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74  ses.  The result
131e0 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65 20   set must.** be 
131f0 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
13200 28 29 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63  () of a single c
13210 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
13220 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 0a  le.  The column.
13230 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e 28 29 20  ** in the min() 
13240 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  or max() functio
13250 6e 20 6d 75 73 74 20 62 65 20 69 6e 64 65 78 65  n must be indexe
13260 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72  d..**.** The par
13270 61 6d 65 74 65 72 73 20 74 6f 20 74 68 69 73 20  ameters to this 
13280 72 6f 75 74 69 6e 65 20 61 72 65 20 74 68 65 20  routine are the 
13290 73 61 6d 65 20 61 73 20 66 6f 72 20 73 71 6c 69  same as for sqli
132a0 74 65 33 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20  te3Select()..** 
132b0 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63  See the header c
132c0 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72  omment on that r
132d0 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
132e0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
132f0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
13300 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65   simpleMinMaxQue
13310 72 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ry(Parse *pParse
13320 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
13330 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
13340 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  m){.  Expr *pExp
13350 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20  r;.  int iCol;. 
13360 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
13370 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
13380 6e 74 20 62 61 73 65 3b 0a 20 20 56 64 62 65 20  nt base;.  Vdbe 
13390 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f 70  *v;.  int seekOp
133a0 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
133b0 4c 69 73 74 2c 20 2a 70 4c 69 73 74 2c 20 65 4c  List, *pList, eL
133c0 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78  ist;.  struct Ex
133d0 70 72 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69 73  prList_item eLis
133e0 74 49 74 65 6d 3b 0a 20 20 53 72 63 4c 69 73 74  tItem;.  SrcList
133f0 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 62 72   *pSrc;.  int br
13400 6b 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  k;.  int iDb;.. 
13410 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
13420 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20 69   if this query i
13430 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29  s a simple min()
13440 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e   or max() query.
13450 20 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65    Return.  ** ze
13460 72 6f 20 69 66 20 69 74 20 69 73 20 20 6e 6f 74  ro if it is  not
13470 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
13480 70 47 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70  pGroupBy || p->p
13490 48 61 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68  Having || p->pWh
134a0 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ere ) return 0;.
134b0 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
134c0 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53  ;.  if( pSrc->nS
134d0 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  rc!=1 ) return 0
134e0 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
134f0 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  pEList;.  if( pE
13500 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
13510 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 78   return 0;.  pEx
13520 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30  pr = pEList->a[0
13530 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
13540 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
13550 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75  _FUNCTION ) retu
13560 72 6e 20 30 3b 0a 20 20 70 4c 69 73 74 20 3d 20  rn 0;.  pList = 
13570 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
13580 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  if( pList==0 || 
13590 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  pList->nExpr!=1 
135a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
135b0 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  ( pExpr->token.n
135c0 21 3d 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=3 ) return 0;.
135d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
135e0 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78  NICmp((char*)pEx
135f0 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e  pr->token.z,"min
13600 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ",3)==0 ){.    s
13610 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e  eekOp = OP_Rewin
13620 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  d;.  }else if( s
13630 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28  qlite3StrNICmp((
13640 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
13650 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30  en.z,"max",3)==0
13660 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d   ){.    seekOp =
13670 20 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73   OP_Last;.  }els
13680 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  e{.    return 0;
13690 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 70  .  }.  pExpr = p
136a0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
136b0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
136c0 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72  p!=TK_COLUMN ) r
136d0 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c 20  eturn 0;.  iCol 
136e0 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
136f0 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  ;.  pTab = pSrc-
13700 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f  >a[0].pTab;..  /
13710 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  * This optimizat
13720 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  ion cannot be us
13730 65 64 20 77 69 74 68 20 76 69 72 74 75 61 6c 20  ed with virtual 
13740 74 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 69 66 28  tables. */.  if(
13750 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
13760 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
13770 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20  /* If we get to 
13780 68 65 72 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  here, it means t
13790 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 74  he query is of t
137a0 68 65 20 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e  he correct form.
137b0 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d  .  ** Check to m
137c0 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
137d0 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d 61   an index and ma
137e0 6b 65 20 70 49 64 78 20 70 6f 69 6e 74 20 74 6f  ke pIdx point to
137f0 20 74 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70   the.  ** approp
13800 72 69 61 74 65 20 69 6e 64 65 78 2e 20 20 49 66  riate index.  If
13810 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
13820 78 28 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54  x() is on an INT
13830 45 47 45 52 20 50 52 49 4d 41 52 59 0a 20 20 2a  EGER PRIMARY.  *
13840 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f  * key column, no
13850 20 69 6e 64 65 78 20 69 73 20 6e 65 63 65 73 73   index is necess
13860 61 72 79 20 73 6f 20 73 65 74 20 70 49 64 78 20  ary so set pIdx 
13870 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a  to NULL.  If no.
13880 20 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64 65    ** usable inde
13890 78 20 69 73 20 66 6f 75 6e 64 2c 20 72 65 74 75  x is found, retu
138a0 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rn 0..  */.  if(
138b0 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70   iCol<0 ){.    p
138c0 49 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Idx = 0;.  }else
138d0 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  {.    CollSeq *p
138e0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
138f0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
13900 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  , pExpr);.    if
13910 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74  ( pColl==0 ) ret
13920 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28 70  urn 0;.    for(p
13930 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
13940 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
13950 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
13960 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
13970 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20  Column>=1 );.   
13980 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
13990 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 26  olumn[0]==iCol &
139a0 26 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d 3d  & .          0==
139b0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
139c0 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20  Idx->azColl[0], 
139d0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 20 29 7b  pColl->zName) ){
139e0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
139f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13a00 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20    if( pIdx==0 ) 
13a10 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
13a20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c   /* Identify col
13a30 75 6d 6e 20 74 79 70 65 73 20 69 66 20 77 65 20  umn types if we 
13a40 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68  will be using th
13a50 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69  e callback.  Thi
13a60 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73  s.  ** step is s
13a70 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75  kipped if the ou
13a80 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f  tput is going to
13a90 20 61 20 74 61 62 6c 65 20 6f 72 20 61 20 6d 65   a table or a me
13aa0 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2a 20  mory cell..  ** 
13ab0 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  The column names
13ac0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
13ad0 65 6e 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20  en generated in 
13ae0 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
13af0 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  tion..  */.  v =
13b00 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
13b10 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
13b20 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
13b30 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74  .  /* If the out
13b40 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20  put is destined 
13b50 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  for a temporary 
13b60 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74  table, open that
13b70 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
13b80 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  f( eDest==SRT_Ep
13b90 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71  hemTab ){.    sq
13ba0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13bb0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
13bc0 61 6c 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  al, iParm, 1);. 
13bd0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
13be0 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e 64  ing code to find
13bf0 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65 20   the min or the 
13c00 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79 20  max.  Basically 
13c10 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  all we have.  **
13c20 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20 74   to do is find t
13c30 68 65 20 66 69 72 73 74 20 6f 72 20 74 68 65 20  he first or the 
13c40 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
13c50 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20  e chosen index. 
13c60 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e   If.  ** the min
13c70 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f  () or max() is o
13c80 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  n the INTEGER PR
13c90 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
13ca0 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a 20  find the first. 
13cb0 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74 72   ** or last entr
13cc0 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  y in the main ta
13cd0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20  ble..  */.  iDb 
13ce0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
13cf0 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
13d00 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
13d10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
13d20 3e 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 69 73 45  >=0 || pTab->isE
13d30 70 68 65 6d 20 29 3b 0a 20 20 73 71 6c 69 74 65  phem );.  sqlite
13d40 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
13d50 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
13d60 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
13d70 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
13d80 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
13d90 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 62  Tab->zName);.  b
13da0 61 73 65 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d  ase = pSrc->a[0]
13db0 2e 69 43 75 72 73 6f 72 3b 0a 20 20 62 72 6b 20  .iCursor;.  brk 
13dc0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
13dd0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d  eLabel(v);.  com
13de0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
13df0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 62 72  rs(pParse, p, br
13e00 6b 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e  k);.  if( pSrc->
13e10 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20  a[0].pSelect==0 
13e20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70  ){.    sqlite3Op
13e30 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
13e40 62 61 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2c  base, iDb, pTab,
13e50 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
13e60 20 7d 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30   }.  if( pIdx==0
13e70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
13e80 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b  dbeAddOp(v, seek
13e90 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  Op, base, 0);.  
13ea0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 76  }else{.    /* Ev
13eb0 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 63 75  en though the cu
13ec0 72 73 6f 72 20 75 73 65 64 20 74 6f 20 6f 70 65  rsor used to ope
13ed0 6e 20 74 68 65 20 69 6e 64 65 78 20 68 65 72 65  n the index here
13ee0 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 2a   is closed.    *
13ef0 2a 20 61 73 20 73 6f 6f 6e 20 61 73 20 61 20 73  * as soon as a s
13f00 69 6e 67 6c 65 20 76 61 6c 75 65 20 68 61 73 20  ingle value has 
13f10 62 65 65 6e 20 72 65 61 64 20 66 72 6f 6d 20 69  been read from i
13f20 74 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 0a 20  t, allocate it. 
13f30 20 20 20 2a 2a 20 75 73 69 6e 67 20 28 70 50 61     ** using (pPa
13f40 72 73 65 2d 3e 6e 54 61 62 2b 2b 29 20 74 6f 20  rse->nTab++) to 
13f50 70 72 65 76 65 6e 74 20 74 68 65 20 63 75 72 73  prevent the curs
13f60 6f 72 20 69 64 20 66 72 6f 6d 20 62 65 69 6e 67  or id from being
13f70 20 0a 20 20 20 20 2a 2a 20 72 65 75 73 65 64 2e   .    ** reused.
13f80 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
13f90 6e 74 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74  nt for statement
13fa0 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 0a 20  s of the form . 
13fb0 20 20 20 2a 2a 20 22 49 4e 53 45 52 54 20 49 4e     ** "INSERT IN
13fc0 54 4f 20 78 20 53 45 4c 45 43 54 20 6d 61 78 28  TO x SELECT max(
13fd0 29 20 46 52 4f 4d 20 78 22 2e 0a 20 20 20 20 2a  ) FROM x"..    *
13fe0 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 3b 0a  /.    int iIdx;.
13ff0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
14000 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  y = sqlite3Index
14010 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20  Keyinfo(pParse, 
14020 70 49 64 78 29 3b 0a 20 20 20 20 69 49 64 78 20  pIdx);.    iIdx 
14030 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
14040 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
14050 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  dx->pSchema==pTa
14060 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
14070 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14080 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
14090 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73  , iDb, 0);.    s
140a0 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
140b0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49   OP_OpenRead, iI
140c0 64 78 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  dx, pIdx->tnum, 
140d0 0a 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29  .        (char*)
140e0 70 4b 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  pKey, P3_KEYINFO
140f0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 69  _HANDOFF);.    i
14100 66 28 20 73 65 65 6b 4f 70 3d 3d 4f 50 5f 52 65  f( seekOp==OP_Re
14110 77 69 6e 64 20 29 7b 0a 20 20 20 20 20 20 73 71  wind ){.      sq
14120 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14130 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29  , OP_Null, 0, 0)
14140 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14150 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
14160 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 29  akeRecord, 1, 0)
14170 3b 0a 20 20 20 20 20 20 73 65 65 6b 4f 70 20 3d  ;.      seekOp =
14180 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20 20 20 20   OP_MoveGt;.    
14190 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
141a0 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70  eAddOp(v, seekOp
141b0 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20  , iIdx, 0);.    
141c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
141d0 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
141e0 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 73   iIdx, 0);.    s
141f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
14200 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64  v, OP_Close, iId
14210 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  x, 0);.    sqlit
14220 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
14230 50 5f 4d 6f 76 65 47 65 2c 20 62 61 73 65 2c 20  P_MoveGe, base, 
14240 30 29 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74 2e  0);.  }.  eList.
14250 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65 6d  nExpr = 1;.  mem
14260 73 65 74 28 26 65 4c 69 73 74 49 74 65 6d 2c 20  set(&eListItem, 
14270 30 2c 20 73 69 7a 65 6f 66 28 65 4c 69 73 74 49  0, sizeof(eListI
14280 74 65 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e 61  tem));.  eList.a
14290 20 3d 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a 20   = &eListItem;. 
142a0 20 65 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78 70   eList.a[0].pExp
142b0 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 73 65 6c  r = pExpr;.  sel
142c0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
142d0 72 73 65 2c 20 70 2c 20 26 65 4c 69 73 74 2c 20  rse, p, &eList, 
142e0 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 65 44 65  0, 0, 0, -1, eDe
142f0 73 74 2c 20 69 50 61 72 6d 2c 20 62 72 6b 2c 20  st, iParm, brk, 
14300 62 72 6b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  brk, 0);.  sqlit
14310 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
14320 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 20 20 73 71  el(v, brk);.  sq
14330 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14340 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65  , OP_Close, base
14350 2c 20 30 29 3b 0a 20 20 0a 20 20 72 65 74 75 72  , 0);.  .  retur
14360 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  n 1;.}../*.** An
14370 61 6c 79 7a 65 20 61 6e 64 20 4f 52 44 45 52 20  alyze and ORDER 
14380 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
14390 6c 61 75 73 65 20 69 6e 20 61 20 53 45 4c 45 43  lause in a SELEC
143a0 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65  T statement.  Re
143b0 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
143c0 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65  er of errors see
143d0 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 4f 52 44 45  n..**.** An ORDE
143e0 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
143f0 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78   is a list of ex
14400 70 72 65 73 73 69 6f 6e 73 2e 20 20 49 66 20 61  pressions.  If a
14410 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  ny expression.**
14420 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63   is an integer c
14430 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68  onstant, then th
14440 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  at expression is
14450 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65   replaced by the
14460 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
14470 67 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72  g entry in the r
14480 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
14490 61 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73  atic int process
144a0 4f 72 64 65 72 47 72 6f 75 70 42 79 28 0a 20 20  OrderGroupBy(.  
144b0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
144c0 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  ,     /* Name co
144d0 6e 74 65 78 74 20 6f 66 20 74 68 65 20 53 45 4c  ntext of the SEL
144e0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a  ECT statement. *
144f0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
14500 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 54 68 65  rderBy,   /* The
14510 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
14520 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20  UP BY clause to 
14530 62 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  be processed */.
14540 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
14550 79 70 65 20 20 20 20 20 2f 2a 20 45 69 74 68 65  ype     /* Eithe
14560 72 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52  r "ORDER" or "GR
14570 4f 55 50 22 2c 20 61 73 20 61 70 70 72 6f 70 72  OUP", as appropr
14580 69 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  iate */.){.  int
14590 20 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   i;.  ExprList *
145a0 70 45 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45  pEList = pNC->pE
145b0 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 54 68 65  List;     /* The
145c0 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
145d0 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 50  he SELECT */.  P
145e0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
145f0 4e 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20  NC->pParse;     
14600 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
14610 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
14620 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c  */.  assert( pEL
14630 69 73 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 4f  ist );..  if( pO
14640 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
14650 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rn 0;.  for(i=0;
14660 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
14670 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  pr; i++){.    in
14680 74 20 69 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72  t iCol;.    Expr
14690 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d   *pE = pOrderBy-
146a0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
146b0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
146c0 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
146d0 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66  Col) ){.      if
146e0 28 20 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c  ( iCol>0 && iCol
146f0 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  <=pEList->nExpr 
14700 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
14710 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 45 2d 3e  eq *pColl = pE->
14720 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69  pColl;.        i
14730 6e 74 20 66 6c 61 67 73 20 3d 20 70 45 2d 3e 66  nt flags = pE->f
14740 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
14750 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20 73 71  late;.        sq
14760 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
14770 70 45 29 3b 0a 20 20 20 20 20 20 20 20 70 45 20  pE);.        pE 
14780 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
14790 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
147a0 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e  ExprDup(pEList->
147b0 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29  a[iCol-1].pExpr)
147c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
147d0 6f 6c 6c 20 26 26 20 66 6c 61 67 73 20 29 7b 0a  oll && flags ){.
147e0 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 70 43            pE->pC
147f0 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  oll = pColl;.   
14800 20 20 20 20 20 20 20 70 45 2d 3e 66 6c 61 67 73         pE->flags
14810 20 7c 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 20   |= flags;.     
14820 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
14830 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
14840 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14850 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 25  , .           "%
14860 73 20 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  s BY column numb
14870 65 72 20 25 64 20 6f 75 74 20 6f 66 20 72 61 6e  er %d out of ran
14880 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22  ge - should be "
14890 0a 20 20 20 20 20 20 20 20 20 20 20 22 62 65 74  .           "bet
148a0 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20  ween 1 and %d", 
148b0 7a 54 79 70 65 2c 20 69 43 6f 6c 2c 20 70 45 4c  zType, iCol, pEL
148c0 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
148d0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
148e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
148f0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
14900 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 70 4e 43  ResolveNames(pNC
14910 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 72  , pE) ){.      r
14920 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
14930 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
14940 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
14950 74 69 6e 65 20 72 65 73 6f 6c 76 65 73 20 61 6e  tine resolves an
14960 79 20 6e 61 6d 65 73 20 75 73 65 64 20 69 6e 20  y names used in 
14970 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
14980 66 20 74 68 65 0a 2a 2a 20 73 75 70 70 6c 69 65  f the.** supplie
14990 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
149a0 6e 74 2e 20 49 66 20 74 68 65 20 53 45 4c 45 43  nt. If the SELEC
149b0 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
149c0 67 20 72 65 73 6f 6c 76 65 64 0a 2a 2a 20 69 73  g resolved.** is
149d0 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2c 20 74   a sub-select, t
149e0 68 65 6e 20 70 4f 75 74 65 72 4e 43 20 69 73 20  hen pOuterNC is 
149f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
14a00 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 0a 2a 2a   NameContext .**
14a10 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 53   of the parent S
14a20 45 4c 45 43 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ELECT..*/.int sq
14a30 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c  lite3SelectResol
14a40 76 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ve(.  Parse *pPa
14a50 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
14a60 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
14a70 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
14a80 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
14a90 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
14aa0 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
14ab0 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ed. */.  NameCon
14ac0 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20  text *pOuterNC  
14ad0 2f 2a 20 54 68 65 20 6f 75 74 65 72 20 6e 61 6d  /* The outer nam
14ae0 65 20 63 6f 6e 74 65 78 74 2e 20 4d 61 79 20 62  e context. May b
14af0 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20  e NULL. */.){.  
14b00 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
14b10 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
14b20 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 69  sult set. */.  i
14b30 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
14b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
14b50 2d 6c 6f 6f 70 20 76 61 72 69 61 62 6c 65 20 75  -loop variable u
14b60 73 65 64 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20  sed in multiple 
14b70 70 6c 61 63 65 73 20 2a 2f 0a 20 20 4e 61 6d 65  places */.  Name
14b80 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20  Context sNC;    
14b90 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20         /* Local 
14ba0 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 2a 2f 0a  name-context */.
14bb0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
14bc0 75 70 42 79 3b 20 20 20 20 20 20 20 20 2f 2a 20  upBy;        /* 
14bd0 54 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61  The group by cla
14be0 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  use */..  /* If 
14bf0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  this routine has
14c00 20 72 75 6e 20 62 65 66 6f 72 65 2c 20 72 65 74   run before, ret
14c10 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  urn immediately.
14c20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 73 52   */.  if( p->isR
14c30 65 73 6f 6c 76 65 64 20 29 7b 0a 20 20 20 20 61  esolved ){.    a
14c40 73 73 65 72 74 28 20 21 70 4f 75 74 65 72 4e 43  ssert( !pOuterNC
14c50 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
14c60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
14c70 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 3d 20  p->isResolved = 
14c80 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  1;..  /* If ther
14c90 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  e have already b
14ca0 65 65 6e 20 65 72 72 6f 72 73 2c 20 64 6f 20 6e  een errors, do n
14cb0 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28  othing. */.  if(
14cc0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
14cd0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14ce0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
14cf0 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74 68  .  /* Prepare th
14d00 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
14d10 6e 74 2e 20 54 68 69 73 20 63 61 6c 6c 20 77 69  nt. This call wi
14d20 6c 6c 20 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20  ll allocate all 
14d30 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 72 65 71  cursors.  ** req
14d40 75 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65 20  uired to handle 
14d50 74 68 65 20 74 61 62 6c 65 73 20 61 6e 64 20 73  the tables and s
14d60 75 62 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  ubqueries in the
14d70 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20   FROM clause..  
14d80 2a 2f 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c  */.  if( prepSel
14d90 65 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20  ectStmt(pParse, 
14da0 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
14db0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
14dc0 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65   }..  /* Resolve
14dd0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
14de0 20 69 6e 20 74 68 65 20 4c 49 4d 49 54 20 61 6e   in the LIMIT an
14df0 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
14e00 2e 20 54 68 65 73 65 0a 20 20 2a 2a 20 61 72 65  . These.  ** are
14e10 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20   not allowed to 
14e20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 61 6d  refer to any nam
14e30 65 73 2c 20 73 6f 20 70 61 73 73 20 61 6e 20 65  es, so pass an e
14e40 6d 70 74 79 20 4e 61 6d 65 43 6f 6e 74 65 78 74  mpty NameContext
14e50 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
14e60 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
14e70 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 50 61  sNC));.  sNC.pPa
14e80 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
14e90 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
14ea0 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43  esolveNames(&sNC
14eb0 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a  , p->pLimit) ||.
14ec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
14ed0 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73  rResolveNames(&s
14ee0 4e 43 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 20  NC, p->pOffset) 
14ef0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14f00 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
14f10 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65  .  /* Set up the
14f20 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74   local name-cont
14f30 65 78 74 20 74 6f 20 70 61 73 73 20 74 6f 20 45  ext to pass to E
14f40 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
14f50 29 20 74 6f 0a 20 20 2a 2a 20 72 65 73 6f 6c 76  ) to.  ** resolv
14f60 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
14f70 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e  -list..  */.  sN
14f80 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a  C.allowAgg = 1;.
14f90 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
14fa0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 73 4e 43 2e   p->pSrc;.  sNC.
14fb0 70 4e 65 78 74 20 3d 20 70 4f 75 74 65 72 4e 43  pNext = pOuterNC
14fc0 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  ;..  /* Resolve 
14fd0 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 72 65 73  names in the res
14fe0 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 70 45  ult set. */.  pE
14ff0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
15000 3b 0a 20 20 69 66 28 20 21 70 45 4c 69 73 74 20  ;.  if( !pEList 
15010 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
15020 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28 69 3d 30  ERROR;.  for(i=0
15030 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
15040 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
15050 72 20 2a 70 58 20 3d 20 70 45 4c 69 73 74 2d 3e  r *pX = pEList->
15060 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
15070 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
15080 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43  esolveNames(&sNC
15090 2c 20 70 58 29 20 29 7b 0a 20 20 20 20 20 20 72  , pX) ){.      r
150a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
150b0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OR;.    }.  }.. 
150c0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
150d0 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   no aggregate fu
150e0 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 72  nctions in the r
150f0 65 73 75 6c 74 2d 73 65 74 2c 20 61 6e 64 20 6e  esult-set, and n
15100 6f 20 47 52 4f 55 50 20 42 59 20 0a 20 20 2a 2a  o GROUP BY .  **
15110 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 64 6f 20   expression, do 
15120 6e 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72 65 67  not allow aggreg
15130 61 74 65 73 20 69 6e 20 61 6e 79 20 6f 66 20 74  ates in any of t
15140 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  he other express
15150 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ions..  */.  ass
15160 65 72 74 28 20 21 70 2d 3e 69 73 41 67 67 20 29  ert( !p->isAgg )
15170 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70  ;.  pGroupBy = p
15180 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 69 66  ->pGroupBy;.  if
15190 28 20 70 47 72 6f 75 70 42 79 20 7c 7c 20 73 4e  ( pGroupBy || sN
151a0 43 2e 68 61 73 41 67 67 20 29 7b 0a 20 20 20 20  C.hasAgg ){.    
151b0 70 2d 3e 69 73 41 67 67 20 3d 20 31 3b 0a 20 20  p->isAgg = 1;.  
151c0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 4e 43 2e 61  }else{.    sNC.a
151d0 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 7d  llowAgg = 0;.  }
151e0 0a 0a 20 20 2f 2a 20 49 66 20 61 20 48 41 56 49  ..  /* If a HAVI
151f0 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70 72 65  NG clause is pre
15200 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 72 65  sent, then there
15210 20 6d 75 73 74 20 62 65 20 61 20 47 52 4f 55 50   must be a GROUP
15220 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f   BY clause..  */
15230 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e  .  if( p->pHavin
15240 67 20 26 26 20 21 70 47 72 6f 75 70 42 79 20 29  g && !pGroupBy )
15250 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
15260 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
15270 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
15280 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
15290 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20 20  ore HAVING");.  
152a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
152b0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
152c0 20 41 64 64 20 74 68 65 20 65 78 70 72 65 73 73   Add the express
152d0 69 6f 6e 20 6c 69 73 74 20 74 6f 20 74 68 65 20  ion list to the 
152e0 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 62 65 66  name-context bef
152f0 6f 72 65 20 70 61 72 73 69 6e 67 20 74 68 65 0a  ore parsing the.
15300 20 20 2a 2a 20 6f 74 68 65 72 20 65 78 70 72 65    ** other expre
15310 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 53 45  ssions in the SE
15320 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
15330 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 0a  This is so that.
15340 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73    ** expressions
15350 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
15360 61 75 73 65 20 28 65 74 63 2e 29 20 63 61 6e 20  ause (etc.) can 
15370 72 65 66 65 72 20 74 6f 20 65 78 70 72 65 73 73  refer to express
15380 69 6f 6e 73 20 62 79 0a 20 20 2a 2a 20 61 6c 69  ions by.  ** ali
15390 61 73 65 73 20 69 6e 20 74 68 65 20 72 65 73 75  ases in the resu
153a0 6c 74 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a  lt set..  **.  *
153b0 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e 74 3a 20 49  * Minor point: I
153c0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
153d0 73 65 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  se, then the exp
153e0 72 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 0a  ression will be.
153f0 20 20 2a 2a 20 72 65 2d 65 76 61 6c 75 61 74 65    ** re-evaluate
15400 64 20 66 6f 72 20 65 61 63 68 20 72 65 66 65 72  d for each refer
15410 65 6e 63 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f  ence to it..  */
15420 0a 20 20 73 4e 43 2e 70 45 4c 69 73 74 20 3d 20  .  sNC.pEList = 
15430 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
15440 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
15450 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
15460 2d 3e 70 57 68 65 72 65 29 20 7c 7c 0a 20 20 20  ->pWhere) ||.   
15470 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 52 65     sqlite3ExprRe
15480 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c  solveNames(&sNC,
15490 20 70 2d 3e 70 48 61 76 69 6e 67 29 20 7c 7c 0a   p->pHaving) ||.
154a0 20 20 20 20 20 20 70 72 6f 63 65 73 73 4f 72 64        processOrd
154b0 65 72 47 72 6f 75 70 42 79 28 26 73 4e 43 2c 20  erGroupBy(&sNC, 
154c0 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  p->pOrderBy, "OR
154d0 44 45 52 22 29 20 7c 7c 0a 20 20 20 20 20 20 70  DER") ||.      p
154e0 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70  rocessOrderGroup
154f0 42 79 28 26 73 4e 43 2c 20 70 47 72 6f 75 70 42  By(&sNC, pGroupB
15500 79 2c 20 22 47 52 4f 55 50 22 29 0a 20 20 29 7b  y, "GROUP").  ){
15510 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15520 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
15530 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
15540 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
15550 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  e does not conta
15560 69 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  in aggregate fun
15570 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ctions..  */.  i
15580 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
15590 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
155a0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
155b0 20 20 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20    .    for(i=0, 
155c0 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e  pItem=pGroupBy->
155d0 61 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  a; i<pGroupBy->n
155e0 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
155f0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 45  ++){.      if( E
15600 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
15610 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Item->pExpr, EP_
15620 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Agg) ){.        
15630 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15640 70 50 61 72 73 65 2c 20 22 61 67 67 72 65 67 61  pParse, "aggrega
15650 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  te functions are
15660 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20   not allowed in 
15670 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 74  ".            "t
15680 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
15690 73 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  se");.        re
156a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
156b0 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  R;.      }.    }
156c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
156d0 69 73 20 69 73 20 6f 6e 65 20 53 45 4c 45 43 54  is is one SELECT
156e0 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2c 20   of a compound, 
156f0 62 65 20 73 75 72 65 20 74 6f 20 72 65 73 6f 6c  be sure to resol
15700 76 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 69 6e  ve names.  ** in
15710 20 74 68 65 20 6f 74 68 65 72 20 53 45 4c 45 43   the other SELEC
15720 54 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  Ts..  */.  if( p
15730 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
15740 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 65  return sqlite3Se
15750 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72  lectResolve(pPar
15760 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 70  se, p->pPrior, p
15770 4f 75 74 65 72 4e 43 29 3b 0a 20 20 7d 65 6c 73  OuterNC);.  }els
15780 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
15790 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
157a0 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20  /*.** Reset the 
157b0 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
157c0 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lator..**.** The
157d0 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
157e0 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20  ulator is a set 
157f0 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  of memory cells 
15800 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74  that hold.** int
15810 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
15820 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74  s while calculat
15830 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65  ing an aggregate
15840 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
15850 6e 65 20 73 69 6d 70 6c 79 20 73 74 6f 72 65 73  ne simply stores
15860 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66   NULLs in all of
15870 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65   those memory ce
15880 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lls..*/.static v
15890 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c  oid resetAccumul
158a0 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ator(Parse *pPar
158b0 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
158c0 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
158d0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
158e0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
158f0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
15900 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28 20  c *pFunc;.  if( 
15910 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b  pAggInfo->nFunc+
15920 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
15930 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  n==0 ){.    retu
15940 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  rn;.  }.  for(i=
15950 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
15960 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
15970 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15980 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c  Op(v, OP_MemNull
15990 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  , pAggInfo->aCol
159a0 5b 69 5d 2e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20  [i].iMem, 0);.  
159b0 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41  }.  for(pFunc=pA
159c0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69  ggInfo->aFunc, i
159d0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
159e0 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e  nFunc; i++, pFun
159f0 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  c++){.    sqlite
15a00 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15a10 5f 4d 65 6d 4e 75 6c 6c 2c 20 70 46 75 6e 63 2d  _MemNull, pFunc-
15a20 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 69  >iMem, 0);.    i
15a30 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  f( pFunc->iDisti
15a40 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
15a50 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63  Expr *pE = pFunc
15a60 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->pExpr;.      i
15a70 66 28 20 70 45 2d 3e 70 4c 69 73 74 3d 3d 30 20  f( pE->pList==0 
15a80 7c 7c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45  || pE->pList->nE
15a90 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
15aa0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15ab0 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  g(pParse, "DISTI
15ac0 4e 43 54 20 69 6e 20 61 67 67 72 65 67 61 74 65  NCT in aggregate
15ad0 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65   must be followe
15ae0 64 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  d ".           "
15af0 62 79 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  by an expression
15b00 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e  ");.        pFun
15b10 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  c->iDistinct = -
15b20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
15b30 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
15b40 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49  *pKeyInfo = keyI
15b50 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
15b60 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73  pParse, pE->pLis
15b70 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
15b80 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
15b90 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
15ba0 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
15bb0 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
15bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bd0 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
15be0 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
15bf0 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OFF);.      }.  
15c00 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
15c10 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41   Invoke the OP_A
15c20 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64  ggFinalize opcod
15c30 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72  e for every aggr
15c40 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  egate function.*
15c50 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  * in the AggInfo
15c60 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
15c70 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c  tatic void final
15c80 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
15c90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
15ca0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
15cb0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
15cc0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
15cd0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
15ce0 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
15cf0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
15d00 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
15d10 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
15d20 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
15d30 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
15d40 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
15d50 3e 70 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c 69  >pList;.    sqli
15d60 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
15d70 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69  _AggFinal, pF->i
15d80 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69  Mem, pList ? pLi
15d90 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 0a 20  st->nExpr : 0,. 
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15db0 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e       (void*)pF->
15dc0 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43 44 45  pFunc, P3_FUNCDE
15dd0 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  F);.  }.}../*.**
15de0 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75   Update the accu
15df0 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63  mulator memory c
15e00 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72  ells for an aggr
15e10 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a  egate based on.*
15e20 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  * the current cu
15e30 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rsor position..*
15e40 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70  /.static void up
15e50 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
15e60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
15e70 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
15e80 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
15e90 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
15ea0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
15eb0 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
15ec0 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
15ed0 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70  fo_col *pC;..  p
15ee0 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
15ef0 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69  ode = 1;.  for(i
15f00 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
15f10 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
15f20 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
15f30 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e  pF++){.    int n
15f40 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  Arg;.    int add
15f50 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 45  rNext = 0;.    E
15f60 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
15f70 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73   pF->pExpr->pLis
15f80 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  t;.    if( pList
15f90 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d   ){.      nArg =
15fa0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
15fb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15fc0 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
15fd0 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  rse, pList);.   
15fe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41   }else{.      nA
15ff0 72 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  rg = 0;.    }.  
16000 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69    if( pF->iDisti
16010 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
16020 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
16030 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
16040 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  v);.      assert
16050 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20  ( nArg==1 );.   
16060 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
16070 76 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  v, pF->iDistinct
16080 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 29 3b 0a  , addrNext, 1);.
16090 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
160a0 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c  ->pFunc->needCol
160b0 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20 43 6f  lSeq ){.      Co
160c0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
160d0 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  ;.      struct E
160e0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
160f0 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  tem;.      int j
16100 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16110 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20  pList!=0 );  /* 
16120 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e  pList!=0 if pF->
16130 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53  pFunc->needCollS
16140 65 71 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20  eq is true */.  
16150 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
16160 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43  em=pList->a; !pC
16170 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a  oll && j<nArg; j
16180 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
16190 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
161a0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
161b0 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
161c0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
161d0 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
161e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
161f0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
16200 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
16210 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
16220 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  VdbeOp3(v, OP_Co
16230 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63 68  llSeq, 0, 0, (ch
16240 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43  ar *)pColl, P3_C
16250 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20  OLLSEQ);.    }. 
16260 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
16270 33 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c  3(v, OP_AggStep,
16280 20 70 46 2d 3e 69 4d 65 6d 2c 20 6e 41 72 67 2c   pF->iMem, nArg,
16290 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
162a0 63 2c 20 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P3_FUNCDEF);.
162b0 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
162c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
162d0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
162e0 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  l(v, addrNext);.
162f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
16300 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f  i=0, pC=pAggInfo
16310 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e  ->aCol; i<pAggIn
16320 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
16330 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20  ; i++, pC++){.  
16340 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
16350 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45  e(pParse, pC->pE
16360 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
16370 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
16380 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 43 2d 3e 69  _MemStore, pC->i
16390 4d 65 6d 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 70  Mem, 1);.  }.  p
163a0 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
163b0 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  ode = 0;.}.../*.
163c0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
163d0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
163e0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
163f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
16400 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74  ts are distribut
16410 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61  ed in various wa
16420 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ys depending on 
16430 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
16440 65 44 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e  eDest and iParm.
16450 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74  .**.**     eDest
16460 20 56 61 6c 75 65 20 20 20 20 20 20 20 52 65 73   Value       Res
16470 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d  ult.**     -----
16480 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
16490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
164a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
164b0 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52  ------.**     SR
164c0 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e  T_Callback    In
164d0 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63  voke the callbac
164e0 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  k for each row o
164f0 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  f the result..**
16500 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20  .**     SRT_Mem 
16510 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 66 69          Store fi
16520 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65  rst result in me
16530 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a  mory cell iParm.
16540 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65  **.**     SRT_Se
16550 74 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20  t         Store 
16560 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20  results as keys 
16570 6f 66 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  of table iParm..
16580 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e  **.**     SRT_Un
16590 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20  ion       Store 
165a0 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79  results as a key
165b0 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
165c0 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a  table iParm.**.*
165d0 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74  *     SRT_Except
165e0 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73        Remove res
165f0 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65  ults from the te
16600 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
16610 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  arm..**.**     S
16620 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53  RT_Table       S
16630 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20  tore results in 
16640 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
16650 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iParm.**.** The 
16660 74 61 62 6c 65 20 61 62 6f 76 65 20 69 73 20 69  table above is i
16670 6e 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64 69  ncomplete.  Addi
16680 74 69 6f 6e 61 6c 20 65 44 69 73 74 20 76 61 6c  tional eDist val
16690 75 65 20 68 61 76 65 20 62 65 20 61 64 64 65 64  ue have be added
166a0 0a 2a 2a 20 73 69 6e 63 65 20 74 68 69 73 20 63  .** since this c
166b0 6f 6d 6d 65 6e 74 20 77 61 73 20 77 72 69 74 74  omment was writt
166c0 65 6e 2e 20 20 53 65 65 20 74 68 65 20 73 65 6c  en.  See the sel
166d0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66  ectInnerLoop() f
166e0 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61  unction for.** a
166f0 20 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e   complete listin
16700 67 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65 64  g of the allowed
16710 20 76 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74   values of eDest
16720 20 61 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69   and their meani
16730 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ngs..**.** This 
16740 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
16750 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
16760 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72  rors.  If any er
16770 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f  rors are.** enco
16780 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e  untered, then an
16790 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
167a0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
167b0 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  ft in.** pParse-
167c0 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
167d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
167e0 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53  s NOT free the S
167f0 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
16800 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a  passed in.  The.
16810 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  ** calling funct
16820 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20  ion needs to do 
16830 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  that..**.** The 
16840 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54  pParent, parentT
16850 61 62 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74  ab, and *pParent
16860 41 67 67 20 66 69 65 6c 64 73 20 61 72 65 20 66  Agg fields are f
16870 69 6c 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73  illed in if this
16880 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20  .** SELECT is a 
16890 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20  subquery.  This 
168a0 72 6f 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20  routine may try 
168b0 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20  to combine this 
168c0 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69  SELECT.** with i
168d0 74 73 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72  ts parent to for
168e0 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  m a single flat 
168f0 71 75 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f  query.  In so do
16900 69 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a  ing, it might.**
16910 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 72 65   change the pare
16920 6e 74 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20  nt query from a 
16930 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f  non-aggregate to
16940 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75   an aggregate qu
16950 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74  ery..** For that
16960 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61   reason, the pPa
16970 72 65 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20  rentAgg flag is 
16980 70 61 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e  passed as a poin
16990 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61  ter, so it.** ca
169a0 6e 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  n be changed..**
169b0 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
169c0 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   The meaning of 
169d0 74 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61  the pParent para
169e0 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  meter..**.**    
169f0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
16a00 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c   JOIN (SELECT x,
16a10 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
16a20 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20  2) JOIN t3;.**  
16a30 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
16a40 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
16a50 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
16a60 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20  __/        /.** 
16a70 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20      \           
16a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16aa0 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20             /.** 
16ab0 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
16ac0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
16ad0 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
16ae0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a  __________/.**.*
16af0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
16b00 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  s called for the
16b10 20 6f 75 74 65 72 20 71 75 65 72 79 20 66 69 72   outer query fir
16b20 73 74 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63  st.   For that c
16b30 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20  all,.** pParent 
16b40 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44  will be NULL.  D
16b50 75 72 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73  uring the proces
16b60 73 69 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65  sing of the oute
16b70 72 20 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a  r query, this .*
16b80 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
16b90 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20  led recursively 
16ba0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75  to handle the su
16bb0 62 71 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65  bquery.  For the
16bc0 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61   recursive.** ca
16bd0 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c  ll, pParent will
16be0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75   point to the ou
16bf0 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 63 61  ter query.  Beca
16c00 75 73 65 20 74 68 65 20 73 75 62 71 75 65 72 79  use the subquery
16c10 20 69 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e   is.** the secon
16c20 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74  d element in a t
16c30 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74  hree-way join, t
16c40 68 65 20 70 61 72 65 6e 74 54 61 62 20 70 61 72  he parentTab par
16c50 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62  ameter will.** b
16c60 65 20 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c  e 1 (the 2nd val
16c70 75 65 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65  ue of a 0-indexe
16c80 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74  d array.).*/.int
16c90 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a   sqlite3Select(.
16ca0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
16cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16cc0 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
16cd0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
16ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16cf0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
16d00 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
16d10 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  */.  int eDest, 
16d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
16d30 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
16d40 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
16d50 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20    int iParm,    
16d60 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 61           /* A pa
16d70 72 61 6d 65 74 65 72 20 75 73 65 64 20 62 79 20  rameter used by 
16d80 74 68 65 20 65 44 65 73 74 20 64 69 73 70 6f 73  the eDest dispos
16d90 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53  al method */.  S
16da0 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20  elect *pParent, 
16db0 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
16dc0 20 53 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63   SELECT for whic
16dd0 68 20 74 68 69 73 20 69 73 20 61 20 73 75 62 2d  h this is a sub-
16de0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70  query */.  int p
16df0 61 72 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20  arentTab,       
16e00 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50    /* Index in pP
16e10 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74  arent->pSrc of t
16e20 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  his query */.  i
16e30 6e 74 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20  nt *pParentAgg, 
16e40 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
16e50 20 70 50 61 72 65 6e 74 20 75 73 65 73 20 61 67   pParent uses ag
16e60 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
16e70 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66  s */.  char *aff
16e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16e90 20 49 66 20 65 44 65 73 74 20 69 73 20 53 52 54   If eDest is SRT
16ea0 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69  _Union, the affi
16eb0 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29  nity string */.)
16ec0 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
16ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
16ee0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
16ef0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
16f00 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72  fo;     /* Retur
16f10 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68  n from sqlite3Wh
16f20 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20  ereBegin() */.  
16f30 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
16f40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
16f50 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e  rtual machine un
16f60 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
16f70 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b   */.  int isAgg;
16f80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16f90 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
16fa0 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
16fb0 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
16fc0 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
16fd0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
16fe0 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
16ff0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
17000 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
17010 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
17020 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
17030 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
17040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17050 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
17060 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
17070 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
17080 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rBy;    /* The O
17090 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
170a0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
170b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
170c0 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  upBy;    /* The 
170d0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
170e0 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
170f0 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
17100 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
17110 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20   HAVING clause. 
17120 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
17130 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74    int isDistinct
17140 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
17150 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
17160 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
17170 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  ent */.  int dis
17180 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20  tinct;          
17190 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20  /* Table to use 
171a0 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
171b0 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63   set */.  int rc
171c0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
171d0 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
171e0 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75  urn from this fu
171f0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  nction */.  int 
17200 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20  addrSortIndex;  
17210 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
17220 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   an OP_OpenEphem
17230 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
17240 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41   */.  AggInfo sA
17250 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20  ggInfo;      /* 
17260 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64  Information used
17270 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75   by aggregate qu
17280 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  eries */.  int i
17290 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
172a0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
172b0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71  the end of the q
172c0 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70  uery */..  if( p
172d0 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61  ==0 || sqlite3Ma
172e0 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 7c 7c 20  llocFailed() || 
172f0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
17300 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
17310 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  }.  if( sqlite3A
17320 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
17330 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
17340 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
17350 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  n 1;.  memset(&s
17360 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  AggInfo, 0, size
17370 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a  of(sAggInfo));..
17380 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17390 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
173a0 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  ECT.  /* If ther
173b0 65 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65  e is are a seque
173c0 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20  nce of queries, 
173d0 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f  do the earlier o
173e0 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a  nes first..  */.
173f0 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
17400 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52  ){.    if( p->pR
17410 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20  ightmost==0 ){. 
17420 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f       Select *pLo
17430 6f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4c  op;.      for(pL
17440 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c  oop=p; pLoop; pL
17450 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f  oop=pLoop->pPrio
17460 72 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f  r){.        pLoo
17470 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  p->pRightmost = 
17480 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
17490 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
174a0 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
174b0 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  p, eDest, iParm,
174c0 20 61 66 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69   aff);.  }.#endi
174d0 66 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  f..  pOrderBy = 
174e0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
174f0 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
17500 72 62 79 28 65 44 65 73 74 29 20 29 7b 0a 20 20  rby(eDest) ){.  
17510 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
17520 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
17530 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
17540 65 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 20  e(pParse, p, 0) 
17550 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
17560 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d  ct_end;.  }.  p-
17570 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
17580 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  erBy;..  /* Make
17590 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f 66   local copies of
175a0 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   the parameters 
175b0 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e 0a  for this query..
175c0 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 20    */.  pTabList 
175d0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68  = p->pSrc;.  pWh
175e0 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
175f0 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
17600 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
17610 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
17620 67 3b 0a 20 20 69 73 41 67 67 20 3d 20 70 2d 3e  g;.  isAgg = p->
17630 69 73 41 67 67 3b 0a 20 20 69 73 44 69 73 74 69  isAgg;.  isDisti
17640 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
17650 6e 63 74 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  nct;.  pEList = 
17660 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
17670 20 70 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74   pEList==0 ) got
17680 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
17690 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74   /* .  ** Do not
176a0 20 65 76 65 6e 20 61 74 74 65 6d 70 74 20 74 6f   even attempt to
176b0 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20 63 6f   generate any co
176c0 64 65 20 69 66 20 77 65 20 68 61 76 65 20 61 6c  de if we have al
176d0 72 65 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20  ready seen.  ** 
176e0 65 72 72 6f 72 73 20 62 65 66 6f 72 65 20 74 68  errors before th
176f0 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74  is routine start
17700 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  s..  */.  if( pP
17710 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67  arse->nErr>0 ) g
17720 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
17730 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67  .  /* If writing
17740 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65   to memory or ge
17750 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20  nerating a set. 
17760 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   ** only a singl
17770 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20  e column may be 
17780 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66  output..  */.#if
17790 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
177a0 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
177b0 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20  (eDest==SRT_Mem 
177c0 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65  || eDest==SRT_Se
177d0 74 29 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  t) && pEList->nE
177e0 78 70 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c  xpr>1 ){.    sql
177f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17800 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e  rse, "only a sin
17810 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77  gle result allow
17820 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20  ed for ".       
17830 22 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  "a SELECT that i
17840 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
17850 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 67  ression");.    g
17860 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
17870 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
17880 20 4f 52 44 45 52 20 42 59 20 69 73 20 69 67 6e   ORDER BY is ign
17890 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65  ored for some de
178a0 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f  stinations..  */
178b0 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65  .  if( Ignorable
178c0 4f 72 64 65 72 62 79 28 65 44 65 73 74 29 20 29  Orderby(eDest) )
178d0 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d  {.    pOrderBy =
178e0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65   0;.  }..  /* Be
178f0 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63  gin generating c
17900 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ode..  */.  v = 
17910 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
17920 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
17930 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
17940 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  _end;..  /* Gene
17950 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c  rate code for al
17960 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e  l sub-queries in
17970 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
17980 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  .  */.#if !defin
17990 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
179a0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
179b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
179c0 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30  _VIEW).  for(i=0
179d0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
179e0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  rc; i++){.    co
179f0 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64  nst char *zSaved
17a00 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 30 3b  AuthContext = 0;
17a10 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 52 65 73  .    int needRes
17a20 74 6f 72 65 43 6f 6e 74 65 78 74 3b 0a 20 20 20  toreContext;.   
17a30 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
17a40 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
17a50 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 0a  TabList->a[i];..
17a60 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
17a70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 49 74  Select==0 || pIt
17a80 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20  em->isPopulated 
17a90 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
17aa0 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  if( pItem->zName
17ab0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 61  !=0 ){.      zSa
17ac0 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
17ad0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
17ae0 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61  ntext;.      pPa
17af0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
17b00 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  t = pItem->zName
17b10 3b 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73 74  ;.      needRest
17b20 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a  oreContext = 1;.
17b30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17b40 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
17b50 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
17b60 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
17b70 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
17b80 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 45 70 68  pSelect, SRT_Eph
17b90 65 6d 54 61 62 2c 20 0a 20 20 20 20 20 20 20 20  emTab, .        
17ba0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
17bb0 69 43 75 72 73 6f 72 2c 20 70 2c 20 69 2c 20 26  iCursor, p, i, &
17bc0 69 73 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 69  isAgg, 0);.    i
17bd0 66 28 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f  f( needRestoreCo
17be0 6e 74 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  ntext ){.      p
17bf0 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
17c00 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68  ext = zSavedAuth
17c10 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20  Context;.    }. 
17c20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
17c30 3e 70 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72  >pSrc;.    pWher
17c40 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
17c50 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c     if( !Ignorabl
17c60 65 4f 72 64 65 72 62 79 28 65 44 65 73 74 29 20  eOrderby(eDest) 
17c70 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  ){.      pOrderB
17c80 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
17c90 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72 6f 75  .    }.    pGrou
17ca0 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
17cb0 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67 20 3d  y;.    pHaving =
17cc0 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20   p->pHaving;.   
17cd0 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d   isDistinct = p-
17ce0 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d  >isDistinct;.  }
17cf0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68  .#endif..  /* Ch
17d00 65 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63  eck for the spec
17d10 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69  ial case of a mi
17d20 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e  n() or max() fun
17d30 63 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a  ction by itself.
17d40 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
17d50 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  lt set..  */.  i
17d60 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51  f( simpleMinMaxQ
17d70 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
17d80 65 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b  eDest, iParm) ){
17d90 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20  .    rc = 0;.   
17da0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
17db0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
17dc0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  k to see if this
17dd0 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 74   is a subquery t
17de0 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74  hat can be "flat
17df0 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20  tened" into its 
17e00 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  parent..  ** If 
17e10 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20  flattening is a 
17e20 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73  possiblity, do s
17e30 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d  o and return imm
17e40 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f  ediately.  .  */
17e50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17e60 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20  OMIT_VIEW.  if( 
17e70 70 50 61 72 65 6e 74 20 26 26 20 70 50 61 72 65  pParent && pPare
17e80 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20 20 66  ntAgg &&.      f
17e90 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70  lattenSubquery(p
17ea0 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61  Parent, parentTa
17eb0 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20  b, *pParentAgg, 
17ec0 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66  isAgg) ){.    if
17ed0 28 20 69 73 41 67 67 20 29 20 2a 70 50 61 72 65  ( isAgg ) *pPare
17ee0 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 67  ntAgg = 1;.    g
17ef0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
17f00 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
17f10 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
17f20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
17f30 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69   then this sorti
17f40 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69  ng.  ** index mi
17f50 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67  ght end up being
17f60 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64   unused if the d
17f70 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a  ata can be .  **
17f80 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72   extracted in pr
17f90 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20  e-sorted order. 
17fa0 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20   If that is the 
17fb0 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  case, then the. 
17fc0 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   ** OP_OpenEphem
17fd0 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
17fe0 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
17ff0 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f   to an OP_Noop o
18000 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75  nce.  ** we figu
18010 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20  re out that the 
18020 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73  sorting index is
18030 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68   not needed.  Th
18040 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a  e addrSortIndex.
18050 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73    ** variable is
18060 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74   used to facilit
18070 61 74 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e  ate that change.
18080 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
18090 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49  erBy ){.    KeyI
180a0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
180b0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
180c0 45 72 72 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Err ){.      got
180d0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
180e0 20 20 7d 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f    }.    pKeyInfo
180f0 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
18100 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
18110 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 4f  OrderBy);.    pO
18120 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
18130 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
18140 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  +;.    p->addrOp
18150 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72  enEphm[2] = addr
18160 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20  SortIndex =.    
18170 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
18180 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
18190 65 72 61 6c 2c 20 70 4f 72 64 65 72 42 79 2d 3e  eral, pOrderBy->
181a0 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72  iECursor, pOrder
181b0 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 20 20 20  By->nExpr+2,    
181c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181d0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
181e0 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P3_KEYINFO_HAN
181f0 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DOFF);.  }else{.
18200 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e 64 65      addrSortInde
18210 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  x = -1;.  }..  /
18220 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
18230 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
18240 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
18250 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
18260 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  le..  */.  if( e
18270 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
18280 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
18290 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
182a0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
182b0 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e  iParm, pEList->n
182c0 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Expr);.  }..  /*
182d0 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
182e0 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20  ..  */.  iEnd = 
182f0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
18300 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75  abel(v);.  compu
18310 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
18320 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64  (pParse, p, iEnd
18330 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20  );..  /* Open a 
18340 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
18350 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
18360 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a  tinct set..  */.
18370 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74    if( isDistinct
18380 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
18390 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 64  *pKeyInfo;.    d
183a0 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
183b0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 4b  ->nTab++;.    pK
183c0 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
183d0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
183e0 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  rse, p->pEList);
183f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18400 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op3(v, OP_OpenEp
18410 68 65 6d 65 72 61 6c 2c 20 64 69 73 74 69 6e 63  hemeral, distinc
18420 74 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  t, 0, .         
18430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
18440 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
18450 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
18460 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  FF);.  }else{.  
18470 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b    distinct = -1;
18480 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65  .  }..  /* Aggre
18490 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67  gate and non-agg
184a0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 61  regate queries a
184b0 72 65 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65  re handled diffe
184c0 72 65 6e 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20  rently */.  if( 
184d0 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75 70  !isAgg && pGroup
184e0 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  By==0 ){.    /* 
184f0 54 68 69 73 20 63 61 73 65 20 69 73 20 66 6f 72  This case is for
18500 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71   non-aggregate q
18510 75 65 72 69 65 73 0a 20 20 20 20 2a 2a 20 42 65  ueries.    ** Be
18520 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  gin the database
18530 20 73 63 61 6e 0a 20 20 20 20 2a 2f 0a 20 20 20   scan.    */.   
18540 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
18550 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
18560 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
18570 68 65 72 65 2c 20 26 70 4f 72 64 65 72 42 79 29  here, &pOrderBy)
18580 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
18590 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
185a0 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 49  t_end;..    /* I
185b0 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  f sorting index 
185c0 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64  that was created
185d0 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f   by a prior OP_O
185e0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20  penEphemeral .  
185f0 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
18600 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65   ended up not be
18610 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e  ing needed, then
18620 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f   change the OP_O
18630 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20  penEphemeral.   
18640 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e   ** into an OP_N
18650 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
18660 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e 64 65  if( addrSortInde
18670 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79  x>=0 && pOrderBy
18680 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
18690 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
186a0 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74  Noop(v, addrSort
186b0 49 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20 20 20  Index, 1);.     
186c0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
186d0 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  [2] = -1;.    }.
186e0 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20  .    /* Use the 
186f0 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c  standard inner l
18700 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oop.    */.    i
18710 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  f( selectInnerLo
18720 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45  op(pParse, p, pE
18730 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64  List, 0, 0, pOrd
18740 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20  erBy, distinct, 
18750 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  eDest,.         
18760 20 20 20 20 20 20 20 20 20 20 20 69 50 61 72 6d             iParm
18770 2c 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69  , pWInfo->iConti
18780 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  nue, pWInfo->iBr
18790 65 61 6b 2c 20 61 66 66 29 20 29 7b 0a 20 20 20  eak, aff) ){.   
187a0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
187b0 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  end;.    }..    
187c0 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
187d0 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  ase scan loop.. 
187e0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
187f0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
18800 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
18810 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 70  /* This is the p
18820 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67  rocessing for ag
18830 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
18840 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
18850 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61  xt sNC;    /* Na
18860 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
18870 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
18880 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ate information 
18890 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d  */.    int iAMem
188a0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
188b0 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
188c0 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72  for storing curr
188d0 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ent GROUP BY */.
188e0 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20      int iBMem;  
188f0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
18900 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
18910 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20   previous GROUP 
18920 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55  BY */.    int iU
18930 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  seFlag;       /*
18940 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c   Mem address hol
18950 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61  ding flag indica
18960 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61  ting that at lea
18970 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  st.             
18980 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
18990 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70  e row of the inp
189a0 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ut to the aggreg
189b0 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20  ator has been.  
189c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189d0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
189e0 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  ed */.    int iA
189f0 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a  bortFlag;     /*
18a00 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69   Mem address whi
18a10 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20  ch causes query 
18a20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76  abort if positiv
18a30 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f  e */.    int gro
18a40 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20  upBySort;    /* 
18a50 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73  Rows come from s
18a60 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42  ource in GROUP B
18a70 59 20 6f 72 64 65 72 20 2a 2f 0a 0a 0a 20 20 20  Y order */...   
18a80 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
18a90 67 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64  g variables hold
18aa0 20 61 64 64 72 65 73 73 65 73 20 6f 72 20 6c 61   addresses or la
18ab0 62 65 6c 73 20 66 6f 72 20 70 61 72 74 73 20 6f  bels for parts o
18ac0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 69 72  f the.    ** vir
18ad0 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 70 72 6f  tual machine pro
18ae0 67 72 61 6d 20 77 65 20 61 72 65 20 70 75 74 74  gram we are putt
18af0 69 6e 67 20 74 6f 67 65 74 68 65 72 20 2a 2f 0a  ing together */.
18b00 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70      int addrOutp
18b10 75 74 52 6f 77 3b 20 20 20 20 20 20 2f 2a 20 53  utRow;      /* S
18b20 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69  tart of subrouti
18b30 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
18b40 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a  a result row */.
18b50 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74 41      int addrSetA
18b60 62 6f 72 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  bort;       /* S
18b70 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61  et the abort fla
18b80 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  g and return */.
18b90 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74      int addrInit
18ba0 69 61 6c 69 7a 65 4c 6f 6f 70 3b 20 2f 2a 20 53  ializeLoop; /* S
18bb0 74 61 72 74 20 6f 66 20 63 6f 64 65 20 74 68 61  tart of code tha
18bc0 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  t initializes th
18bd0 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a  e input loop */.
18be0 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f      int addrTopO
18bf0 66 4c 6f 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54  fLoop;      /* T
18c00 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  op of the input 
18c10 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20  loop */.    int 
18c20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67  addrGroupByChang
18c30 65 3b 20 20 2f 2a 20 43 6f 64 65 20 74 68 61 74  e;  /* Code that
18c40 20 72 75 6e 73 20 77 68 65 6e 20 61 6e 79 20 47   runs when any G
18c50 52 4f 55 50 20 42 59 20 74 65 72 6d 20 63 68 61  ROUP BY term cha
18c60 6e 67 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  nges */.    int 
18c70 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77 3b 20  addrProcessRow; 
18c80 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 70      /* Code to p
18c90 72 6f 63 65 73 73 20 61 20 73 69 6e 67 6c 65 20  rocess a single 
18ca0 69 6e 70 75 74 20 72 6f 77 20 2a 2f 0a 20 20 20  input row */.   
18cb0 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20   int addrEnd;   
18cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
18cd0 6f 66 20 61 6c 6c 20 70 72 6f 63 65 73 73 69 6e  of all processin
18ce0 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  g */.    int add
18cf0 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 20 20 20  rSortingIdx;    
18d00 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45   /* The OP_OpenE
18d10 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65  phemeral for the
18d20 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a   sorting index *
18d30 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 52 65  /.    int addrRe
18d40 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  set;          /*
18d50 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   Subroutine for 
18d60 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63  resetting the ac
18d70 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 0a 20 20  cumulator */..  
18d80 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69    addrEnd = sqli
18d90 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
18da0 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  (v);..    /* Con
18db0 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e  vert TK_COLUMN n
18dc0 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47  odes into TK_AGG
18dd0 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65  _COLUMN and make
18de0 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20   entries in.    
18df0 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20  ** sAggInfo for 
18e00 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  all TK_AGG_FUNCT
18e10 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70  ION nodes in exp
18e20 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a  ressions of the.
18e30 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74      ** SELECT st
18e40 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a  atement..    */.
18e50 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c      memset(&sNC,
18e60 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
18e70 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65  ;.    sNC.pParse
18e80 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73   = pParse;.    s
18e90 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
18ea0 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e  abList;.    sNC.
18eb0 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67  pAggInfo = &sAgg
18ec0 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e  Info;.    sAggIn
18ed0 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
18ee0 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70  n = pGroupBy ? p
18ef0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31  GroupBy->nExpr+1
18f00 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e   : 0;.    sAggIn
18f10 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  fo.pGroupBy = pG
18f20 72 6f 75 70 42 79 3b 0a 20 20 20 20 69 66 28 20  roupBy;.    if( 
18f30 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
18f40 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
18f50 70 45 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  pEList) ){.     
18f60 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
18f70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18f80 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
18f90 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
18fa0 70 4f 72 64 65 72 42 79 29 20 29 7b 0a 20 20 20  pOrderBy) ){.   
18fb0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
18fc0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
18fd0 28 20 70 48 61 76 69 6e 67 20 26 26 20 73 71 6c  ( pHaving && sql
18fe0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
18ff0 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20  ggregates(&sNC, 
19000 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20  pHaving) ){.    
19010 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
19020 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67  d;.    }.    sAg
19030 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74  gInfo.nAccumulat
19040 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43  or = sAggInfo.nC
19050 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69  olumn;.    for(i
19060 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
19070 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
19080 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
19090 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
190a0 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61  &sNC, sAggInfo.a
190b0 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 70  Func[i].pExpr->p
190c0 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  List) ){.       
190d0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
190e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
190f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d      if( sqlite3M
19100 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20  allocFailed() ) 
19110 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
19120 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73  ..    /* Process
19130 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
19140 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59  es with GROUP BY
19150 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65   is very differe
19160 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75  nt and.    ** mu
19170 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20  ch more complex 
19180 74 68 61 20 61 67 67 72 65 67 61 74 65 73 20 77  tha aggregates w
19190 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42  ithout a GROUP B
191a0 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  Y..    */.    if
191b0 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
191c0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
191d0 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e  yInfo;  /* Keyin
191e0 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
191f0 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63  r the group by c
19200 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 20 20 20 20  lause */..      
19210 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73  /* Create labels
19220 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65   that we will be
19230 20 6e 65 65 64 69 6e 67 0a 20 20 20 20 20 20 2a   needing.      *
19240 2f 0a 20 20 20 20 20 0a 20 20 20 20 20 20 61 64  /.     .      ad
19250 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70  drInitializeLoop
19260 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
19270 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
19280 20 20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61    addrGroupByCha
19290 6e 67 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nge = sqlite3Vdb
192a0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
192b0 20 20 20 20 20 61 64 64 72 50 72 6f 63 65 73 73       addrProcess
192c0 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
192d0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
192e0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
192f0 65 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20  e is a GROUP BY 
19300 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20  clause we might 
19310 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69  need a sorting i
19320 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ndex to.      **
19330 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20   implement it.  
19340 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f  Allocate that so
19350 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e  rting index now.
19360 20 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75    If it turns ou
19370 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  t.      ** that 
19380 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69  we do not need i
19390 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65  t after all, the
193a0 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69   OpenEphemeral i
193b0 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20  nstruction.     
193c0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76   ** will be conv
193d0 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f  erted into a Noo
193e0 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  p.  .      */.  
193f0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
19400 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65  tingIdx = pParse
19410 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
19420 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
19430 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
19440 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29  Parse, pGroupBy)
19450 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74  ;.      addrSort
19460 69 6e 67 49 64 78 20 3d 0a 20 20 20 20 20 20 20  ingIdx =.       
19470 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
19480 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  3(v, OP_OpenEphe
19490 6d 65 72 61 6c 2c 20 73 41 67 67 49 6e 66 6f 2e  meral, sAggInfo.
194a0 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20  sortingIdx,.    
194b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194c0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53       sAggInfo.nS
194d0 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 0a 20 20  ortingColumn,.  
194e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194f0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
19500 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
19510 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20  FO_HANDOFF);..  
19520 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
19530 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  e memory locatio
19540 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50  ns used by GROUP
19550 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72   BY aggregate pr
19560 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a  ocessing.      *
19570 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67  /.      iUseFlag
19580 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
19590 2b 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46  +;.      iAbortF
195a0 6c 61 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  lag = pParse->nM
195b0 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69 41 4d 65  em++;.      iAMe
195c0 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
195d0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
195e0 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
195f0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->nExpr;.      i
19600 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  BMem = pParse->n
19610 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73  Mem;.      pPars
19620 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
19630 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
19640 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19650 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c  Op(v, OP_MemInt,
19660 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   0, iAbortFlag);
19670 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
19680 6e 74 28 28 76 2c 20 22 23 20 63 6c 65 61 72 20  nt((v, "# clear 
19690 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
196a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
196b0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
196c0 6e 74 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29  nt, 0, iUseFlag)
196d0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
196e0 65 6e 74 28 28 76 2c 20 22 23 20 69 6e 64 69 63  ent((v, "# indic
196f0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
19700 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20  empty"));.      
19710 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19720 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
19730 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f  addrInitializeLo
19740 6f 70 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  op);..      /* G
19750 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
19760 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
19770 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
19780 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  f the result.   
19790 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73     ** set.  This
197a0 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73   subroutine firs
197b0 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69  t looks at the i
197c0 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73  UseFlag.  If iUs
197d0 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69  eFlag.      ** i
197e0 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
197f0 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68  qual to zero, th
19800 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20  e subroutine is 
19810 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20  a no-op.  If.   
19820 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
19830 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74  sing calls for t
19840 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72  he query to abor
19850 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  t, this subrouti
19860 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72  ne.      ** incr
19870 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72  ements the iAbor
19880 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63  tFlag memory loc
19890 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74  ation before ret
198a0 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20  urning in.      
198b0 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e  ** order to sign
198c0 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  al the caller to
198d0 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f   abort..      */
198e0 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62  .      addrSetAb
198f0 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ort = sqlite3Vdb
19900 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
19910 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19920 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
19930 6d 49 6e 74 2c 20 31 2c 20 69 41 62 6f 72 74 46  mInt, 1, iAbortF
19940 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
19950 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73  Comment((v, "# s
19960 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  et abort flag"))
19970 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19980 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
19990 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  eturn, 0, 0);.  
199a0 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
199b0 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  w = sqlite3VdbeC
199c0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
199d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
199e0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65  AddOp(v, OP_IfMe
199f0 6d 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20  mPos, iUseFlag, 
19a00 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29  addrOutputRow+2)
19a10 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
19a20 65 6e 74 28 28 76 2c 20 22 23 20 47 72 6f 75 70  ent((v, "# Group
19a30 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
19a40 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22  tor entry point"
19a50 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
19a60 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
19a70 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a  _Return, 0, 0);.
19a80 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
19a90 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
19aa0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
19ab0 20 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67       if( pHaving
19ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
19ad0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
19ae0 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
19af0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
19b00 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
19b10 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e     rc = selectIn
19b20 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
19b30 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c  p, p->pEList, 0,
19b40 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20   0, pOrderBy,.  
19b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b60 20 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63           distinc
19b70 74 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  t, eDest, iParm,
19b80 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
19b90 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64               add
19ba0 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64  rOutputRow+1, ad
19bb0 64 72 53 65 74 41 62 6f 72 74 2c 20 61 66 66 29  drSetAbort, aff)
19bc0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
19bd0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  {.        goto s
19be0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
19bf0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
19c00 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
19c10 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20  Return, 0, 0);. 
19c20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
19c30 28 28 76 2c 20 22 23 20 65 6e 64 20 67 72 6f 75  ((v, "# end grou
19c40 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
19c50 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
19c60 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
19c70 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
19c80 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f  ll reset the gro
19c90 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f  up-by accumulato
19ca0 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  r.      */.     
19cb0 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c   addrReset = sql
19cc0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
19cd0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 72 65  ddr(v);.      re
19ce0 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
19cf0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
19d00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19d10 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
19d20 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 0a  Return, 0, 0);..
19d30 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61        /* Begin a
19d40 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
19d50 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72  extract all sour
19d60 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50  ce rows in GROUP
19d70 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20   BY order..     
19d80 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69   ** This might i
19d90 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72  nvolve two separ
19da0 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61  ate loops with a
19db0 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74  n OP_Sort in bet
19dc0 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a  ween, or.      *
19dd0 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20  * it might be a 
19de0 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74  single loop that
19df0 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74   uses an index t
19e00 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d  o extract inform
19e10 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ation.      ** i
19e20 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65  n the right orde
19e30 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e  r to begin with.
19e40 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
19e50 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
19e60 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 49  veLabel(v, addrI
19e70 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a  nitializeLoop);.
19e80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19e90 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73  eAddOp(v, OP_Gos
19ea0 75 62 2c 20 30 2c 20 61 64 64 72 52 65 73 65 74  ub, 0, addrReset
19eb0 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
19ec0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
19ed0 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
19ee0 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70  List, pWhere, &p
19ef0 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20  GroupBy);.      
19f00 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
19f10 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
19f20 0a 20 20 20 20 20 20 69 66 28 20 70 47 72 6f 75  .      if( pGrou
19f30 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBy==0 ){.      
19f40 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a    /* The optimiz
19f50 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65  er is able to de
19f60 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72  liver rows in gr
19f70 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a  oup by order so.
19f80 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f          ** we do
19f90 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72   not have to sor
19fa0 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45  t.  The OP_OpenE
19fb0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
19fc0 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
19fd0 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65  * cancelled late
19fe0 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69  r because we sti
19ff0 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74  ll need to use t
1a000 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20  he pKeyInfo.    
1a010 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
1a020 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
1a030 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 67  oupBy;.        g
1a040 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a  roupBySort = 0;.
1a050 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a060 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65       /* Rows are
1a070 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75   coming out in u
1a080 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65  ndetermined orde
1a090 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70  r.  We have to p
1a0a0 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  ush.        ** e
1a0b0 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73  ach row into a s
1a0c0 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65  orting index, te
1a0d0 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73  rminate the firs
1a0e0 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  t loop,.        
1a0f0 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65  ** then loop ove
1a100 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
1a110 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  dex in order to 
1a120 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20  get the output. 
1a130 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72         ** in sor
1a140 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ted order.      
1a150 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f    */.        gro
1a160 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20  upBySort = 1;.  
1a170 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a180 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
1a190 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b  arse, pGroupBy);
1a1a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a1b0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1a1c0 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e  Sequence, sAggIn
1a1d0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 30  fo.sortingIdx, 0
1a1e0 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70  );.        j = p
1a1f0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31  GroupBy->nExpr+1
1a200 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
1a210 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
1a220 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
1a230 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
1a240 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
1a250 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  = &sAggInfo.aCol
1a260 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
1a270 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
1a280 43 6f 6c 75 6d 6e 3c 6a 20 29 20 63 6f 6e 74 69  Column<j ) conti
1a290 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 73  nue;.          s
1a2a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1a2b0 74 43 6f 6c 75 6d 6e 28 76 2c 20 70 43 6f 6c 2d  tColumn(v, pCol-
1a2c0 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f  >pTab, pCol->iCo
1a2d0 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62  lumn, pCol->iTab
1a2e0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a  le);.          j
1a2f0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
1a300 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a310 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
1a320 65 52 65 63 6f 72 64 2c 20 6a 2c 20 30 29 3b 0a  eRecord, j, 0);.
1a330 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1a340 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
1a350 64 78 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e  dxInsert, sAggIn
1a360 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 30  fo.sortingIdx, 0
1a370 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1a380 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
1a390 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
1a3a0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1a3b0 4f 50 5f 53 6f 72 74 2c 20 73 41 67 67 49 6e 66  OP_Sort, sAggInf
1a3c0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
1a3d0 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  drEnd);.        
1a3e0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1a3f0 22 23 20 47 52 4f 55 50 20 42 59 20 73 6f 72 74  "# GROUP BY sort
1a400 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67  "));.        sAg
1a410 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67  gInfo.useSorting
1a420 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Idx = 1;.      }
1a430 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75  ..      /* Evalu
1a440 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ate the current 
1a450 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61  GROUP BY terms a
1a460 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20  nd store in b0, 
1a470 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20  b1, b2....      
1a480 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79  ** (b0 is memory
1a490 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b   location iBMem+
1a4a0 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31  0, b1 is iBMem+1
1a4b0 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a  , and so forth).
1a4c0 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f        ** Then co
1a4d0 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e  mpare the curren
1a4e0 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  t GROUP BY terms
1a4f0 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f   against the GRO
1a500 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20  UP BY terms.    
1a510 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72    ** from the pr
1a520 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65  evious row curre
1a530 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61  ntly stored in a
1a540 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20  0, a1, a2....   
1a550 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
1a560 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69  TopOfLoop = sqli
1a570 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1a580 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72  dr(v);.      for
1a590 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79  (j=0; j<pGroupBy
1a5a0 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
1a5b0 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70         if( group
1a5c0 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
1a5d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a5e0 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
1a5f0 6e 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  n, sAggInfo.sort
1a600 69 6e 67 49 64 78 2c 20 6a 29 3b 0a 20 20 20 20  ingIdx, j);.    
1a610 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a620 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69       sAggInfo.di
1a630 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
1a640 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a650 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1a660 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70  pGroupBy->a[j].p
1a670 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
1a680 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a690 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1a6a0 4d 65 6d 53 74 6f 72 65 2c 20 69 42 4d 65 6d 2b  MemStore, iBMem+
1a6b0 6a 2c 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  j, j<pGroupBy->n
1a6c0 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 7d  Expr-1);.      }
1a6d0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 47 72  .      for(j=pGr
1a6e0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20  oupBy->nExpr-1; 
1a6f0 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20  j>=0; j--){.    
1a700 20 20 20 20 69 66 28 20 6a 3c 70 47 72 6f 75 70      if( j<pGroup
1a710 42 79 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20  By->nExpr-1 ){. 
1a720 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1a730 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1a740 4d 65 6d 4c 6f 61 64 2c 20 69 42 4d 65 6d 2b 6a  MemLoad, iBMem+j
1a750 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
1a760 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1a770 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
1a780 65 6d 4c 6f 61 64 2c 20 69 41 4d 65 6d 2b 6a 2c  emLoad, iAMem+j,
1a790 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
1a7a0 20 6a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   j==0 ){.       
1a7b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a7c0 64 4f 70 28 76 2c 20 4f 50 5f 45 71 2c 20 30 78  dOp(v, OP_Eq, 0x
1a7d0 32 30 30 2c 20 61 64 64 72 50 72 6f 63 65 73 73  200, addrProcess
1a7e0 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Row);.        }e
1a7f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
1a800 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1a810 76 2c 20 4f 50 5f 4e 65 2c 20 30 78 32 30 30 2c  v, OP_Ne, 0x200,
1a820 20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e   addrGroupByChan
1a830 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
1a840 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1a850 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
1a860 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66  , (void*)pKeyInf
1a870 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 2c 20 50 33 5f  o->aColl[j], P3_
1a880 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
1a890 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  }..      /* Gene
1a8a0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72  rate code that r
1a8b0 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65  uns whenever the
1a8c0 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65   GROUP BY change
1a8d0 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e  s..      ** Chan
1a8e0 67 65 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20  ge in the GROUP 
1a8f0 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20  BY are detected 
1a900 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
1a910 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c  code.      ** bl
1a920 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77  ock.  If there w
1a930 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20  ere no changes, 
1a940 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b  this block is sk
1a950 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ipped..      **.
1a960 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f        ** This co
1a970 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e  de copies curren
1a980 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73  t group by terms
1a990 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e   in b0,b1,b2,...
1a9a0 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  .      ** over t
1a9b0 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20  o a0,a1,a2.  It 
1a9c0 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f  then calls the o
1a9d0 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
1a9e0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
1a9f0 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61  sets the aggrega
1aa00 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  te accumulator r
1aa10 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70  egisters in prep
1aa20 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  aration.      **
1aa30 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52   for the next GR
1aa40 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20  OUP BY batch..  
1aa50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
1aa60 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1aa70 61 62 65 6c 28 76 2c 20 61 64 64 72 47 72 6f 75  abel(v, addrGrou
1aa80 70 42 79 43 68 61 6e 67 65 29 3b 0a 20 20 20 20  pByChange);.    
1aa90 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72    for(j=0; j<pGr
1aaa0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b  oupBy->nExpr; j+
1aab0 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
1aac0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1aad0 4f 50 5f 4d 65 6d 4d 6f 76 65 2c 20 69 41 4d 65  OP_MemMove, iAMe
1aae0 6d 2b 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  m+j, iBMem+j);. 
1aaf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1ab00 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1ab10 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64   OP_Gosub, 0, ad
1ab20 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
1ab30 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1ab40 28 76 2c 20 22 23 20 6f 75 74 70 75 74 20 6f 6e  (v, "# output on
1ab50 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20  e row"));.      
1ab60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ab70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c  (v, OP_IfMemPos,
1ab80 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64   iAbortFlag, add
1ab90 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 56 64 62  rEnd);.      Vdb
1aba0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
1abb0 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67  check abort flag
1abc0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
1abd0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1abe0 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72  P_Gosub, 0, addr
1abf0 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  Reset);.      Vd
1ac00 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
1ac10 20 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74   reset accumulat
1ac20 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
1ac30 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72   Update the aggr
1ac40 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
1ac50 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  rs based on the 
1ac60 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20  content of.     
1ac70 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
1ac80 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  row.      */.   
1ac90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1aca0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
1acb0 64 72 50 72 6f 63 65 73 73 52 6f 77 29 3b 0a 20  drProcessRow);. 
1acc0 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
1acd0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
1ace0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
1acf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ad00 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20  p(v, OP_MemInt, 
1ad10 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  1, iUseFlag);.  
1ad20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1ad30 28 76 2c 20 22 23 20 69 6e 64 69 63 61 74 65 20  (v, "# indicate 
1ad40 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61  data in accumula
1ad50 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
1ad60 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  * End of the loo
1ad70 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  p.      */.     
1ad80 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
1ad90 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1ada0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1adb0 4f 50 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e 66  OP_Next, sAggInf
1adc0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
1add0 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20  drTopOfLoop);.  
1ade0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1adf0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
1ae00 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
1ae10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1ae20 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
1ae30 64 64 72 53 6f 72 74 69 6e 67 49 64 78 2c 20 31  ddrSortingIdx, 1
1ae40 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
1ae50 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
1ae60 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73  final row of res
1ae70 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ult.      */.   
1ae80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ae90 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  dOp(v, OP_Gosub,
1aea0 20 30 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f   0, addrOutputRo
1aeb0 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
1aec0 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 6f 75 74  mment((v, "# out
1aed0 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29  put final row"))
1aee0 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 7d 20 2f  ;.      .    } /
1aef0 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79  * endif pGroupBy
1af00 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20   */.    else {. 
1af10 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73       /* This cas
1af20 65 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67  e runs if the ag
1af30 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47  gregate has no G
1af40 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
1af50 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 72   The.      ** pr
1af60 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68  ocessing is much
1af70 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74   simpler since t
1af80 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73  here is only a s
1af90 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20  ingle row.      
1afa0 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20  ** of output..  
1afb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 73      */.      res
1afc0 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
1afd0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
1afe0 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d  ;.      pWInfo =
1aff0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1b000 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
1b010 69 73 74 2c 20 70 57 68 65 72 65 2c 20 30 29 3b  ist, pWhere, 0);
1b020 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
1b030 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
1b040 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 75 70  ct_end;.      up
1b050 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
1b060 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
1b070 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
1b080 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
1b090 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  );.      finaliz
1b0a0 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
1b0b0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
1b0c0 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  ;.      pOrderBy
1b0d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
1b0e0 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
1b0f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1b100 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
1b110 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20  aving, addrEnd, 
1b120 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
1b130 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
1b140 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
1b150 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c  pEList, 0, 0, 0,
1b160 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20   -1, .          
1b170 20 20 20 20 20 20 20 20 20 20 20 20 65 44 65 73              eDes
1b180 74 2c 20 69 50 61 72 6d 2c 20 61 64 64 72 45 6e  t, iParm, addrEn
1b190 64 2c 20 61 64 64 72 45 6e 64 2c 20 61 66 66 29  d, addrEnd, aff)
1b1a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1b1b0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1b1c0 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b  bel(v, addrEnd);
1b1d0 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64  .    .  } /* end
1b1e0 69 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65  if aggregate que
1b1f0 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  ry */..  /* If t
1b200 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
1b210 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
1b220 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74   we need to sort
1b230 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a   the results.  *
1b240 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20  * and send them 
1b250 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
1b260 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f  one by one..  */
1b270 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
1b280 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53  ){.    generateS
1b290 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20  ortTail(pParse, 
1b2a0 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  p, v, pEList->nE
1b2b0 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72  xpr, eDest, iPar
1b2c0 6d 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  m);.  }..#ifndef
1b2d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1b2e0 51 55 45 52 59 0a 20 20 2f 2a 20 49 66 20 74 68  QUERY.  /* If th
1b2f0 69 73 20 77 61 73 20 61 20 73 75 62 71 75 65 72  is was a subquer
1b300 79 2c 20 77 65 20 68 61 76 65 20 6e 6f 77 20 63  y, we have now c
1b310 6f 6e 76 65 72 74 65 64 20 74 68 65 20 73 75 62  onverted the sub
1b320 71 75 65 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a  query into a.  *
1b330 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  * temporary tabl
1b340 65 2e 20 20 53 6f 20 73 65 74 20 74 68 65 20 53  e.  So set the S
1b350 72 63 4c 69 73 74 5f 69 74 65 6d 2e 69 73 50 6f  rcList_item.isPo
1b360 70 75 6c 61 74 65 64 20 66 6c 61 67 20 74 6f 20  pulated flag to 
1b370 70 72 65 76 65 6e 74 0a 20 20 2a 2a 20 74 68 69  prevent.  ** thi
1b380 73 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20  s subquery from 
1b390 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20  being evaluated 
1b3a0 61 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72  again and to for
1b3b0 63 65 20 74 68 65 20 75 73 65 20 6f 66 0a 20 20  ce the use of.  
1b3c0 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ** the temporary
1b3d0 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
1b3e0 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20  f( pParent ){.  
1b3f0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
1b400 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61  t->pSrc->nSrc>pa
1b410 72 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61  rentTab );.    a
1b420 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1b430 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61  pSrc->a[parentTa
1b440 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b  b].pSelect==p );
1b450 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53  .    pParent->pS
1b460 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d  rc->a[parentTab]
1b470 2e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 31  .isPopulated = 1
1b480 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1b490 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
1b4a0 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a  skip this query.
1b4b0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1b4c0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1b4d0 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54  , iEnd);..  /* T
1b4e0 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75  he SELECT was su
1b4f0 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64  ccessfully coded
1b500 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75  .   Set the retu
1b510 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a  rn code to 0.  *
1b520 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f  * to indicate no
1b530 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20   errors..  */.  
1b540 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  rc = 0;..  /* Co
1b550 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68  ntrol jumps to h
1b560 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ere if an error 
1b570 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  is encountered a
1b580 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20  bove, or upon.  
1b590 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f  ** successful co
1b5a0 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45  ding of the SELE
1b5b0 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f  CT..  */.select_
1b5c0 65 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  end:..  /* Ident
1b5d0 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ify column names
1b5e0 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75   if we will be u
1b5f0 73 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63  sing them in a c
1b600 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20  allback.  This. 
1b610 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70   ** step is skip
1b620 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75  ped if the outpu
1b630 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f  t is going to so
1b640 6d 65 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61  me other destina
1b650 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tion..  */.  if(
1b660 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1b670 26 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  & eDest==SRT_Cal
1b680 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e  lback ){.    gen
1b690 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
1b6a0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
1b6b0 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t, pEList);.  }.
1b6c0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 73 41  .  sqliteFree(sA
1b6d0 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20  ggInfo.aCol);.  
1b6e0 73 71 6c 69 74 65 46 72 65 65 28 73 41 67 67 49  sqliteFree(sAggI
1b6f0 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65  nfo.aFunc);.  re
1b700 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
1b710 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1b720 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  EST) || defined(
1b730 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
1b740 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1b750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b790 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1b7a0 67 20 63 6f 64 65 20 69 73 20 75 73 65 64 20 66  g code is used f
1b7b0 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
1b7c0 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20  ebugging only.  
1b7d0 54 68 65 20 63 6f 64 65 0a 2a 2a 20 74 68 61 74  The code.** that
1b7e0 20 66 6f 6c 6c 6f 77 73 20 64 6f 65 73 20 6e 6f   follows does no
1b7f0 74 20 61 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d  t appear in norm
1b800 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a  al builds..**.**
1b810 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
1b820 61 72 65 20 75 73 65 64 20 74 6f 20 70 72 69 6e  are used to prin
1b830 74 20 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  t out the conten
1b840 74 20 6f 66 20 61 6c 6c 20 6f 72 20 70 61 72 74  t of all or part
1b850 20 6f 66 20 61 20 0a 2a 2a 20 70 61 72 73 65 20   of a .** parse 
1b860 73 74 72 75 63 74 75 72 65 73 20 73 75 63 68 20  structures such 
1b870 61 73 20 53 65 6c 65 63 74 20 6f 72 20 45 78 70  as Select or Exp
1b880 72 2e 20 20 53 75 63 68 20 70 72 69 6e 74 6f 75  r.  Such printou
1b890 74 73 20 61 72 65 20 75 73 65 66 75 6c 0a 2a 2a  ts are useful.**
1b8a0 20 66 6f 72 20 68 65 6c 70 69 6e 67 20 74 6f 20   for helping to 
1b8b0 75 6e 64 65 72 73 74 61 6e 64 20 77 68 61 74 20  understand what 
1b8c0 69 73 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 73  is happening ins
1b8d0 69 64 65 20 74 68 65 20 63 6f 64 65 20 67 65 6e  ide the code gen
1b8e0 65 72 61 74 6f 72 0a 2a 2a 20 64 75 72 69 6e 67  erator.** during
1b8f0 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f   the execution o
1b900 66 20 63 6f 6d 70 6c 65 78 20 53 45 4c 45 43 54  f complex SELECT
1b910 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
1b920 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
1b930 20 61 72 65 20 6e 6f 74 20 63 61 6c 6c 65 64 20   are not called 
1b940 61 6e 79 77 68 65 72 65 20 66 72 6f 6d 20 77 69  anywhere from wi
1b950 74 68 69 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 0a  thin the normal.
1b960 2a 2a 20 63 6f 64 65 20 62 61 73 65 2e 20 20 54  ** code base.  T
1b970 68 65 6e 20 61 72 65 20 69 6e 74 65 6e 64 65 64  hen are intended
1b980 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 72   to be called fr
1b990 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 64 65  om within the de
1b9a0 62 75 67 67 65 72 0a 2a 2a 20 6f 72 20 66 72 6f  bugger.** or fro
1b9b0 6d 20 74 65 6d 70 6f 72 61 72 79 20 22 70 72 69  m temporary "pri
1b9c0 6e 74 66 22 20 73 74 61 74 65 6d 65 6e 74 73 20  ntf" statements 
1b9d0 69 6e 73 65 72 74 65 64 20 66 6f 72 20 64 65 62  inserted for deb
1b9e0 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  ugging..*/.void 
1b9f0 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
1ba00 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
1ba10 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70   p->token.z && p
1ba20 2d 3e 74 6f 6b 65 6e 2e 6e 3e 30 20 29 7b 0a 20  ->token.n>0 ){. 
1ba30 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1ba40 72 69 6e 74 66 28 22 28 25 2e 2a 73 22 2c 20 70  rintf("(%.*s", p
1ba50 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e 74 6f  ->token.n, p->to
1ba60 6b 65 6e 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  ken.z);.  }else{
1ba70 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
1ba80 67 50 72 69 6e 74 66 28 22 28 25 64 22 2c 20 70  gPrintf("(%d", p
1ba90 2d 3e 6f 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ->op);.  }.  if(
1baa0 20 70 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20   p->pLeft ){.   
1bab0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1bac0 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73 71  ntf(" ");.    sq
1bad0 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70  lite3PrintExpr(p
1bae0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 7d 0a 20 20  ->pLeft);.  }.  
1baf0 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b  if( p->pRight ){
1bb00 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
1bb10 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20  gPrintf(" ");.  
1bb20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
1bb30 70 72 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20  pr(p->pRight);. 
1bb40 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75   }.  sqlite3Debu
1bb50 67 50 72 69 6e 74 66 28 22 29 22 29 3b 0a 7d 0a  gPrintf(")");.}.
1bb60 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e  void sqlite3Prin
1bb70 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  tExprList(ExprLi
1bb80 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
1bb90 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1bba0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
1bbb0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
1bbc0 33 50 72 69 6e 74 45 78 70 72 28 70 4c 69 73 74  3PrintExpr(pList
1bbd0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
1bbe0 20 20 20 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e     if( i<pList->
1bbf0 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20  nExpr-1 ){.     
1bc00 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1bc10 6e 74 66 28 22 2c 20 22 29 3b 0a 20 20 20 20 7d  ntf(", ");.    }
1bc20 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
1bc30 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28 53  te3PrintSelect(S
1bc40 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 6e  elect *p, int in
1bc50 64 65 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  dent){.  sqlite3
1bc60 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73  DebugPrintf("%*s
1bc70 53 45 4c 45 43 54 28 25 70 29 20 22 2c 20 69 6e  SELECT(%p) ", in
1bc80 64 65 6e 74 2c 20 22 22 2c 20 70 29 3b 0a 20 20  dent, "", p);.  
1bc90 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
1bca0 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 29 3b  List(p->pEList);
1bcb0 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
1bcc0 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 69  rintf("\n");.  i
1bcd0 66 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20  f( p->pSrc ){.  
1bce0 20 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78 3b    char *zPrefix;
1bcf0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1bd00 7a 50 72 65 66 69 78 20 3d 20 22 46 52 4f 4d 22  zPrefix = "FROM"
1bd10 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1bd20 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20  <p->pSrc->nSrc; 
1bd30 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
1bd40 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1bd50 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72  *pItem = &p->pSr
1bd60 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73  c->a[i];.      s
1bd70 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1bd80 66 28 22 25 2a 73 20 22 2c 20 69 6e 64 65 6e 74  f("%*s ", indent
1bd90 2b 36 2c 20 7a 50 72 65 66 69 78 29 3b 0a 20 20  +6, zPrefix);.  
1bda0 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22 22      zPrefix = ""
1bdb0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
1bdc0 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
1bdd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
1bde0 75 67 50 72 69 6e 74 66 28 22 28 5c 6e 22 29 3b  ugPrintf("(\n");
1bdf0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1be00 50 72 69 6e 74 53 65 6c 65 63 74 28 70 49 74 65  PrintSelect(pIte
1be10 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 6e 64 65  m->pSelect, inde
1be20 6e 74 2b 31 30 29 3b 0a 20 20 20 20 20 20 20 20  nt+10);.        
1be30 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1be40 74 66 28 22 25 2a 73 29 22 2c 20 69 6e 64 65 6e  tf("%*s)", inden
1be50 74 2b 38 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  t+8, "");.      
1be60 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d  }else if( pItem-
1be70 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  >zName ){.      
1be80 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1be90 69 6e 74 66 28 22 25 73 22 2c 20 70 49 74 65 6d  intf("%s", pItem
1bea0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
1beb0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  }.      if( pIte
1bec0 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20  m->pTab ){.     
1bed0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1bee0 72 69 6e 74 66 28 22 28 74 61 62 6c 65 3a 20 25  rintf("(table: %
1bef0 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  s)", pItem->pTab
1bf00 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
1bf10 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  }.      if( pIte
1bf20 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
1bf30 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
1bf40 67 50 72 69 6e 74 66 28 22 20 41 53 20 25 73 22  gPrintf(" AS %s"
1bf50 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  , pItem->zAlias)
1bf60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bf70 69 66 28 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e  if( i<p->pSrc->n
1bf80 53 72 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  Src-1 ){.       
1bf90 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1bfa0 6e 74 66 28 22 2c 22 29 3b 0a 20 20 20 20 20 20  ntf(",");.      
1bfb0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  }.      sqlite3D
1bfc0 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
1bfd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1bfe0 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20  ( p->pWhere ){. 
1bff0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1c000 72 69 6e 74 66 28 22 25 2a 73 20 57 48 45 52 45  rintf("%*s WHERE
1c010 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b   ", indent, "");
1c020 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e  .    sqlite3Prin
1c030 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 29  tExpr(p->pWhere)
1c040 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
1c050 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
1c060 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72    }.  if( p->pGr
1c070 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  oupBy ){.    sql
1c080 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1c090 22 25 2a 73 20 47 52 4f 55 50 20 42 59 20 22 2c  "%*s GROUP BY ",
1c0a0 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20   indent, "");.  
1c0b0 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
1c0c0 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  prList(p->pGroup
1c0d0 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
1c0e0 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
1c0f0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
1c100 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73  pHaving ){.    s
1c110 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1c120 66 28 22 25 2a 73 20 48 41 56 49 4e 47 20 22 2c  f("%*s HAVING ",
1c130 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20   indent, "");.  
1c140 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
1c150 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  pr(p->pHaving);.
1c160 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1c170 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
1c180 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  }.  if( p->pOrde
1c190 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
1c1a0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
1c1b0 2a 73 20 4f 52 44 45 52 20 42 59 20 22 2c 20 69  *s ORDER BY ", i
1c1c0 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20  ndent, "");.    
1c1d0 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
1c1e0 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79  List(p->pOrderBy
1c1f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
1c200 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
1c210 0a 20 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66  .  }.}./* End of
1c220 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 64   the structure d
1c230 65 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f  ebug printing co
1c240 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  de.*************
1c250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c290 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  /.#endif /* defi
1c2a0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
1c2b0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1c2c0 54 45 5f 44 45 42 55 47 29 20 2a 2f 0a           TE_DEBUG) */.