/ Hex Artifact Content
Login

Artifact 41b1997441ee314e681e981346d328665263bc44:


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 32  select.c,v 1.332
0200: 20 32 30 30 37 2f 30 34 2f 30 31 20 32 33 3a 34   2007/04/01 23:4
0210: 39 3a 35 32 20 64 72 68 20 45 78 70 20 24 0a 2a  9:52 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 20 3d 20 30 3b  t pseudoTab = 0;
58b0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
58c0: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
58d0: 72 42 79 3b 0a 0a 20 20 69 54 61 62 20 3d 20 70  rBy;..  iTab = p
58e0: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
58f0: 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  r;.  if( eDest==
5900: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c 20  SRT_Callback || 
5910: 65 44 65 73 74 3d 3d 53 52 54 5f 53 75 62 72 6f  eDest==SRT_Subro
5920: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 70 73 65  utine ){.    pse
5930: 75 64 6f 54 61 62 20 3d 20 70 50 61 72 73 65 2d  udoTab = pParse-
5940: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nTab++;.    sql
5950: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5960: 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
5970: 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20  pseudoTab, 0);. 
5980: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5990: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  dOp(v, OP_SetNum
59a0: 43 6f 6c 75 6d 6e 73 2c 20 70 73 65 75 64 6f 54  Columns, pseudoT
59b0: 61 62 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ab, nColumn);.  
59c0: 7d 0a 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73  }.  addr = 1 + s
59d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
59e0: 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62  v, OP_Sort, iTab
59f0: 2c 20 62 72 6b 29 3b 0a 20 20 63 6f 64 65 4f 66  , brk);.  codeOf
5a00: 66 73 65 74 28 76 2c 20 70 2c 20 63 6f 6e 74 2c  fset(v, p, cont,
5a10: 20 30 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74   0);.  if( eDest
5a20: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 7c  ==SRT_Callback |
5a30: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75 62  | eDest==SRT_Sub
5a40: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 73  routine ){.    s
5a50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5a60: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
5a70: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
5a80: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5a90: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  OP_Column, iTab,
5aa0: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
5ab0: 20 2b 20 31 29 3b 0a 20 20 73 77 69 74 63 68 28   + 1);.  switch(
5ac0: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61   eDest ){.    ca
5ad0: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
5ae0: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
5af0: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  Tab: {.      sql
5b00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5b10: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
5b20: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  arm, 0);.      s
5b30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5b40: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30  v, OP_Pull, 1, 0
5b50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5b60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5b70: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 4f  Insert, iParm, O
5b80: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
5b90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5ba0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
5bb0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
5bc0: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
5bd0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
5be0: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
5bf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5c00: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e  AddOp(v, OP_NotN
5c10: 75 6c 6c 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33  ull, -1, sqlite3
5c20: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
5c30: 76 29 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  v)+3);.      sql
5c40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5c50: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
5c60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5c70: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
5c80: 6f 2c 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62  o, 0, sqlite3Vdb
5c90: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
5ca0: 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
5cb0: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d  3VdbeOp3(v, OP_M
5cc0: 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c  akeRecord, 1, 0,
5cd0: 20 22 63 22 2c 20 50 33 5f 53 54 41 54 49 43 29   "c", P3_STATIC)
5ce0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5cf0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
5d00: 64 78 49 6e 73 65 72 74 2c 20 28 69 50 61 72 6d  dxInsert, (iParm
5d10: 26 30 78 30 30 30 30 46 46 46 46 29 2c 20 30 29  &0x0000FFFF), 0)
5d20: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5d30: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52     }.    case SR
5d40: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
5d50: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
5d60: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
5d70: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5d80: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72  P_MemStore, iPar
5d90: 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20  m, 1);.      /* 
5da0: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
5db0: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
5dc0: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
5dd0: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
5de0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
5df0: 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61   case SRT_Callba
5e00: 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ck:.    case SRT
5e10: 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20  _Subroutine: {. 
5e20: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
5e30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5e40: 4f 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  Op(v, OP_Insert,
5e50: 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a   pseudoTab, 0);.
5e60: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
5e70: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
5e80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5e90: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
5ea0: 6f 6c 75 6d 6e 2c 20 70 73 65 75 64 6f 54 61 62  olumn, pseudoTab
5eb0: 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
5ec0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
5ed0: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
5ee0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5ef0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61  beAddOp(v, OP_Ca
5f00: 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c  llback, nColumn,
5f10: 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
5f20: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5f30: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5f40: 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d  _Gosub, 0, iParm
5f50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5f60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5f70: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
5f80: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
5f90: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
5fa0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
5fb0: 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   Jump to the end
5fc0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 68 65   of the loop whe
5fd0: 6e 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  n the LIMIT is r
5fe0: 65 61 63 68 65 64 0a 20 20 2a 2f 0a 20 20 69 66  eached.  */.  if
5ff0: 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29  ( p->iLimit>=0 )
6000: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
6010: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
6020: 49 6e 63 72 2c 20 2d 31 2c 20 70 2d 3e 69 4c 69  Incr, -1, p->iLi
6030: 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mit);.    sqlite
6040: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
6050: 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69  _IfMemZero, p->i
6060: 4c 69 6d 69 74 2c 20 62 72 6b 29 3b 0a 20 20 7d  Limit, brk);.  }
6070: 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f  ..  /* The botto
6080: 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  m of the loop.  
6090: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
60a0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
60b0: 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  cont);.  sqlite3
60c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
60d0: 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
60e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
60f0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
6100: 62 72 6b 29 3b 0a 20 20 69 66 28 20 65 44 65 73  brk);.  if( eDes
6110: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
6120: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75  || eDest==SRT_Su
6130: 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  broutine ){.    
6140: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6150: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 73  (v, OP_Close, ps
6160: 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20 7d  eudoTab, 0);.  }
6170: 0a 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ..}../*.** Retur
6180: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
6190: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
61a0: 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74  ng the 'declarat
61b0: 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65  ion type' of the
61c0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
61d0: 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67  Expr. The string
61e0: 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20   may be treated 
61f0: 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65  as static by the
6200: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   caller..**.** T
6210: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
6220: 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74  ype is the exact
6230: 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69   datatype defini
6240: 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66  tion extracted f
6250: 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69  rom the.** origi
6260: 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45  nal CREATE TABLE
6270: 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68   statement if th
6280: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
6290: 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a  a column. The.**
62a0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
62b0: 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69  e for a ROWID fi
62c0: 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20  eld is INTEGER. 
62d0: 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20  Exactly when an 
62e0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
62f0: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f   considered a co
6300: 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70  lumn can be comp
6310: 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65 73 65  lex in the prese
6320: 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72 69 65  nce of subquerie
6330: 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74  s. The.** result
6340: 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20  -set expression 
6350: 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  in all of the fo
6360: 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73  llowing SELECT s
6370: 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a  tatements is .**
6380: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f   considered a co
6390: 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e  lumn by this fun
63a0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53  ction..**.**   S
63b0: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
63c0: 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  bl;.**   SELECT 
63d0: 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d  (SELECT col FROM
63e0: 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43   tbl;.**   SELEC
63f0: 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52  T (SELECT col FR
6400: 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45  OM tbl);.**   SE
6410: 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53  LECT abc FROM (S
6420: 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63  ELECT col AS abc
6430: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a   FROM tbl);.** .
6440: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
6450: 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20  on type for any 
6460: 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72  expression other
6470: 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69   than a column i
6480: 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  s NULL..*/.stati
6490: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  c const char *co
64a0: 6c 75 6d 6e 54 79 70 65 28 0a 20 20 4e 61 6d 65  lumnType(.  Name
64b0: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20  Context *pNC, . 
64c0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20   Expr *pExpr,.  
64d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
64e0: 72 69 67 69 6e 44 62 2c 0a 20 20 63 6f 6e 73 74  riginDb,.  const
64f0: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e   char **pzOrigin
6500: 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Tab,.  const cha
6510: 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 0a  r **pzOriginCol.
6520: 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ){.  char const 
6530: 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68  *zType = 0;.  ch
6540: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69  ar const *zOrigi
6550: 6e 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  nDb = 0;.  char 
6560: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 54 61  const *zOriginTa
6570: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  b = 0;.  char co
6580: 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 43 6f 6c 20  nst *zOriginCol 
6590: 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  = 0;.  int j;.  
65a0: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20  if( pExpr==0 || 
65b0: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30  pNC->pSrcList==0
65c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
65d0: 2f 2a 20 54 68 65 20 54 4b 5f 41 53 20 6f 70 65  /* The TK_AS ope
65e0: 72 61 74 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 6f  rator can only o
65f0: 63 63 75 72 20 69 6e 20 4f 52 44 45 52 20 42 59  ccur in ORDER BY
6600: 2c 20 47 52 4f 55 50 20 42 59 2c 20 48 41 56 49  , GROUP BY, HAVI
6610: 4e 47 2c 0a 20 20 2a 2a 20 61 6e 64 20 4c 49 4d  NG,.  ** and LIM
6620: 49 54 20 63 6c 61 75 73 65 73 2e 20 20 42 75 74  IT clauses.  But
6630: 20 70 45 78 70 72 20 6f 72 69 67 69 6e 61 74 65   pExpr originate
6640: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
6650: 73 65 74 20 6f 66 20 61 0a 20 20 2a 2a 20 53 45  set of a.  ** SE
6660: 4c 45 43 54 2e 20 20 53 6f 20 70 45 78 70 72 20  LECT.  So pExpr 
6670: 63 61 6e 20 6e 65 76 65 72 20 63 6f 6e 74 61 69  can never contai
6680: 6e 20 61 6e 20 41 53 20 6f 70 65 72 61 74 6f 72  n an AS operator
6690: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
66a0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
66b0: 53 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  S );..  switch( 
66c0: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
66d0: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
66e0: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
66f0: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
6700: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
6710: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
6720: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
6730: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62   the column is b
6740: 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78  eing.      ** ex
6750: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20  tracted from in 
6760: 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63  NameContext.pSrc
6770: 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65  List. This table
6780: 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20   may be real.   
6790: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74     ** database t
67a0: 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65  able or a subque
67b0: 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ry..      */.   
67c0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
67d0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
67e0: 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  * Table structur
67f0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72  e column is extr
6800: 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20  acted from */.  
6810: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
6820: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
6830: 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f  /* Select the co
6840: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
6850: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
6860: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  int iCol = pExpr
6870: 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49  ->iColumn;  /* I
6880: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  ndex of column i
6890: 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20  n pTab */.      
68a0: 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70  while( pNC && !p
68b0: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53  Tab ){.        S
68c0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
68d0: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
68e0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
68f0: 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  0;j<pTabList->nS
6900: 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  rc && pTabList->
6910: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45  a[j].iCursor!=pE
6920: 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29  xpr->iTable;j++)
6930: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  ;.        if( j<
6940: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
6950: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  {.          pTab
6960: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
6970: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ].pTab;.        
6980: 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d    pS = pTabList-
6990: 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20  >a[j].pSelect;. 
69a0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
69b0: 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e          pNC = pN
69c0: 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  C->pNext;.      
69d0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
69e0: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
69f0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 49 58  {.        /* FIX
6a00: 20 4d 45 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20   ME:.        ** 
6a10: 54 68 69 73 20 63 61 6e 20 6f 63 63 75 72 73 20  This can occurs 
6a20: 69 66 20 79 6f 75 20 68 61 76 65 20 73 6f 6d 65  if you have some
6a30: 74 68 69 6e 67 20 6c 69 6b 65 20 22 53 45 4c 45  thing like "SELE
6a40: 43 54 20 6e 65 77 2e 78 3b 22 20 69 6e 73 69 64  CT new.x;" insid
6a50: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74  e.        ** a t
6a60: 72 69 67 67 65 72 2e 20 20 49 6e 20 6f 74 68 65  rigger.  In othe
6a70: 72 20 77 6f 72 64 73 2c 20 69 66 20 79 6f 75 20  r words, if you 
6a80: 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 70  reference the sp
6a90: 65 63 69 61 6c 20 22 6e 65 77 22 0a 20 20 20 20  ecial "new".    
6aa0: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 6e 20      ** table in 
6ab0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
6ac0: 66 20 61 20 73 65 6c 65 63 74 2e 20 20 57 65 20  f a select.  We 
6ad0: 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 67 6f  do not have a go
6ae0: 6f 64 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a  od way.        *
6af0: 2a 20 74 6f 20 66 69 6e 64 20 74 68 65 20 61 63  * to find the ac
6b00: 74 75 61 6c 20 74 61 62 6c 65 20 74 79 70 65 2c  tual table type,
6b10: 20 73 6f 20 63 61 6c 6c 20 69 74 20 22 54 45 58   so call it "TEX
6b20: 54 22 2e 20 20 54 68 69 73 20 69 73 20 72 65 61  T".  This is rea
6b30: 6c 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  lly.        ** s
6b40: 6f 6d 65 74 68 69 6e 67 20 6f 66 20 61 20 62 75  omething of a bu
6b50: 67 2c 20 62 75 74 20 49 20 64 6f 20 6e 6f 74 20  g, but I do not 
6b60: 6b 6e 6f 77 20 68 6f 77 20 74 6f 20 66 69 78 20  know how to fix 
6b70: 69 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  it..        **. 
6b80: 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63         ** This c
6b90: 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f  ode does not pro
6ba0: 64 75 63 65 20 74 68 65 20 63 6f 72 72 65 63 74  duce the correct
6bb0: 20 61 6e 73 77 65 72 20 2d 20 69 74 20 6a 75 73   answer - it jus
6bc0: 74 20 70 72 65 76 65 6e 74 73 0a 20 20 20 20 20  t prevents.     
6bd0: 20 20 20 2a 2a 20 61 20 73 65 67 66 61 75 6c 74     ** a segfault
6be0: 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 31  .  See ticket #1
6bf0: 32 32 39 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  229..        */.
6c00: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
6c10: 22 54 45 58 54 22 3b 0a 20 20 20 20 20 20 20 20  "TEXT";.        
6c20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
6c30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
6c40: 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ab );.      if( 
6c50: 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pS ){.        /*
6c60: 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20   The "table" is 
6c70: 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73  actually a sub-s
6c80: 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20  elect or a view 
6c90: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
6ca0: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  se.        ** of
6cb0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
6cc0: 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68  ement. Return th
6cd0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
6ce0: 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20  pe and origin.  
6cf0: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f        ** data fo
6d00: 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  r the result-set
6d10: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73   column of the s
6d20: 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20  ub-select..     
6d30: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
6d40: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f  ( iCol>=0 && iCo
6d50: 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  l<pS->pEList->nE
6d60: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xpr ){.         
6d70: 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c   /* If iCol is l
6d80: 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
6d90: 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
6da0: 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a  on requests the.
6db0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77            ** row
6dc0: 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  id of the sub-se
6dd0: 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68  lect or view. Th
6de0: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
6df0: 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20   legal (see .   
6e00: 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63         ** test c
6e10: 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d  ase misc2.2.2) -
6e20: 20 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75   it always evalu
6e30: 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20  ates to NULL..  
6e40: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
6e50: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
6e60: 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20   sNC;.          
6e70: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
6e80: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45  List->a[iCol].pE
6e90: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73  xpr;.          s
6ea0: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
6eb0: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20  ->pSrc;.        
6ec0: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b    sNC.pNext = 0;
6ed0: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
6ee0: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
6ef0: 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  rse;.          z
6f00: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
6f10: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
6f20: 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54  ginDb, &zOriginT
6f30: 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29  ab, &zOriginCol)
6f40: 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
6f50: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61     }else if( pTa
6f60: 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  b->pSchema ){.  
6f70: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20        /* A real 
6f80: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
6f90: 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a   assert( !pS );.
6fa0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
6fb0: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
6fc0: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
6fd0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
6fe0: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
6ff0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
7000: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ) );.        if(
7010: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
7020: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
7030: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
7040: 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 22    zOriginCol = "
7050: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20  rowid";.        
7060: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
7070: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
7080: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
7090: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
70a0: 69 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43  inCol = pTab->aC
70b0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
70c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
70d0: 20 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 70    zOriginTab = p
70e0: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
70f0: 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61      if( pNC->pPa
7100: 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rse ){.         
7110: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
7120: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
7130: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  pNC->pParse->db,
7140: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
7150: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
7160: 69 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72  inDb = pNC->pPar
7170: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
7180: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
7190: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
71a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
71b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
71c0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
71d0: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
71e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
71f0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62  ression is a sub
7200: 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20  -select. Return 
7210: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
7220: 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  type and.      *
7230: 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f  * origin info fo
7240: 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c  r the single col
7250: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
7260: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
7270: 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ECT.      ** sta
7280: 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  tement..      */
7290: 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  .      NameConte
72a0: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65  xt sNC;.      Se
72b0: 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72  lect *pS = pExpr
72c0: 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
72d0: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
72e0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
72f0: 72 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72  r;.      sNC.pSr
7300: 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63  cList = pS->pSrc
7310: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78  ;.      sNC.pNex
7320: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73  t = pNC;.      s
7330: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  NC.pParse = pNC-
7340: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a  >pParse;.      z
7350: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
7360: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
7370: 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54  ginDb, &zOriginT
7380: 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29  ab, &zOriginCol)
7390: 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
73a0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
73b0: 0a 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67  .  .  if( pzOrig
73c0: 69 6e 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65  inDb ){.    asse
73d0: 72 74 28 20 70 7a 4f 72 69 67 69 6e 54 61 62 20  rt( pzOriginTab 
73e0: 26 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29  && pzOriginCol )
73f0: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44  ;.    *pzOriginD
7400: 62 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20  b = zOriginDb;. 
7410: 20 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20     *pzOriginTab 
7420: 3d 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20  = zOriginTab;.  
7430: 20 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d    *pzOriginCol =
7440: 20 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d   zOriginCol;.  }
7450: 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b  .  return zType;
7460: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
7470: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
7480: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
7490: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
74a0: 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73  types of columns
74b0: 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c  .** in the resul
74c0: 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  t set..*/.static
74d0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
74e0: 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72  lumnTypes(.  Par
74f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
7500: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
7510: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
7520: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
7530: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
7540: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
7550: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
7560: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
7570: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
7580: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
7590: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
75a0: 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f   int i;.  NameCo
75b0: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43  ntext sNC;.  sNC
75c0: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
75d0: 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72  List;.  sNC.pPar
75e0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66  se = pParse;.  f
75f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
7600: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
7610: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
7620: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
7630: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
7640: 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20  *zOrigDb = 0;.  
7650: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
7660: 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  rigTab = 0;.    
7670: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
7680: 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 63 6f  gCol = 0;.    co
7690: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
76a0: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
76b0: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
76c0: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
76d0: 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  gCol);..    /* T
76e0: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
76f0: 65 20 69 74 27 73 20 6f 77 6e 20 63 6f 70 79 20  e it's own copy 
7700: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79  of the column-ty
7710: 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20  pe and other .  
7720: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63    ** column spec
7730: 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e  ific strings, in
7740: 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61   case the schema
7750: 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65   is reset before
7760: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72   this.    ** vir
7770: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20  tual machine is 
7780: 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
7790: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
77a0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
77b0: 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45  COLNAME_DECLTYPE
77c0: 2c 20 7a 54 79 70 65 2c 20 50 33 5f 54 52 41 4e  , zType, P3_TRAN
77d0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
77e0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
77f0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
7800: 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44  DATABASE, zOrigD
7810: 62 2c 20 50 33 5f 54 52 41 4e 53 49 45 4e 54 29  b, P3_TRANSIENT)
7820: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7830: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
7840: 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c  , COLNAME_TABLE,
7850: 20 7a 4f 72 69 67 54 61 62 2c 20 50 33 5f 54 52   zOrigTab, P3_TR
7860: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
7870: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
7880: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
7890: 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43  E_COLUMN, zOrigC
78a0: 6f 6c 2c 20 50 33 5f 54 52 41 4e 53 49 45 4e 54  ol, P3_TRANSIENT
78b0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
78c0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
78d0: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
78e0: 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20   VDBE the names 
78f0: 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  of columns.** in
7900: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
7910: 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
7920: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  on is used to pr
7930: 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43  ovide the.** azC
7940: 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74  ol[] values in t
7950: 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  he callback..*/.
7960: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
7970: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
7980: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
7990: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
79a0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
79b0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
79c0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
79d0: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
79e0: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
79f0: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
7a00: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
7a10: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  set */.){.  Vdbe
7a20: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
7a30: 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  dbe;.  int i, j;
7a40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
7a50: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
7a60: 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68  nt fullNames, sh
7a70: 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64  ortNames;..#ifnd
7a80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
7a90: 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74  XPLAIN.  /* If t
7aa0: 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49  his is an EXPLAI
7ab0: 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74 65  N, skip this ste
7ac0: 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73  p */.  if( pPars
7ad0: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
7ae0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
7af0: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
7b00: 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  v!=0 );.  if( pP
7b10: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
7b20: 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c  t || v==0 || sql
7b30: 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64  ite3MallocFailed
7b40: 28 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  () ) return;.  p
7b50: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
7b60: 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61  et = 1;.  fullNa
7b70: 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mes = (db->flags
7b80: 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
7b90: 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68  lNames)!=0;.  sh
7ba0: 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e  ortNames = (db->
7bb0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
7bc0: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  hortColNames)!=0
7bd0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  ;.  sqlite3VdbeS
7be0: 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c  etNumCols(v, pEL
7bf0: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66  ist->nExpr);.  f
7c00: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
7c10: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
7c20: 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20     Expr *p;.    
7c30: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
7c40: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
7c50: 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  p==0 ) continue;
7c60: 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d  .    if( pEList-
7c70: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20  >a[i].zName ){. 
7c80: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
7c90: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
7ca0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c  zName;.      sql
7cb0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
7cc0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
7cd0: 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 73 74  _NAME, zName, st
7ce0: 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20  rlen(zName));.  
7cf0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
7d00: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f    }.    if( p->o
7d10: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
7d20: 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20  pTabList ){.    
7d30: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
7d40: 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b       char *zCol;
7d50: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
7d60: 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
7d70: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
7d80: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26  TabList->nSrc &&
7d90: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
7da0: 69 43 75 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62  iCursor!=p->iTab
7db0: 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20  le; j++){}.     
7dc0: 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c   assert( j<pTabL
7dd0: 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20  ist->nSrc );.   
7de0: 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69     pTab = pTabLi
7df0: 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20  st->a[j].pTab;. 
7e00: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
7e10: 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
7e20: 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65  PKey;.      asse
7e30: 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
7e40: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
7e50: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
7e60: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
7e70: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c   ){.        zCol
7e80: 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   = "rowid";.    
7e90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7ea0: 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43   zCol = pTab->aC
7eb0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
7ec0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7ed0: 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26  ( !shortNames &&
7ee0: 20 21 66 75 6c 6c 4e 61 6d 65 73 20 26 26 20 70   !fullNames && p
7ef0: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
7f00: 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  pan.z[0] ){.    
7f10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
7f20: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
7f30: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28 63  COLNAME_NAME, (c
7f40: 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20  har*)p->span.z, 
7f50: 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  p->span.n);.    
7f60: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c    }else if( full
7f70: 4e 61 6d 65 73 20 7c 7c 20 28 21 73 68 6f 72 74  Names || (!short
7f80: 4e 61 6d 65 73 20 26 26 20 70 54 61 62 4c 69 73  Names && pTabLis
7f90: 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20  t->nSrc>1) ){.  
7fa0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
7fb0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  e = 0;.        c
7fc0: 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20  har *zTab;. .   
7fd0: 20 20 20 20 20 7a 54 61 62 20 3d 20 70 54 61 62       zTab = pTab
7fe0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61  List->a[j].zAlia
7ff0: 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  s;.        if( f
8000: 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54 61 62  ullNames || zTab
8010: 3d 3d 30 20 29 20 7a 54 61 62 20 3d 20 70 54 61  ==0 ) zTab = pTa
8020: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
8030: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
8040: 6e 67 28 26 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c  ng(&zName, zTab,
8050: 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61   ".", zCol, (cha
8060: 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 73  r*)0);.        s
8070: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8080: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8090: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
80a0: 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P3_DYNAMIC);.   
80b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
80c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
80d0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
80e0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c  LNAME_NAME, zCol
80f0: 2c 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 29 3b  , strlen(zCol));
8100: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
8110: 73 65 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a  se if( p->span.z
8120: 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d   && p->span.z[0]
8130: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8140: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8150: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8160: 4d 45 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73 70  ME, (char*)p->sp
8170: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29  an.z, p->span.n)
8180: 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  ;.      /* sqlit
8190: 65 33 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70  e3VdbeCompressSp
81a0: 61 63 65 28 76 2c 20 61 64 64 72 29 3b 20 2a 2f  ace(v, addr); */
81b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
81c0: 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d    char zName[30]
81d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
81e0: 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op!=TK_COLUMN
81f0: 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20   || pTabList==0 
8200: 29 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  );.      sprintf
8210: 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25  (zName, "column%
8220: 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  d", i+1);.      
8230: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
8240: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
8250: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c  AME_NAME, zName,
8260: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
8270: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
8280: 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ypes(pParse, pTa
8290: 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
82a0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
82b0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
82c0: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d  SELECT./*.** Nam
82d0: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
82e0: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
82f0: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
8300: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
8310: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
8320: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
8330: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
8340: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
8350: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
8360: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
8370: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
8380: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
8390: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
83a0: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
83b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
83c0: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
83d0: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
83e0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
83f0: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
8400: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
8410: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
8420: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
8430: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
8440: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
8450: 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
8460: 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  aration.*/.stati
8470: 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74  c int prepSelect
8480: 53 74 6d 74 28 50 61 72 73 65 2a 2c 20 53 65 6c  Stmt(Parse*, Sel
8490: 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69  ect*);../*.** Gi
84a0: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
84b0: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
84c0: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
84d0: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
84e0: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
84f0: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
8500: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
8510: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
8520: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
8530: 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62  arse, char *zTab
8540: 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  Name, Select *pS
8550: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
8560: 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  *pTab;.  int i, 
8570: 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  j;.  ExprList *p
8580: 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20  EList;.  Column 
8590: 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 0a 20  *aCol, *pCol;.. 
85a0: 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d   while( pSelect-
85b0: 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63  >pPrior ) pSelec
85c0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  t = pSelect->pPr
85d0: 69 6f 72 3b 0a 20 20 69 66 28 20 70 72 65 70 53  ior;.  if( prepS
85e0: 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73 65  electStmt(pParse
85f0: 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  , pSelect) ){.  
8600: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
8610: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
8620: 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73  ectResolve(pPars
8630: 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 20 29  e, pSelect, 0) )
8640: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
8650: 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c    }.  pTab = sql
8660: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
8670: 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66  f(Table) );.  if
8680: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
8690: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
86a0: 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b   pTab->nRef = 1;
86b0: 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d  .  pTab->zName =
86c0: 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69   zTabName ? sqli
86d0: 74 65 53 74 72 44 75 70 28 7a 54 61 62 4e 61 6d  teStrDup(zTabNam
86e0: 65 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74  e) : 0;.  pEList
86f0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
8700: 73 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c  st;.  pTab->nCol
8710: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
8720: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
8730: 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54  ->nCol>0 );.  pT
8740: 61 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20  ab->aCol = aCol 
8750: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
8760: 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f  sizeof(pTab->aCo
8770: 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c  l[0])*pTab->nCol
8780: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   );.  for(i=0, p
8790: 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 70 54 61 62  Col=aCol; i<pTab
87a0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
87b0: 6c 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  l++){.    Expr *
87c0: 70 2c 20 2a 70 52 3b 0a 20 20 20 20 63 68 61 72  p, *pR;.    char
87d0: 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 63 68 61   *zType;.    cha
87e0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e  r *zName;.    in
87f0: 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c  t nName;.    Col
8800: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
8810: 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20 4e 61   int cnt;.    Na
8820: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
8830: 20 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 61     .    /* Get a
8840: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61  n appropriate na
8850: 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  me for the colum
8860: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d  n.    */.    p =
8870: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
8880: 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
8890: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c   p->pRight==0 ||
88a0: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
88b0: 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  n.z==0 || p->pRi
88c0: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21  ght->token.z[0]!
88d0: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a  =0 );.    if( (z
88e0: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
88f0: 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  [i].zName)!=0 ){
8900: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
8910: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
8920: 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20   an "AS <name>" 
8930: 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d  phrase, use <nam
8940: 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a  e> as the name *
8950: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
8960: 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a 4e 61  sqliteStrDup(zNa
8970: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  me);.    }else i
8980: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  f( p->op==TK_DOT
8990: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
89a0: 26 26 20 28 70 52 3d 70 2d 3e 70 52 69 67 68 74  && (pR=p->pRight
89b0: 29 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b 65  )!=0 && pR->toke
89c0: 6e 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e  n.z && pR->token
89d0: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f  .z[0] ){.      /
89e0: 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f 66  * For columns of
89f0: 20 74 68 65 20 66 72 6f 6d 20 41 2e 42 20 75 73   the from A.B us
8a00: 65 20 42 20 61 73 20 74 68 65 20 6e 61 6d 65 20  e B as the name 
8a10: 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  */.      zName =
8a20: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
8a30: 22 25 54 22 2c 20 26 70 52 2d 3e 74 6f 6b 65 6e  "%T", &pR->token
8a40: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
8a50: 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d   p->span.z && p-
8a60: 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20  >span.z[0] ){.  
8a70: 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f      /* Use the o
8a80: 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20  riginal text of 
8a90: 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65  the column expre
8aa0: 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d  ssion as its nam
8ab0: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
8ac0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
8ad0: 66 28 22 25 54 22 2c 20 26 70 2d 3e 73 70 61 6e  f("%T", &p->span
8ae0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8af0: 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 65 6c      /* If all el
8b00: 73 65 20 66 61 69 6c 73 2c 20 6d 61 6b 65 20 75  se fails, make u
8b10: 70 20 61 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  p a name */.    
8b20: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
8b30: 33 4d 50 72 69 6e 74 66 28 22 63 6f 6c 75 6d 6e  3MPrintf("column
8b40: 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 7d  %d", i+1);.    }
8b50: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
8b60: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ote(zName);.    
8b70: 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  if( sqlite3Mallo
8b80: 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20  cFailed() ){.   
8b90: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
8ba0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
8bb0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30  te3DeleteTable(0
8bc0: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 72  , pTab);.      r
8bd0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a  eturn 0;.    }..
8be0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
8bf0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
8c00: 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20   is unique.  If 
8c10: 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  the name is not 
8c20: 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61  unique,.    ** a
8c30: 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65 72 20  ppend a integer 
8c40: 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74  to the name so t
8c50: 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75  hat it becomes u
8c60: 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  nique..    */.  
8c70: 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e    nName = strlen
8c80: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72  (zName);.    for
8c90: 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a  (j=cnt=0; j<i; j
8ca0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
8cb0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43  qlite3StrICmp(aC
8cc0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  ol[j].zName, zNa
8cd0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
8ce0: 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d    zName[nName] =
8cf0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   0;.        zNam
8d00: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
8d10: 74 66 28 22 25 7a 3a 25 64 22 2c 20 7a 4e 61 6d  tf("%z:%d", zNam
8d20: 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20  e, ++cnt);.     
8d30: 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20     j = -1;.     
8d40: 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
8d50: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
8d60: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d  .    }.    pCol-
8d70: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
8d80: 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
8d90: 74 79 70 65 6e 61 6d 65 2c 20 74 79 70 65 20 61  typename, type a
8da0: 66 66 69 6e 69 74 79 2c 20 61 6e 64 20 63 6f 6c  ffinity, and col
8db0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
8dc0: 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  for the.    ** c
8dd0: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  olumn..    */.  
8de0: 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
8df0: 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
8e00: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
8e10: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63   = pSelect->pSrc
8e20: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71  ;.    zType = sq
8e30: 6c 69 74 65 53 74 72 44 75 70 28 63 6f 6c 75 6d  liteStrDup(colum
8e40: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
8e50: 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20 20 70 43  , 0, 0));.    pC
8e60: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 7a 54 79 70  ol->zType = zTyp
8e70: 65 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66  e;.    pCol->aff
8e80: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
8e90: 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a  xprAffinity(p);.
8ea0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
8eb0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
8ec0: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
8ed0: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
8ee0: 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20    pCol->zColl = 
8ef0: 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 43 6f  sqliteStrDup(pCo
8f00: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
8f10: 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50  }.  }.  pTab->iP
8f20: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  Key = -1;.  retu
8f30: 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
8f40: 2a 20 50 72 65 70 61 72 65 20 61 20 53 45 4c 45  * Prepare a SELE
8f50: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  CT statement for
8f60: 20 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20 64   processing by d
8f70: 6f 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  oing the followi
8f80: 6e 67 0a 2a 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a  ng.** things:.**
8f90: 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65  .**    (1)  Make
8fa0: 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f   sure VDBE curso
8fb0: 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
8fc0: 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
8fd0: 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  every.**        
8fe0: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
8ff0: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
9000: 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20  **    (2)  Fill 
9010: 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d  in the pTabList-
9020: 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73  >a[].pTab fields
9030: 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
9040: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20  that .**        
9050: 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c   defines FROM cl
9060: 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77  ause.  When view
9070: 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  s appear in the 
9080: 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20  FROM clause,.** 
9090: 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61          fill pTa
90a0: 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65  bList->a[].pSele
90b0: 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  ct with a copy o
90c0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
90d0: 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
90e0: 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74    that implement
90f0: 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63  s the view.  A c
9100: 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
9110: 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54  he view's SELECT
9120: 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74  .**         stat
9130: 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65  ement so that we
9140: 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69   can freely modi
9150: 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61  fy or delete tha
9160: 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  t statement.**  
9170: 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77         without w
9180: 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65  orrying about me
9190: 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 72 65  ssing up the pre
91a0: 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e  sistent represen
91b0: 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  tation.**       
91c0: 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a    of the view..*
91d0: 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64  *.**    (3)  Add
91e0: 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48   terms to the WH
91f0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63  ERE clause to ac
9200: 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54  comodate the NAT
9210: 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20  URAL keyword.** 
9220: 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73          on joins
9230: 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20   and the ON and 
9240: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
9250: 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  joins..**.**    
9260: 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69  (4)  Scan the li
9270: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  st of columns in
9280: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
9290: 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67  (pEList) looking
92a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20  .**         for 
92b0: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
92c0: 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72   "*" operator or
92d0: 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65   the TABLE.* ope
92e0: 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20  rator..**       
92f0: 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61    If found, expa
9300: 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62  nd each "*" to b
9310: 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
9320: 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a  n every table.**
9330: 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42           and TAB
9340: 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79  LE.* to be every
9350: 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45   column in TABLE
9360: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
9370: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
9380: 20 74 68 65 72 65 20 61 72 65 20 70 72 6f 62 6c   there are probl
9390: 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  ems, leave an er
93a0: 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69  ror message.** i
93b0: 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
93c0: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f  urn non-zero..*/
93d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 65 70  .static int prep
93e0: 53 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65  SelectStmt(Parse
93f0: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
9400: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a   *p){.  int i, j
9410: 2c 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69  , k, rc;.  SrcLi
9420: 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
9430: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
9440: 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
9450: 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
9460: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
9470: 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c  ->pSrc==0 || sql
9480: 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64  ite3MallocFailed
9490: 28 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  () ){.    return
94a0: 20 31 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69   1;.  }.  pTabLi
94b0: 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
94c0: 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
94d0: 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  st;..  /* Make s
94e0: 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ure cursor numbe
94f0: 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
9500: 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74  igned to all ent
9510: 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65  ries in.  ** the
9520: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
9530: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
9540: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ment..  */.  sql
9550: 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
9560: 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
9570: 20 70 2d 3e 70 53 72 63 29 3b 0a 0a 20 20 2f 2a   p->pSrc);..  /*
9580: 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74   Look up every t
9590: 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  able named in th
95a0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
95b0: 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66   the select.  If
95c0: 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f  .  ** an entry o
95d0: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
95e0: 65 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20  e is a subquery 
95f0: 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61 62  instead of a tab
9600: 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a  le or view,.  **
9610: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 74   then create a t
9620: 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73  ransient table s
9630: 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 63  tructure to desc
9640: 72 69 62 65 20 74 68 65 20 73 75 62 71 75 65 72  ribe the subquer
9650: 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  y..  */.  for(i=
9660: 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
9670: 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
9680: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
9690: 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  om++){.    Table
96a0: 20 2a 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20   *pTab;.    if( 
96b0: 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29  pFrom->pTab!=0 )
96c0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
96d0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c  statement has al
96e0: 72 65 61 64 79 20 62 65 65 6e 20 70 72 65 70 61  ready been prepa
96f0: 72 65 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e  red.  There is n
9700: 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20  o need.      ** 
9710: 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a  to go further. *
9720: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
9730: 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65  i==0 );.      re
9740: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
9750: 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61    if( pFrom->zNa
9760: 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  me==0 ){.#ifndef
9770: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
9780: 51 55 45 52 59 0a 20 20 20 20 20 20 2f 2a 20 41  QUERY.      /* A
9790: 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
97a0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
97b0: 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
97c0: 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
97d0: 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ->pSelect!=0 );.
97e0: 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d        if( pFrom-
97f0: 3e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20  >zAlias==0 ){.  
9800: 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 7a 41 6c        pFrom->zAl
9810: 69 61 73 20 3d 0a 20 20 20 20 20 20 20 20 20 20  ias =.          
9820: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
9830: 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79 5f  sqlite_subquery_
9840: 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70 46 72  %p_", (void*)pFr
9850: 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  om->pSelect);.  
9860: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
9870: 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
9880: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f  =0 );.      pFro
9890: 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
98a0: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
98b0: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
98c0: 63 74 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d  ct(pParse, pFrom
98d0: 2d 3e 7a 41 6c 69 61 73 2c 20 70 46 72 6f 6d 2d  ->zAlias, pFrom-
98e0: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
98f0: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
9900: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
9910: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9920: 2f 2a 20 54 68 65 20 69 73 45 70 68 65 6d 20 66  /* The isEphem f
9930: 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68  lag indicates th
9940: 61 74 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  at the Table str
9950: 75 63 74 75 72 65 20 68 61 73 20 62 65 65 6e 0a  ucture has been.
9960: 20 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63        ** dynamic
9970: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 61  ally allocated a
9980: 6e 64 20 6d 61 79 20 62 65 20 66 72 65 65 64 20  nd may be freed 
9990: 61 74 20 61 6e 79 20 74 69 6d 65 2e 20 20 49 6e  at any time.  In
99a0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 20 20   other words,.  
99b0: 20 20 20 20 2a 2a 20 70 54 61 62 20 69 73 20 6e      ** pTab is n
99c0: 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ot pointing to a
99d0: 20 70 65 72 73 69 73 74 65 6e 74 20 74 61 62 6c   persistent tabl
99e0: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
99f0: 20 64 65 66 69 6e 65 73 0a 20 20 20 20 20 20 2a   defines.      *
9a00: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 63  * part of the sc
9a10: 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20 70  hema. */.      p
9a20: 54 61 62 2d 3e 69 73 45 70 68 65 6d 20 3d 20 31  Tab->isEphem = 1
9a30: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
9a40: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
9a50: 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f  ordinary table o
9a60: 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74  r view name in t
9a70: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
9a80: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
9a90: 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
9aa0: 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
9ab0: 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20  Tab = pTab = .  
9ac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63        sqlite3Loc
9ad0: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
9ae0: 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72  pFrom->zName,pFr
9af0: 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  om->zDatabase);.
9b00: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
9b10: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
9b20: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
9b30: 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
9b40: 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  +;.#if !defined(
9b50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
9b60: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53  ) || !defined (S
9b70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
9b80: 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69  ALTABLE).      i
9b90: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
9ba0: 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54   || IsVirtual(pT
9bb0: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ab) ){.        /
9bc0: 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65 20  * We reach here 
9bd0: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  if the named tab
9be0: 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61  le is a really a
9bf0: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20   view */.       
9c00: 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77   if( sqlite3View
9c10: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
9c20: 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
9c30: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
9c40: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
9c50: 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72 6f        /* If pFro
9c60: 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 69 74  m->pSelect!=0 it
9c70: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65   means we are de
9c80: 61 6c 69 6e 67 20 77 69 74 68 20 61 0a 20 20 20  aling with a.   
9c90: 20 20 20 20 20 2a 2a 20 76 69 65 77 20 77 69 74       ** view wit
9ca0: 68 69 6e 20 61 20 76 69 65 77 2e 20 20 54 68 65  hin a view.  The
9cb0: 20 53 45 4c 45 43 54 20 73 74 72 75 63 74 75 72   SELECT structur
9cc0: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
9cd0: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  en.        ** co
9ce0: 70 69 65 64 20 62 79 20 74 68 65 20 6f 75 74 65  pied by the oute
9cf0: 72 20 76 69 65 77 20 73 6f 20 77 65 20 63 61 6e  r view so we can
9d00: 20 73 6b 69 70 20 74 68 65 20 63 6f 70 79 20 73   skip the copy s
9d10: 74 65 70 20 68 65 72 65 0a 20 20 20 20 20 20 20  tep here.       
9d20: 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65 72   ** in the inner
9d30: 20 76 69 65 77 2e 0a 20 20 20 20 20 20 20 20 2a   view..        *
9d40: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46  /.        if( pF
9d50: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  rom->pSelect==0 
9d60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  ){.          pFr
9d70: 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
9d80: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
9d90: 54 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  Tab->pSelect);. 
9da0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9db0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
9dc0: 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
9dd0: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73  NATURAL keywords
9de0: 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49  , and ON and USI
9df0: 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f  NG clauses of jo
9e00: 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
9e10: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
9e20: 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 20 72  n(pParse, p) ) r
9e30: 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46  eturn 1;..  /* F
9e40: 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61  or every "*" tha
9e50: 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  t occurs in the 
9e60: 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73  column list, ins
9e70: 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ert the names of
9e80: 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e  .  ** all column
9e90: 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
9ea0: 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20    And for every 
9eb0: 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74  TABLE.* insert t
9ec0: 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66  he names.  ** of
9ed0: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
9ee0: 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73  TABLE.  The pars
9ef0: 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70  er inserted a sp
9f00: 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ecial expression
9f10: 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54  .  ** with the T
9f20: 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66  K_ALL operator f
9f30: 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74  or each "*" that
9f40: 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   it found in the
9f50: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20   column list..  
9f60: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
9f70: 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74   code just has t
9f80: 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f  o locate the TK_
9f90: 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ALL expressions 
9fa0: 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20  and expand.  ** 
9fb0: 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20  each one to the 
9fc0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  list of all colu
9fd0: 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
9fe0: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
9ff0: 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74   first loop just
a000: 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
a010: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
a020: 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20  "*" operators.  
a030: 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70  ** that need exp
a040: 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  anding..  */.  f
a050: 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
a060: 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
a070: 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45     Expr *pE = pE
a080: 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72  List->a[k].pExpr
a090: 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
a0a0: 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b  ==TK_ALL ) break
a0b0: 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
a0c0: 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e  ==TK_DOT && pE->
a0d0: 70 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70 52  pRight && pE->pR
a0e0: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ight->op==TK_ALL
a0f0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d  .         && pE-
a100: 3e 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70 4c  >pLeft && pE->pL
a110: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  eft->op==TK_ID )
a120: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63   break;.  }.  rc
a130: 20 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45   = 0;.  if( k<pE
a140: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
a150: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
a160: 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d  we get here it m
a170: 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  eans the result 
a180: 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  set contains one
a190: 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20   or more "*".   
a1a0: 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68   ** operators th
a1b0: 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  at need to be ex
a1c0: 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68  panded.  Loop th
a1d0: 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
a1e0: 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20  ssion.    ** in 
a1f0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
a200: 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f  nd expand them o
a210: 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ne by one..    *
a220: 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  /.    struct Exp
a230: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20  rList_item *a = 
a240: 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45  pEList->a;.    E
a250: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  xprList *pNew = 
a260: 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  0;.    int flags
a270: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66   = pParse->db->f
a280: 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f  lags;.    int lo
a290: 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73  ngNames = (flags
a2a0: 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
a2b0: 6c 4e 61 6d 65 73 29 21 3d 30 20 26 26 0a 20 20  lNames)!=0 &&.  
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2d0: 20 20 20 20 28 66 6c 61 67 73 20 26 20 53 51 4c      (flags & SQL
a2e0: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
a2f0: 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28  s)==0;..    for(
a300: 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
a310: 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
a320: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b    Expr *pE = a[k
a330: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
a340: 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  f( pE->op!=TK_AL
a350: 4c 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  L &&.           
a360: 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20  (pE->op!=TK_DOT 
a370: 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30  || pE->pRight==0
a380: 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   || pE->pRight->
a390: 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20  op!=TK_ALL) ){. 
a3a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70         /* This p
a3b0: 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73  articular expres
a3c0: 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  sion does not ne
a3d0: 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
a3e0: 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
a3f0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
a400: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
a410: 6e 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45  nd(pNew, a[k].pE
a420: 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  xpr, 0);.       
a430: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
a440: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
a450: 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e  New->nExpr-1].zN
a460: 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65  ame = a[k].zName
a470: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
a480: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
a490: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
a4a0: 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20       a[k].pExpr 
a4b0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b  = 0;.        a[k
a4c0: 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
a4d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a4e0: 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73    /* This expres
a4f0: 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72  sion is a "*" or
a500: 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64   a "TABLE.*" and
a510: 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
a520: 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64       ** expanded
a530: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
a540: 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20   tableSeen = 0; 
a550: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
a560: 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63   when TABLE matc
a570: 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  hes */.        c
a580: 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20  har *zTName;    
a590: 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20          /* text 
a5a0: 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45  of name of TABLE
a5b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
a5c0: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
a5d0: 26 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  & pE->pLeft ){. 
a5e0: 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
a5f0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
a600: 6d 54 6f 6b 65 6e 28 26 70 45 2d 3e 70 4c 65 66  mToken(&pE->pLef
a610: 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  t->token);.     
a620: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a630: 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a      zTName = 0;.
a640: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a650: 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
a660: 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
a670: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
a680: 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
a690: 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a           Table *
a6a0: 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
a6b0: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  ab;.          ch
a6c0: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
a6d0: 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  From->zAlias;.  
a6e0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
a6f0: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e  Name==0 || zTabN
a700: 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20  ame[0]==0 ){ .  
a710: 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61            zTabNa
a720: 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  me = pTab->zName
a730: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
a740: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
a750: 6d 65 20 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d  me && (zTabName=
a760: 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30  =0 || zTabName[0
a770: 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20  ]==0 || .       
a780: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a790: 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c  3StrICmp(zTName,
a7a0: 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 29 20 29   zTabName)!=0) )
a7b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
a7c0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
a7d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61    }.          ta
a7e0: 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20  bleSeen = 1;.   
a7f0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
a800: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
a810: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
a820: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 52  Expr *pExpr, *pR
a830: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
a840: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
a850: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
a860: 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  ame;..          
a870: 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20    if( i>0 ){.   
a880: 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63             struc
a890: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
a8a0: 70 4c 65 66 74 20 3d 20 26 70 54 61 62 4c 69 73  pLeft = &pTabLis
a8b0: 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20 20 20  t->a[i-1];.     
a8c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4c           if( (pL
a8d0: 65 66 74 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65 20  eft[1].jointype 
a8e0: 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30  & JT_NATURAL)!=0
a8f0: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
a900: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75              colu
a910: 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70  mnIndex(pLeft->p
a920: 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29  Tab, zName)>=0 )
a930: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
a940: 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41    /* In a NATURA
a950: 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65  L join, omit the
a960: 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72   join columns fr
a970: 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  om the .        
a980: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
a990: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f   on the right */
a9a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a9b0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
a9c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a9d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
a9e0: 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28  ite3IdListIndex(
a9f0: 70 4c 65 66 74 5b 31 5d 2e 70 55 73 69 6e 67 2c  pLeft[1].pUsing,
aa00: 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aa20: 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20   In a join with 
aa30: 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20  a USING clause, 
aa40: 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  omit columns in 
aa50: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
aa60: 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61      ** using cla
aa70: 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62  use from the tab
aa80: 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  le on the right.
aa90: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
aaa0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
aac0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
aad0: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
aae0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
aaf0: 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ID, 0, 0, 0);.  
ab00: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
ab10: 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ight==0 ) break;
ab20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
ab30: 54 6f 6b 65 6e 28 26 70 52 69 67 68 74 2d 3e 74  Token(&pRight->t
ab40: 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  oken, zName);.  
ab50: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
ab60: 61 62 4e 61 6d 65 20 26 26 20 28 6c 6f 6e 67 4e  abName && (longN
ab70: 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74  ames || pTabList
ab80: 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20  ->nSrc>1) ){.   
ab90: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
aba0: 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  *pLeft = sqlite3
abb0: 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30  Expr(TK_ID, 0, 0
abc0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
abd0: 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
abe0: 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20  te3Expr(TK_DOT, 
abf0: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30  pLeft, pRight, 0
ac00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
ac10: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
ac20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
ac30: 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70       setToken(&p
ac40: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61  Left->token, zTa
ac50: 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
ac60: 20 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26        setToken(&
ac70: 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 73 71 6c  pExpr->span, sql
ac80: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 73 2e  ite3MPrintf("%s.
ac90: 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a  %s", zTabName, z
aca0: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
acb0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
acc0: 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20  n.dyn = 1;.     
acd0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
ace0: 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20  token.z = 0;.   
acf0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
ad00: 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20  ->token.n = 0;. 
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
ad20: 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20  pr->token.dyn = 
ad30: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
ad40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ad50: 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67      pExpr = pRig
ad60: 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht;.            
ad70: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20    pExpr->span = 
ad80: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pExpr->token;.  
ad90: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ada0: 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
adb0: 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
adc0: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
add0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
ade0: 65 6e 64 28 70 4e 65 77 2c 20 70 45 78 70 72 2c  end(pNew, pExpr,
adf0: 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a   &pExpr->span);.
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
ae10: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
ae20: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
ae30: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e  xprListAppend(pN
ae40: 65 77 2c 20 70 45 78 70 72 2c 20 26 70 52 69 67  ew, pExpr, &pRig
ae50: 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  ht->token);.    
ae60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ae70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
ae80: 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62          if( !tab
ae90: 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20  leSeen ){.      
aea0: 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29      if( zTName )
aeb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
aec0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
aed0: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
aee0: 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d  able: %s", zTNam
aef0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  e);.          }e
af00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
af10: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
af20: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62  (pParse, "no tab
af30: 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b  les specified");
af40: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
af50: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
af60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
af70: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 4e 61   sqliteFree(zTNa
af80: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
af90: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
afa0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45 4c  prListDelete(pEL
afb0: 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c  ist);.    p->pEL
afc0: 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
afd0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
afe0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
aff0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
b000: 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ECT./*.** This r
b010: 6f 75 74 69 6e 65 20 61 73 73 6f 63 69 61 74 65  outine associate
b020: 73 20 65 6e 74 72 69 65 73 20 69 6e 20 61 6e 20  s entries in an 
b030: 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73  ORDER BY express
b040: 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a  ion list with.**
b050: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65   columns in a re
b060: 73 75 6c 74 2e 20 20 46 6f 72 20 65 61 63 68 20  sult.  For each 
b070: 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73  ORDER BY express
b080: 69 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65 20  ion, the opcode 
b090: 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65  of.** the top-le
b0a0: 76 65 6c 20 6e 6f 64 65 20 69 73 20 63 68 61 6e  vel node is chan
b0b0: 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  ged to TK_COLUMN
b0c0: 20 61 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e   and the iColumn
b0d0: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65   value of.** the
b0e0: 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20   top-level node 
b0f0: 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74  is filled in wit
b100: 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  h column number 
b110: 61 6e 64 20 74 68 65 20 69 54 61 62 6c 65 0a 2a  and the iTable.*
b120: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74  * value of the t
b130: 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73  op-level node is
b140: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 54 61   filled with iTa
b150: 62 6c 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ble parameter..*
b160: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
b170: 65 20 70 72 69 6f 72 20 53 45 4c 45 43 54 20 63  e prior SELECT c
b180: 6c 61 75 73 65 73 2c 20 74 68 65 79 20 61 72 65  lauses, they are
b190: 20 70 72 6f 63 65 73 73 65 64 20 66 69 72 73 74   processed first
b1a0: 2e 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e  .  A match.** in
b1b0: 20 61 6e 20 65 61 72 6c 69 65 72 20 53 45 4c 45   an earlier SELE
b1c0: 43 54 20 74 61 6b 65 73 20 70 72 65 63 65 64 65  CT takes precede
b1d0: 6e 63 65 20 6f 76 65 72 20 61 20 6c 61 74 65 72  nce over a later
b1e0: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41   SELECT..**.** A
b1f0: 6e 79 20 65 6e 74 72 79 20 74 68 61 74 20 64 6f  ny entry that do
b200: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 69 73 20  es not match is 
b210: 66 6c 61 67 67 65 64 20 61 73 20 61 6e 20 65 72  flagged as an er
b220: 72 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ror.  The number
b230: 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20 69 73  .** of errors is
b240: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
b250: 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72  atic int matchOr
b260: 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20  derbyToColumn(. 
b270: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
b280: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 6c           /* A pl
b290: 61 63 65 20 74 6f 20 6c 65 61 76 65 20 65 72 72  ace to leave err
b2a0: 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20  or messages */. 
b2b0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
b2c0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63  ,        /* Matc
b2d0: 68 20 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75  h to result colu
b2e0: 6d 6e 73 20 6f 66 20 74 68 69 73 20 53 45 4c 45  mns of this SELE
b2f0: 43 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  CT */.  ExprList
b300: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
b310: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
b320: 76 61 6c 75 65 73 20 74 6f 20 6d 61 74 63 68 20  values to match 
b330: 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20  against columns 
b340: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
b350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b360: 49 6e 73 65 72 74 20 74 68 69 73 20 76 61 6c 75  Insert this valu
b370: 65 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20  e in iTable */. 
b380: 20 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74   int mustComplet
b390: 65 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54  e        /* If T
b3a0: 52 55 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59  RUE all ORDER BY
b3b0: 73 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a  s must match */.
b3c0: 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  ){.  int nErr = 
b3d0: 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  0;.  int i, j;. 
b3e0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
b3f0: 74 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63  t;..  if( pSelec
b400: 74 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42 79  t==0 || pOrderBy
b410: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
b420: 20 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65    if( mustComple
b430: 74 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  te ){.    for(i=
b440: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
b450: 45 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64  Expr; i++){ pOrd
b460: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
b470: 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28  = 0; }.  }.  if(
b480: 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28   prepSelectStmt(
b490: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29  pParse, pSelect)
b4a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
b4b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c  ;.  }.  if( pSel
b4c0: 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ect->pPrior ){. 
b4d0: 20 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65     if( matchOrde
b4e0: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
b4f0: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  se, pSelect->pPr
b500: 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69  ior, pOrderBy, i
b510: 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20  Table, 0) ){.   
b520: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
b530: 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20   }.  }.  pEList 
b540: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
b550: 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
b560: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
b570: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
b580: 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  *pE = pOrderBy->
b590: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
b5a0: 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20  int iCol = -1;. 
b5b0: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d     if( pOrderBy-
b5c0: 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e  >a[i].done ) con
b5d0: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
b5e0: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
b5f0: 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29  ger(pE, &iCol) )
b600: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  {.      if( iCol
b610: 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69  <=0 || iCol>pELi
b620: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
b630: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
b640: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
b650: 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
b660: 20 70 6f 73 69 74 69 6f 6e 20 25 64 20 73 68 6f   position %d sho
b670: 75 6c 64 20 62 65 20 62 65 74 77 65 65 6e 20 31  uld be between 1
b680: 20 61 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20   and %d",.      
b690: 20 20 20 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74      iCol, pEList
b6a0: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
b6b0: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20    nErr++;.      
b6c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
b6d0: 0a 20 20 20 20 20 20 69 66 28 20 21 6d 75 73 74  .      if( !must
b6e0: 43 6f 6d 70 6c 65 74 65 20 29 20 63 6f 6e 74 69  Complete ) conti
b6f0: 6e 75 65 3b 0a 20 20 20 20 20 20 69 43 6f 6c 2d  nue;.      iCol-
b700: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  -;.    }.    for
b710: 28 6a 3d 30 3b 20 69 43 6f 6c 3c 30 20 26 26 20  (j=0; iCol<0 && 
b720: 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  j<pEList->nExpr;
b730: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
b740: 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e   pEList->a[j].zN
b750: 61 6d 65 20 26 26 20 28 70 45 2d 3e 6f 70 3d 3d  ame && (pE->op==
b760: 54 4b 5f 49 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d  TK_ID || pE->op=
b770: 3d 54 4b 5f 53 54 52 49 4e 47 29 20 29 7b 0a 20  =TK_STRING) ){. 
b780: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
b790: 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b 0a 20 20 20  me, *zLabel;.   
b7a0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c       zName = pEL
b7b0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
b7c0: 0a 20 20 20 20 20 20 20 20 7a 4c 61 62 65 6c 20  .        zLabel 
b7d0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
b7e0: 6d 54 6f 6b 65 6e 28 26 70 45 2d 3e 74 6f 6b 65  mToken(&pE->toke
b7f0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  n);.        asse
b800: 72 74 28 20 7a 4c 61 62 65 6c 21 3d 30 20 29 3b  rt( zLabel!=0 );
b810: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
b820: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d  ite3StrICmp(zNam
b830: 65 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30 20 29 7b  e, zLabel)==0 ){
b840: 20 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c   .          iCol
b850: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = j;.        }.
b860: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
b870: 65 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20  ee(zLabel);.    
b880: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43    }.      if( iC
b890: 6f 6c 3c 30 20 26 26 20 73 71 6c 69 74 65 33 45  ol<0 && sqlite3E
b8a0: 78 70 72 43 6f 6d 70 61 72 65 28 70 45 2c 20 70  xprCompare(pE, p
b8b0: 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70  EList->a[j].pExp
b8c0: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43  r) ){.        iC
b8d0: 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a  ol = j;.      }.
b8e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
b8f0: 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ol>=0 ){.      p
b900: 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  E->op = TK_COLUM
b910: 4e 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 43 6f  N;.      pE->iCo
b920: 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  lumn = iCol;.   
b930: 20 20 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20     pE->iTable = 
b940: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 45  iTable;.      pE
b950: 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20  ->iAgg = -1;.   
b960: 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
b970: 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20  ].done = 1;.    
b980: 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  }.    if( iCol<0
b990: 20 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65   && mustComplete
b9a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b9b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
b9c0: 2c 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45 52  ,.        "ORDER
b9d0: 20 42 59 20 74 65 72 6d 20 6e 75 6d 62 65 72 20   BY term number 
b9e0: 25 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  %d does not matc
b9f0: 68 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c  h any result col
ba00: 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20  umn", i+1);.    
ba10: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20    nErr++;.      
ba20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
ba30: 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20  .  return nErr; 
ba40: 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69   .}.#endif /* #i
ba50: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ba60: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
ba70: 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  T */../*.** Get 
ba80: 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67  a VDBE for the g
ba90: 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74  iven parser cont
baa0: 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ext.  Create a n
bab0: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
bac0: 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ary..** If an er
bad0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
bae0: 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76  rn NULL and leav
baf0: 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70  e a message in p
bb00: 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a  Parse..*/.Vdbe *
bb10: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50  sqlite3GetVdbe(P
bb20: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
bb30: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
bb40: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
bb50: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20  v==0 ){.    v = 
bb60: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
bb70: 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74  sqlite3VdbeCreat
bb80: 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  e(pParse->db);. 
bb90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d   }.  return v;.}
bba0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  .../*.** Compute
bbb0: 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20   the iLimit and 
bbc0: 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f  iOffset fields o
bbd0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73  f the SELECT bas
bbe0: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69  ed on the.** pLi
bbf0: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
bc00: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c  expressions.  pL
bc10: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
bc20: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
bc30: 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70  sions.** that ap
bc40: 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67  pear in the orig
bc50: 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
bc60: 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d  nt after the LIM
bc70: 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a  IT and OFFSET.**
bc80: 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e   keywords.  Or N
bc90: 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79  ULL if those key
bca0: 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65  words are omitte
bcb0: 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  d. iLimit and iO
bcc0: 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68  ffset .** are th
bcd0: 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79  e integer memory
bce0: 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
bcf0: 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75  s for counters u
bd00: 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a  sed to compute .
bd10: 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64  ** the limit and
bd20: 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65   offset.  If the
bd30: 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61  re is no limit a
bd40: 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68  nd/or offset, th
bd50: 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e  en .** iLimit an
bd60: 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65  d iOffset are ne
bd70: 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  gative..**.** Th
bd80: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67  is routine chang
bd90: 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
bda0: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
bdb0: 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61  set only if.** a
bdc0: 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74   limit or offset
bdd0: 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
bde0: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
bdf0: 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a  t.  iLimit and.*
be00: 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64  * iOffset should
be10: 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65   have been prese
be20: 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65  t to appropriate
be30: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a   default values.
be40: 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20  ** (usually but 
be50: 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70  not always -1) p
be60: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
be70: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
be80: 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21   Only if pLimit!
be90: 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30  =0 or pOffset!=0
bea0: 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65   do the limit re
beb0: 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72  gisters get.** r
bec0: 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55  edefined.  The U
bed0: 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
bee0: 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70  r uses this prop
bef0: 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a  erty to force.**
bf00: 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68   the reuse of th
bf10: 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64  e same limit and
bf20: 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72   offset register
bf30: 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c  s across multipl
bf40: 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
bf50: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ements..*/.stati
bf60: 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69  c void computeLi
bf70: 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72  mitRegisters(Par
bf80: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
bf90: 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61  ct *p, int iBrea
bfa0: 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  k){.  Vdbe *v = 
bfb0: 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20  0;.  int iLimit 
bfc0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73  = 0;.  int iOffs
bfd0: 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c  et;.  int addr1,
bfe0: 20 61 64 64 72 32 3b 0a 0a 20 20 2f 2a 20 0a 20   addr2;..  /* . 
bff0: 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
c000: 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
c010: 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
c020: 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61  some.  ** contra
c030: 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
c040: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
c050: 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
c060: 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
c070: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
c080: 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
c090: 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
c0a0: 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
c0b0: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
c0c0: 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69   ){.    p->iLimi
c0d0: 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 70 50 61  t = iLimit = pPa
c0e0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70  rse->nMem;.    p
c0f0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32  Parse->nMem += 2
c100: 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ;.    v = sqlite
c110: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
c120: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
c130: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
c140: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
c150: 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  rse, p->pLimit);
c160: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c170: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74  AddOp(v, OP_Must
c180: 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20  BeInt, 0, 0);.  
c190: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c1a0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
c1b0: 65 2c 20 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20  e, iLimit, 0);. 
c1c0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
c1d0: 76 2c 20 22 23 20 4c 49 4d 49 54 20 63 6f 75 6e  v, "# LIMIT coun
c1e0: 74 65 72 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  ter"));.    sqli
c1f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c200: 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 69 4c  OP_IfMemZero, iL
c210: 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  imit, iBreak);. 
c220: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66   }.  if( p->pOff
c230: 73 65 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4f  set ){.    p->iO
c240: 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20  ffset = iOffset 
c250: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
c260: 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ;.    v = sqlite
c270: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
c280: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
c290: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
c2a0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
c2b0: 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29  rse, p->pOffset)
c2c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c2d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73  eAddOp(v, OP_Mus
c2e0: 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20  tBeInt, 0, 0);. 
c2f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c300: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
c310: 72 65 2c 20 69 4f 66 66 73 65 74 2c 20 70 2d 3e  re, iOffset, p->
c320: 70 4c 69 6d 69 74 3d 3d 30 29 3b 0a 20 20 20 20  pLimit==0);.    
c330: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
c340: 22 23 20 4f 46 46 53 45 54 20 63 6f 75 6e 74 65  "# OFFSET counte
c350: 72 22 29 29 3b 0a 20 20 20 20 61 64 64 72 31 20  r"));.    addr1 
c360: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c370: 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f  Op(v, OP_IfMemPo
c380: 73 2c 20 69 4f 66 66 73 65 74 2c 20 30 29 3b 0a  s, iOffset, 0);.
c390: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c3a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
c3b0: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
c3c0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c3d0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
c3e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c3f0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
c400: 72 31 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r1);.    if( p->
c410: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  pLimit ){.      
c420: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c430: 28 76 2c 20 4f 50 5f 41 64 64 2c 20 30 2c 20 30  (v, OP_Add, 0, 0
c440: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
c450: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
c460: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
c470: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c480: 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 4c 69  OP_IfMemPos, iLi
c490: 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  mit, 0);.    sql
c4a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c4b0: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
c4c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c4d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
c4e0: 74 2c 20 2d 31 2c 20 69 4c 69 6d 69 74 2b 31 29  t, -1, iLimit+1)
c4f0: 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  ;.    addr2 = sq
c500: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c510: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29  , OP_Goto, 0, 0)
c520: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c530: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
c540: 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r1);.    sqlite3
c550: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c560: 4d 65 6d 53 74 6f 72 65 2c 20 69 4c 69 6d 69 74  MemStore, iLimit
c570: 2b 31 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65  +1, 1);.    Vdbe
c580: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 4c  Comment((v, "# L
c590: 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a  IMIT+OFFSET"));.
c5a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
c5b0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32  umpHere(v, addr2
c5c0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
c5d0: 41 6c 6c 6f 63 61 74 65 20 61 20 76 69 72 74 75  Allocate a virtu
c5e0: 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  al index to use 
c5f0: 66 6f 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2f 0a  for sorting..*/.
c600: 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61  static void crea
c610: 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 50  teSortingIndex(P
c620: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
c630: 6c 65 63 74 20 2a 70 2c 20 45 78 70 72 4c 69 73  lect *p, ExprLis
c640: 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20 20  t *pOrderBy){.  
c650: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
c660: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
c670: 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
c680: 42 79 2d 3e 69 45 43 75 72 73 6f 72 3d 3d 30 20  By->iECursor==0 
c690: 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d  );.    pOrderBy-
c6a0: 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72  >iECursor = pPar
c6b0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
c6c0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
c6d0: 62 65 41 64 64 4f 70 28 70 50 61 72 73 65 2d 3e  beAddOp(pParse->
c6e0: 70 56 64 62 65 2c 20 4f 50 5f 4f 70 65 6e 45 70  pVdbe, OP_OpenEp
c6f0: 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  hemeral,.       
c700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c710: 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69       pOrderBy->i
c720: 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42  ECursor, pOrderB
c730: 79 2d 3e 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20  y->nExpr+1);.   
c740: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
c750: 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 3d 20 2d  OpenEphm[2] == -
c760: 31 20 29 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72  1 );.    p->addr
c770: 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64  OpenEphm[2] = ad
c780: 64 72 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  dr;.  }.}..#ifnd
c790: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
c7a0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
c7b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
c7c0: 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c  appropriate coll
c7d0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
c7e0: 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  or the iCol-th c
c7f0: 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  olumn of.** the 
c800: 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74  result set for t
c810: 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  he compound-sele
c820: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22  ct statement "p"
c830: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
c840: 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  f.** the column 
c850: 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63  has no default c
c860: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
c870: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  e..**.** The col
c880: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
c890: 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
c8a0: 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e   select is taken
c8b0: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66   from the.** lef
c8c0: 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74  t-most term of t
c8d0: 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68  he select that h
c8e0: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  as a collating s
c8f0: 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  equence..*/.stat
c900: 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74  ic CollSeq *mult
c910: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50  iSelectCollSeq(P
c920: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
c930: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f  lect *p, int iCo
c940: 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  l){.  CollSeq *p
c950: 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  Ret;.  if( p->pP
c960: 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74  rior ){.    pRet
c970: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
c980: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
c990: 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a  >pPrior, iCol);.
c9a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65    }else{.    pRe
c9b0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 0;.  }.  if(
c9c0: 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20   pRet==0 ){.    
c9d0: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
c9e0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
c9f0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  , p->pEList->a[i
ca00: 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  Col].pExpr);.  }
ca10: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
ca20: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
ca30: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
ca40: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e  _SELECT */..#ifn
ca50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ca60: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
ca70: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
ca80: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
ca90: 70 72 6f 63 65 73 73 20 61 20 71 75 65 72 79 20  process a query 
caa0: 74 68 61 74 20 69 73 20 72 65 61 6c 6c 79 20 74  that is really t
cab0: 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69  he union.** or i
cac0: 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74  ntersection of t
cad0: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
cae0: 61 74 65 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a  ate queries..**.
caf0: 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
cb00: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
cb10: 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
cb20: 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
cb30: 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
cb40: 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
cb50: 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
cb60: 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
cb70: 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
cb80: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
cb90: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
cba0: 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
cbb0: 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
cbc0: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
cbd0: 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
cbe0: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
cbf0: 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
cc00: 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
cc10: 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
cc20: 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
cc30: 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
cc40: 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
cc50: 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
cc60: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
cc70: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
cc80: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
cc90: 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
cca0: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
ccb0: 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
ccc0: 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
ccd0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
cce0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
ccf0: 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
cd00: 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
cd10: 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
cd20: 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
cd30: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
cd40: 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
cd50: 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
cd60: 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
cd70: 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
cd80: 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
cd90: 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
cda0: 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
cdb0: 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
cdc0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
cdd0: 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
cde0: 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
cdf0: 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
ce00: 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
ce10: 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
ce20: 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
ce30: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
ce40: 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
ce50: 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
ce60: 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
ce70: 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
ce80: 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
ce90: 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
cea0: 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
ceb0: 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
cec0: 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
ced0: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
cee0: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
cef0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
cf00: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
cf10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
cf20: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
cf30: 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
cf40: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ed */.  int eDes
cf50: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
cf60: 20 5c 5f 5f 5f 20 20 53 74 6f 72 65 20 71 75 65   \___  Store que
cf70: 72 79 20 72 65 73 75 6c 74 73 20 61 73 20 73 70  ry results as sp
cf80: 65 63 69 66 69 65 64 20 2a 2f 0a 20 20 69 6e 74  ecified */.  int
cf90: 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20   iParm,         
cfa0: 20 20 20 2f 2a 20 2f 20 20 20 20 20 62 79 20 74     /* /     by t
cfb0: 68 65 73 65 20 74 77 6f 20 70 61 72 61 6d 65 74  hese two paramet
cfc0: 65 72 73 2e 20 20 20 20 20 20 20 20 20 2a 2f 0a  ers.         */.
cfd0: 20 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20    char *aff     
cfe0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44          /* If eD
cff0: 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e  est is SRT_Union
d000: 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73  , the affinity s
d010: 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tring */.){.  in
d020: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
d030: 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63  ;   /* Success c
d040: 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f  ode from a subro
d050: 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63  utine */.  Selec
d060: 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
d070: 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
d080: 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
d090: 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
d0a0: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
d0b0: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
d0c0: 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
d0d0: 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  DBE */.  int nCo
d0e0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
d0f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
d100: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
d110: 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 4c  t set */.  ExprL
d120: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
d130: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
d140: 20 63 6c 61 75 73 65 20 6f 6e 20 70 20 2a 2f 0a   clause on p */.
d150: 20 20 69 6e 74 20 61 53 65 74 50 32 5b 32 5d 3b    int aSetP2[2];
d160: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 50          /* Set P
d170: 32 20 76 61 6c 75 65 20 6f 66 20 74 68 65 73 65  2 value of these
d180: 20 6f 70 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66   op to number of
d190: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
d1a0: 74 20 6e 53 65 74 50 32 20 3d 20 30 3b 20 20 20  t nSetP2 = 0;   
d1b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d1c0: 20 73 6c 6f 74 73 20 69 6e 20 61 53 65 74 50 32   slots in aSetP2
d1d0: 5b 5d 20 75 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a  [] used */..  /*
d1e0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
d1f0: 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
d200: 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  or LIMIT clause 
d210: 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73  on prior SELECTs
d220: 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65  .  Only.  ** the
d230: 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73   last (right-mos
d240: 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65  t) SELECT in the
d250: 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65   series may have
d260: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
d270: 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 69 66  LIMIT..  */.  if
d280: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72  ( p==0 || p->pPr
d290: 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ior==0 ){.    rc
d2a0: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
d2b0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
d2c0: 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72 20 3d 20  .  }.  pPrior = 
d2d0: 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73  p->pPrior;.  ass
d2e0: 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69  ert( pPrior->pRi
d2f0: 67 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20  ghtmost!=pPrior 
d300: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  );.  assert( pPr
d310: 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ior->pRightmost=
d320: 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 29  =p->pRightmost )
d330: 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
d340: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
d350: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d360: 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59  pParse,"ORDER BY
d370: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
d380: 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
d390: 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
d3a0: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
d3b0: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
d3c0: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
d3d0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
d3e0: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
d3f0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
d400: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
d410: 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73  rse,"LIMIT claus
d420: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
d430: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
d440: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
d450: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
d460: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
d470: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
d480: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
d490: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
d4a0: 76 65 20 61 20 76 61 6c 69 64 20 71 75 65 72 79  ve a valid query
d4b0: 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74   engine.  If not
d4c0: 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f  , create a new o
d4d0: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  ne..  */.  v = s
d4e0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
d4f0: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
d500: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  0 ){.    rc = 1;
d510: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
d520: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
d530: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
d540: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d   destination tem
d550: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20  porary table if 
d560: 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20  necessary.  */. 
d570: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
d580: 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
d590: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
d5a0: 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
d5b0: 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66 28 61   nSetP2<sizeof(a
d5c0: 53 65 74 50 32 29 2f 73 69 7a 65 6f 66 28 61 53  SetP2)/sizeof(aS
d5d0: 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20 20 20  etP2[0]) );.    
d5e0: 61 53 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d  aSetP2[nSetP2++]
d5f0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
d600: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  dOp(v, OP_OpenEp
d610: 68 65 6d 65 72 61 6c 2c 20 69 50 61 72 6d 2c 20  hemeral, iParm, 
d620: 30 29 3b 0a 20 20 20 20 65 44 65 73 74 20 3d 20  0);.    eDest = 
d630: 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a  SRT_Table;.  }..
d640: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
d650: 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20  de for the left 
d660: 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54  and right SELECT
d670: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
d680: 2f 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  /.  pOrderBy = p
d690: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 73 77  ->pOrderBy;.  sw
d6a0: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
d6b0: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
d6c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  {.      if( pOrd
d6d0: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
d6e0: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b     int addr = 0;
d6f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d700: 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74   !pPrior->pLimit
d710: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69   );.        pPri
d720: 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->pLimit = p->
d730: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  pLimit;.        
d740: 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20  pPrior->pOffset 
d750: 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
d760: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d770: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
d780: 20 70 50 72 69 6f 72 2c 20 65 44 65 73 74 2c 20   pPrior, eDest, 
d790: 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20  iParm, 0, 0, 0, 
d7a0: 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  aff);.        p-
d7b0: 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
d7c0: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
d7d0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
d7e0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
d7f0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
d800: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
d810: 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72  }.        p->pPr
d820: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ior = 0;.       
d830: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72   p->iLimit = pPr
d840: 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ior->iLimit;.   
d850: 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
d860: 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65  = pPrior->iOffse
d870: 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
d880: 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20  ->iLimit>=0 ){. 
d890: 20 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20           addr = 
d8a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d8b0: 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f  (v, OP_IfMemZero
d8c0: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 30 29 3b  , p->iLimit, 0);
d8d0: 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
d8e0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 4a 75  omment((v, "# Ju
d8f0: 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49  mp ahead if LIMI
d900: 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20  T reached"));.  
d910: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d920: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
d930: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44  ct(pParse, p, eD
d940: 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30  est, iParm, 0, 0
d950: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
d960: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
d970: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69  Prior;.        i
d980: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
d990: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
d9a0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
d9b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
d9c0: 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  addr ){.        
d9d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
d9e0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
d9f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
da00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
da10: 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e  .      /* For UN
da20: 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45  ION ALL ... ORDE
da30: 52 20 42 59 20 66 61 6c 6c 20 74 68 72 6f 75 67  R BY fall throug
da40: 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61  h to the next ca
da50: 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  se */.    }.    
da60: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a  case TK_EXCEPT:.
da70: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f      case TK_UNIO
da80: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75  N: {.      int u
da90: 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43  nionTab;    /* C
daa0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
dab0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
dac0: 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ble holding resu
dad0: 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lt */.      int 
dae0: 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  op = 0;      /* 
daf0: 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20  One of the SRT_ 
db00: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70  operations to ap
db10: 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20  ply to self */. 
db20: 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70       int priorOp
db30: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54  ;     /* The SRT
db40: 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61  _ operation to a
db50: 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65  pply to prior se
db60: 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45  lects */.      E
db70: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
db80: 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20  ffset; /* Saved 
db90: 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69  values of p->nLi
dba0: 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73  mit and p->nOffs
dbb0: 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  et */.      int 
dbc0: 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 70 72 69  addr;..      pri
dbd0: 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b  orOp = p->op==TK
dbe0: 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65  _ALL ? SRT_Table
dbf0: 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   : SRT_Union;.  
dc00: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 70      if( eDest==p
dc10: 72 69 6f 72 4f 70 20 26 26 20 70 4f 72 64 65 72  riorOp && pOrder
dc20: 42 79 3d 3d 30 20 26 26 20 21 70 2d 3e 70 4c 69  By==0 && !p->pLi
dc30: 6d 69 74 20 26 26 20 21 70 2d 3e 70 4f 66 66 73  mit && !p->pOffs
dc40: 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  et ){.        /*
dc50: 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20   We can reuse a 
dc60: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
dc70: 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53  generated by a S
dc80: 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20  ELECT to our.   
dc90: 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20       ** right.. 
dca0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
dcb0: 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61    unionTab = iPa
dcc0: 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  rm;.      }else{
dcd0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77  .        /* We w
dce0: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61  ill need to crea
dcf0: 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f  te our own tempo
dd00: 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f  rary table to ho
dd10: 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ld the.        *
dd20: 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
dd30: 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20  esults..        
dd40: 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
dd50: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
dd60: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66  ab++;.        if
dd70: 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61  ( pOrderBy && ma
dd80: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
dd90: 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f  mn(pParse, p, pO
dda0: 72 64 65 72 42 79 2c 20 75 6e 69 6f 6e 54 61 62  rderBy, unionTab
ddb0: 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ,1) ){.         
ddc0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
ddd0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
dde0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
ddf0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72    }.        addr
de00: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
de10: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  dOp(v, OP_OpenEp
de20: 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61  hemeral, unionTa
de30: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  b, 0);.        i
de40: 66 28 20 70 72 69 6f 72 4f 70 3d 3d 53 52 54 5f  f( priorOp==SRT_
de50: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Table ){.       
de60: 20 20 20 61 73 73 65 72 74 28 20 6e 53 65 74 50     assert( nSetP
de70: 32 3c 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29  2<sizeof(aSetP2)
de80: 2f 73 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30  /sizeof(aSetP2[0
de90: 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ]) );.          
dea0: 61 53 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d  aSetP2[nSetP2++]
deb0: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
dec0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ded0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
dee0: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
def0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1 );.          
df00: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
df10: 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
df20: 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f       p->pRightmo
df30: 73 74 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20 31  st->usesEphm = 1
df40: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
df50: 20 20 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e      createSortin
df60: 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  gIndex(pParse, p
df70: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
df80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
df90: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
dfa0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
dfb0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
dfc0: 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65  ements to our le
dfd0: 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ft.      */.    
dfe0: 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
dff0: 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  r->pOrderBy );. 
e000: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e010: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
e020: 70 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c  pPrior, priorOp,
e030: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c   unionTab, 0, 0,
e040: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
e050: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
e060: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
e070: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
e080: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
e090: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
e0a0: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
e0b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74     */.      swit
e0c0: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
e0d0: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58        case TK_EX
e0e0: 43 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f  CEPT:  op = SRT_
e0f0: 45 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b 3b  Except;   break;
e100: 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54  .         case T
e110: 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20  K_UNION:   op = 
e120: 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72  SRT_Union;    br
e130: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61  eak;.         ca
e140: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f  se TK_ALL:     o
e150: 70 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20 20  p = SRT_Table;  
e160: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
e170: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
e180: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = 0;.      p->p
e190: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
e1a0: 20 20 20 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72     p->disallowOr
e1b0: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
e1c0: 21 3d 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69  !=0;.      pLimi
e1d0: 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
e1e0: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
e1f0: 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65   0;.      pOffse
e200: 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
e210: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
e220: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
e230: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
e240: 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e  Parse, p, op, un
e250: 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c  ionTab, 0, 0, 0,
e260: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e   aff);.      p->
e270: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
e280: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
e290: 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
e2a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
e2b0: 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74  Delete(p->pLimit
e2c0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
e2d0: 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
e2e0: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
e2f0: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
e300: 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20  ->iLimit = -1;. 
e310: 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
e320: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20  = -1;.      if( 
e330: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
e340: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
e350: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20  end;.      }... 
e360: 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
e370: 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20  the data in the 
e380: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
e390: 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f  into whatever fo
e3a0: 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  rm.      ** it i
e3b0: 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e  s that we curren
e3c0: 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  tly need..      
e3d0: 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20 69  */      .      i
e3e0: 66 28 20 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  f( eDest!=priorO
e3f0: 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d 69  p || unionTab!=i
e400: 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Parm ){.        
e410: 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
e420: 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
e430: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
e440: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
e450: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
e460: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
e470: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
e480: 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
e490: 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
e4a0: 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
e4b0: 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
e4c0: 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65  or;.          ge
e4d0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
e4e0: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
e4f0: 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
e500: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e510: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
e520: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
e530: 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20  ;.        iCont 
e540: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
e550: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
e560: 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
e570: 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
e580: 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
e590: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e5a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
e5b0: 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42  nd, unionTab, iB
e5c0: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69  reak);.        i
e5d0: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
e5e0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
e5f0: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
e600: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
e610: 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
e620: 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  List, unionTab, 
e630: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
e640: 2c 0a 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 20 20 20 20 70                 p
e660: 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65  OrderBy, -1, eDe
e670: 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20  st, iParm, .    
e680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e690: 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20           iCont, 
e6a0: 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20  iBreak, 0);.    
e6b0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
e6c0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
e6d0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
e6e0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
e6f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
e710: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
e720: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ont);.        sq
e730: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
e740: 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e  , OP_Next, union
e750: 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  Tab, iStart);.  
e760: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e770: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
e780: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
e790: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e7a0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
e7b0: 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
e7c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
e7d0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
e7e0: 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20  e TK_INTERSECT: 
e7f0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31  {.      int tab1
e800: 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e  , tab2;.      in
e810: 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
e820: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45   iStart;.      E
e830: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
e840: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74  ffset;.      int
e850: 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 2f 2a   addr;..      /*
e860: 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
e870: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
e880: 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
e890: 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
e8a0: 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  ** two temporary
e8b0: 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20   tables.  Hence 
e8c0: 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63  it has its own c
e8d0: 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20  ase.  Begin.    
e8e0: 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
e8f0: 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
e900: 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
e910: 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20    */.      tab1 
e920: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
e930: 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70  ;.      tab2 = p
e940: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
e950: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
e960: 79 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62  y && matchOrderb
e970: 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  yToColumn(pParse
e980: 2c 70 2c 70 4f 72 64 65 72 42 79 2c 74 61 62 31  ,p,pOrderBy,tab1
e990: 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ,1) ){.        r
e9a0: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
e9b0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
e9c0: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
e9d0: 20 20 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e      createSortin
e9e0: 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  gIndex(pParse, p
e9f0: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20  , pOrderBy);..  
ea00: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
ea10: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ea20: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
ea30: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
ea40: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
ea50: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
ea60: 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  1 );.      p->ad
ea70: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
ea80: 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  addr;.      p->p
ea90: 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 45  Rightmost->usesE
eaa0: 70 68 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 61  phm = 1;.      a
eab0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
eac0: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   );..      /* Co
ead0: 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
eae0: 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
eaf0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
eb00: 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f  "tab1"..      */
eb10: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
eb20: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
eb30: 2c 20 70 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e  , pPrior, SRT_Un
eb40: 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c  ion, tab1, 0, 0,
eb50: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
eb60: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
eb70: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
eb80: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
eb90: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
eba0: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
ebb0: 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  CT into temporar
ebc0: 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20  y table "tab2". 
ebd0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
ebe0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
ebf0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
ec00: 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c  Ephemeral, tab2,
ec10: 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
ec20: 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
ec30: 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[1] == -1 );. 
ec40: 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
ec50: 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[1] = addr;.
ec60: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
ec70: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69  = 0;.      pLimi
ec80: 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
ec90: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
eca0: 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65   0;.      pOffse
ecb0: 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
ecc0: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
ecd0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
ece0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
ecf0: 50 61 72 73 65 2c 20 70 2c 20 53 52 54 5f 55 6e  Parse, p, SRT_Un
ed00: 69 6f 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30 2c  ion, tab2, 0, 0,
ed10: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
ed20: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
ed30: 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  or;.      sqlite
ed40: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
ed50: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d  Limit);.      p-
ed60: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
ed70: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
ed80: 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
ed90: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
eda0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
edb0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
edc0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
edd0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
ede0: 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65  take the interse
edf0: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f  ction of the two
ee00: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20   temporary.     
ee10: 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20   ** tables..    
ee20: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
ee30: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
ee40: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
ee50: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
ee60: 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
ee70: 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20  *pFirst = p;.   
ee80: 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
ee90: 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
eea0: 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
eeb0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65  rior;.        ge
eec0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
eed0: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
eee0: 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
eef0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65      }.      iBre
ef00: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
ef10: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
ef20: 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
ef30: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
ef40: 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75  (v);.      compu
ef50: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
ef60: 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
ef70: 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
ef80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ef90: 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20  P_Rewind, tab1, 
efa0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 69  iBreak);.      i
efb0: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
efc0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
efd0: 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 30 29 3b  owKey, tab1, 0);
efe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
eff0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
f000: 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43  tFound, tab2, iC
f010: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ont);.      rc =
f020: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
f030: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
f040: 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e  EList, tab1, p->
f050: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20  pEList->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 20 20 20 20 70 4f 72 64              pOrd
f080: 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c  erBy, -1, eDest,
f090: 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20   iParm, .       
f0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0b0: 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72        iCont, iBr
f0c0: 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  eak, 0);.      i
f0d0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
f0e0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
f0f0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
f100: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
f110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f120: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
f130: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73   iCont);.      s
f140: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f150: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31  v, OP_Next, tab1
f160: 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20  , iStart);.     
f170: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
f180: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
f190: 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
f1a0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f1b0: 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30  P_Close, tab2, 0
f1c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f1d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f1e0: 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b  Close, tab1, 0);
f1f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f200: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
f210: 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45  ke sure all SELE
f220: 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  CTs in the state
f230: 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61  ment have the sa
f240: 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  me number of ele
f250: 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68  ments.  ** in th
f260: 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e  eir result sets.
f270: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
f280: 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72  p->pEList && pPr
f290: 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ior->pEList );. 
f2a0: 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   if( p->pEList->
f2b0: 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70  nExpr!=pPrior->p
f2c0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
f2d0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f2e0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c  Msg(pParse, "SEL
f2f0: 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ECTs to the left
f300: 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73   and right of %s
f310: 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74  ".      " do not
f320: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
f330: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
f340: 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74  columns", select
f350: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
f360: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
f370: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
f380: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
f390: 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
f3a0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 65  of columns in te
f3b0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 0a 20  mporary tables. 
f3c0: 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e   */.  nCol = p->
f3d0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
f3e0: 20 77 68 69 6c 65 28 20 6e 53 65 74 50 32 20 29   while( nSetP2 )
f3f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
f400: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 53 65  eChangeP2(v, aSe
f410: 74 50 32 5b 2d 2d 6e 53 65 74 50 32 5d 2c 20 6e  tP2[--nSetP2], n
f420: 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Col);.  }..  /* 
f430: 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e  Compute collatin
f440: 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64  g sequences used
f450: 20 62 79 20 65 69 74 68 65 72 20 74 68 65 20 4f   by either the O
f460: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
f470: 72 0a 20 20 2a 2a 20 62 79 20 61 6e 79 20 74 65  r.  ** by any te
f480: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e  mporary tables n
f490: 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65  eeded to impleme
f4a0: 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  nt the compound 
f4b0: 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74  select..  ** Att
f4c0: 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  ach the KeyInfo 
f4d0: 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c  structure to all
f4e0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
f4f0: 73 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 0a 20  s.  Invoke the. 
f500: 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 70 72 6f   ** ORDER BY pro
f510: 63 65 73 73 69 6e 67 20 69 66 20 74 68 65 72 65  cessing if there
f520: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
f530: 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
f540: 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69  * This section i
f550: 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67  s run by the rig
f560: 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ht-most SELECT s
f570: 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20  tatement only.. 
f580: 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
f590: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66  ments to the lef
f5a0: 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68  t always skip th
f5b0: 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69  is part.  The ri
f5c0: 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45  ght-most.  ** SE
f5d0: 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20  LECT might also 
f5e0: 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69  skip this part i
f5f0: 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45  f it has no ORDE
f600: 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a  R BY clause and.
f610: 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62    ** no temp tab
f620: 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  les are required
f630: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
f640: 64 65 72 42 79 20 7c 7c 20 70 2d 3e 75 73 65 73  derBy || p->uses
f650: 45 70 68 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20  Ephm ){.    int 
f660: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
f670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
f680: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
f690: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
f6a0: 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
f6b0: 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
f6c0: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73  ence for the res
f6d0: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53  ult set */.    S
f6e0: 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20  elect *pLoop;   
f6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f700: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
f710: 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65  ugh SELECT state
f720: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  ments */.    int
f730: 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20   nKeyCol;       
f740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
f750: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
f760: 69 6e 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  in pKeyInfo->aCo
f770: 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  l[] */.    CollS
f780: 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 0a 20 20 20  eq **apColl;.   
f790: 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 43 6f 70 79   CollSeq **aCopy
f7a0: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
f7b0: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20  ->pRightmost==p 
f7c0: 29 3b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d  );.    nKeyCol =
f7d0: 20 6e 43 6f 6c 20 2b 20 28 70 4f 72 64 65 72 42   nCol + (pOrderB
f7e0: 79 20 3f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y ? pOrderBy->nE
f7f0: 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 70 4b  xpr : 0);.    pK
f800: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d  eyInfo = sqliteM
f810: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4b  alloc(sizeof(*pK
f820: 65 79 49 6e 66 6f 29 2b 6e 4b 65 79 43 6f 6c 2a  eyInfo)+nKeyCol*
f830: 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
f840: 29 20 2b 20 31 29 29 3b 0a 20 20 20 20 69 66 28  ) + 1));.    if(
f850: 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
f860: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f870: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
f880: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
f890: 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  nd;.    }..    p
f8a0: 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45  KeyInfo->enc = E
f8b0: 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  NC(pParse->db);.
f8c0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46      pKeyInfo->nF
f8d0: 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20  ield = nCol;..  
f8e0: 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c    for(i=0, apCol
f8f0: 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  l=pKeyInfo->aCol
f900: 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  l; i<nCol; i++, 
f910: 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20  apColl++){.     
f920: 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69   *apColl = multi
f930: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
f940: 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20  arse, p, i);.   
f950: 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c     if( 0==*apCol
f960: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70  l ){.        *ap
f970: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
f980: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
f990: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
f9a0: 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c   for(pLoop=p; pL
f9b0: 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
f9c0: 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
f9d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
f9e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
f9f0: 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61   addr = pLoop->a
fa00: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a  ddrOpenEphm[i];.
fa10: 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72          if( addr
fa20: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
fa30: 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75  /* If [0] is unu
fa40: 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20  sed then [1] is 
fa50: 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f  also unused.  So
fa60: 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20   we can.        
fa70: 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65    ** always safe
fa80: 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e  ly abort as soon
fa90: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e   as the first un
faa0: 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75  used slot is fou
fab0: 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
fac0: 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61  assert( pLoop->a
fad0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30  ddrOpenEphm[1]<0
fae0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   );.          br
faf0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
fb00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
fb10: 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
fb20: 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  dr, nCol);.     
fb30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
fb40: 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
fb50: 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
fb60: 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P3_KEYINFO);.  
fb70: 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64        pLoop->add
fb80: 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d  rOpenEphm[i] = -
fb90: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
fba0: 0a 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  ..    if( pOrder
fbb0: 42 79 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  By ){.      stru
fbc0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
fbd0: 20 2a 70 4f 54 65 72 6d 20 3d 20 70 4f 72 64 65   *pOTerm = pOrde
fbe0: 72 42 79 2d 3e 61 3b 0a 20 20 20 20 20 20 69 6e  rBy->a;.      in
fbf0: 74 20 6e 4f 72 64 65 72 42 79 45 78 70 72 20 3d  t nOrderByExpr =
fc00: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
fc10: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
fc20: 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 53 6f 72  ;.      u8 *pSor
fc30: 74 4f 72 64 65 72 3b 0a 0a 20 20 20 20 20 20 61  tOrder;..      a
fc40: 43 6f 70 79 20 3d 20 26 70 4b 65 79 49 6e 66 6f  Copy = &pKeyInfo
fc50: 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79  ->aColl[nOrderBy
fc60: 45 78 70 72 5d 3b 0a 20 20 20 20 20 20 70 53 6f  Expr];.      pSo
fc70: 72 74 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e  rtOrder = pKeyIn
fc80: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  fo->aSortOrder =
fc90: 20 28 75 38 2a 29 26 61 43 6f 70 79 5b 6e 43 6f   (u8*)&aCopy[nCo
fca0: 6c 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  l];.      memcpy
fcb0: 28 61 43 6f 70 79 2c 20 70 4b 65 79 49 6e 66 6f  (aCopy, pKeyInfo
fcc0: 2d 3e 61 43 6f 6c 6c 2c 20 6e 43 6f 6c 2a 73 69  ->aColl, nCol*si
fcd0: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29 3b  zeof(CollSeq*));
fce0: 0a 20 20 20 20 20 20 61 70 43 6f 6c 6c 20 3d 20  .      apColl = 
fcf0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b  pKeyInfo->aColl;
fd00: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
fd10: 69 3c 6e 4f 72 64 65 72 42 79 45 78 70 72 3b 20  i<nOrderByExpr; 
fd20: 69 2b 2b 2c 20 70 4f 54 65 72 6d 2b 2b 2c 20 61  i++, pOTerm++, a
fd30: 70 43 6f 6c 6c 2b 2b 2c 20 70 53 6f 72 74 4f 72  pColl++, pSortOr
fd40: 64 65 72 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  der++){.        
fd50: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
fd60: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
fd70: 20 20 20 20 20 69 66 28 20 28 70 45 78 70 72 2d       if( (pExpr-
fd80: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
fd90: 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20  ollate) ){.     
fda0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
fdb0: 70 72 2d 3e 70 43 6f 6c 6c 21 3d 30 20 29 3b 0a  pr->pColl!=0 );.
fdc0: 20 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c            *apCol
fdd0: 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  l = pExpr->pColl
fde0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
fdf0: 0a 20 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f  .          *apCo
fe00: 6c 6c 20 3d 20 61 43 6f 70 79 5b 70 45 78 70 72  ll = aCopy[pExpr
fe10: 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20  ->iColumn];.    
fe20: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
fe30: 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 54 65  SortOrder = pOTe
fe40: 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  rm->sortOrder;. 
fe50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
fe60: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f  ert( p->pRightmo
fe70: 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 61  st==p );.      a
fe80: 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
fe90: 65 6e 45 70 68 6d 5b 32 5d 3e 3d 30 20 29 3b 0a  enEphm[2]>=0 );.
fea0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e        addr = p->
feb0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 3b  addrOpenEphm[2];
fec0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fed0: 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
fee0: 64 72 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  dr, p->pEList->n
fef0: 45 78 70 72 2b 32 29 3b 0a 20 20 20 20 20 20 70  Expr+2);.      p
ff00: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
ff10: 3d 20 6e 4f 72 64 65 72 42 79 45 78 70 72 3b 0a  = nOrderByExpr;.
ff20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ff30: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
ff40: 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  r, (char*)pKeyIn
ff50: 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P3_KEYINFO_H
ff60: 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 70  ANDOFF);.      p
ff70: 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20  KeyInfo = 0;.   
ff80: 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
ff90: 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76  ail(pParse, p, v
ffa0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
ffb0: 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  pr, eDest, iParm
ffc0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  );.    }..    sq
ffd0: 6c 69 74 65 46 72 65 65 28 70 4b 65 79 49 6e 66  liteFree(pKeyInf
ffe0: 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73  o);.  }..multi_s
fff0: 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 72 65 74  elect_end:.  ret
10000 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
10010 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
10020 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
10030 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
10040 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
10050 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20  ** Scan through 
10060 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
10070 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65  Expr.  Replace e
10080 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
10090 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  o.** a column in
100a0 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
100b0 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79  able with a copy
100c0 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d   of the iColumn-
100d0 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70  th.** entry in p
100e0 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61  EList.  (But lea
100f0 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ve references to
10100 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   the ROWID colum
10110 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  n .** unchanged.
10120 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ).**.** This rou
10130 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20  tine is part of 
10140 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70  the flattening p
10150 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62  rocedure.  A sub
10160 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72  query.** whose r
10170 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66  esult set is def
10180 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61  ined by pEList a
10190 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20  ppears as entry 
101a0 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  in the.** FROM c
101b0 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
101c0 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  T such that the 
101d0 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69  VDBE cursor assi
101e0 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20  gned to that.** 
101f0 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FORM clause entr
10200 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68  y is iTable.  Th
10210 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20  is routine make 
10220 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a  the necessary .*
10230 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78  * changes to pEx
10240 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65  pr so that it re
10250 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f  fers directly to
10260 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
10270 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71  e.** of the subq
10280 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20  uery rather the 
10290 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
102a0 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73  e subquery..*/.s
102b0 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
102c0 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73  ExprList(ExprLis
102d0 74 2a 2c 69 6e 74 2c 45 78 70 72 4c 69 73 74 2a  t*,int,ExprList*
102e0 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 44  );  /* Forward D
102f0 65 63 6c 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ecl */.static vo
10300 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 53  id substSelect(S
10310 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78  elect *, int, Ex
10320 70 72 4c 69 73 74 20 2a 29 3b 20 20 2f 2a 20 46  prList *);  /* F
10330 6f 72 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73  orward Decl */.s
10340 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
10350 45 78 70 72 28 45 78 70 72 20 2a 70 45 78 70 72  Expr(Expr *pExpr
10360 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78  , int iTable, Ex
10370 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b  prList *pEList){
10380 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
10390 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
103a0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
103b0 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
103c0 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b  Table==iTable ){
103d0 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
103e0 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
103f0 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
10400 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  K_NULL;.    }els
10410 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
10420 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72  New;.      asser
10430 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20  t( pEList!=0 && 
10440 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
10450 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
10460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
10470 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
10480 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
10490 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73  0 && pExpr->pLis
104a0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e  t==0 );.      pN
104b0 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70  ew = pEList->a[p
104c0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70  Expr->iColumn].p
104d0 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
104e0 72 74 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20  rt( pNew!=0 );. 
104f0 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
10500 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20   pNew->op;.     
10510 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
10520 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pLeft==0 );.    
10530 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
10540 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
10550 70 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  pNew->pLeft);.  
10560 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
10570 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
10580 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69        pExpr->pRi
10590 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
105a0 72 44 75 70 28 70 4e 65 77 2d 3e 70 52 69 67 68  rDup(pNew->pRigh
105b0 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
105c0 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d  ( pExpr->pList==
105d0 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
105e0 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  ->pList = sqlite
105f0 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 4e 65  3ExprListDup(pNe
10600 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  w->pList);.     
10610 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
10620 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20   pNew->iTable;. 
10630 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62       pExpr->pTab
10640 20 3d 20 70 4e 65 77 2d 3e 70 54 61 62 3b 0a 20   = pNew->pTab;. 
10650 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
10660 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c  umn = pNew->iCol
10670 75 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78 70 72  umn;.      pExpr
10680 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69  ->iAgg = pNew->i
10690 41 67 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Agg;.      sqlit
106a0 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78  e3TokenCopy(&pEx
106b0 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77  pr->token, &pNew
106c0 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
106d0 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
106e0 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26  (&pExpr->span, &
106f0 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  pNew->span);.   
10700 20 20 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63     pExpr->pSelec
10710 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
10720 74 44 75 70 28 70 4e 65 77 2d 3e 70 53 65 6c 65  tDup(pNew->pSele
10730 63 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ct);.      pExpr
10740 2d 3e 66 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e  ->flags = pNew->
10750 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  flags;.    }.  }
10760 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45  else{.    substE
10770 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  xpr(pExpr->pLeft
10780 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
10790 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
107a0 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  (pExpr->pRight, 
107b0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
107c0 0a 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74  .    substSelect
107d0 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c  (pExpr->pSelect,
107e0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
107f0 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  ;.    substExprL
10800 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ist(pExpr->pList
10810 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
10820 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
10830 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
10840 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  st(ExprList *pLi
10850 73 74 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  st, int iTable, 
10860 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
10870 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
10880 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
10890 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
108a0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
108b0 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45  i++){.    substE
108c0 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  xpr(pList->a[i].
108d0 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70  pExpr, iTable, p
108e0 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74  EList);.  }.}.st
108f0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
10900 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c  elect(Select *p,
10910 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70   int iTable, Exp
10920 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a  rList *pEList){.
10930 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
10940 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  n;.  substExprLi
10950 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54  st(p->pEList, iT
10960 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
10970 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
10980 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62  ->pGroupBy, iTab
10990 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
109a0 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
109b0 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65  pOrderBy, iTable
109c0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
109d0 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  stExpr(p->pHavin
109e0 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  g, iTable, pELis
109f0 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28  t);.  substExpr(
10a00 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c  p->pWhere, iTabl
10a10 65 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 23 65  e, pEList);.}.#e
10a20 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
10a30 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
10a40 57 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  W) */..#ifndef S
10a50 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
10a60 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
10a70 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
10a80 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
10a90 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70  s in order to sp
10aa0 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  eed.** execution
10ab0 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20  .  It returns 1 
10ac0 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e  if it makes chan
10ad0 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20  ges and 0 if no 
10ae0 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63  flattening.** oc
10af0 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75  curs..**.** To u
10b00 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f  nderstand the co
10b10 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e  ncept of flatten
10b20 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68  ing, consider th
10b30 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71  e following.** q
10b40 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
10b50 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53  SELECT a FROM (S
10b60 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
10b70 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
10b80 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a  00) WHERE a>5.**
10b90 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
10ba0 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74  way of implement
10bb0 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69  ing this query i
10bc0 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
10bd0 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72  .** subquery fir
10be0 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  st and store the
10bf0 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65   results in a te
10c00 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74  mporary table, t
10c10 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f  hen.** run the o
10c20 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68  uter query on th
10c30 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  at temporary tab
10c40 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72  le.  This requir
10c50 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73  es two.** passes
10c60 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20   over the data. 
10c70 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65   Furthermore, be
10c80 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72  cause the tempor
10c90 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73  ary table.** has
10ca0 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65   no indices, the
10cb0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e   WHERE clause on
10cc0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
10cd0 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70   cannot be.** op
10ce0 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  timized..**.** T
10cf0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
10d00 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20  mpts to rewrite 
10d10 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20  queries such as 
10d20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a  the above into.*
10d30 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  * a single flat 
10d40 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69  select, like thi
10d50 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
10d60 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
10d70 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
10d80 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54   AND a>5.**.** T
10d90 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
10da0 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69  d for this simpi
10db0 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74  fication gives t
10dc0 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a  he same result.*
10dd0 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74  * but only has t
10de0 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20  o scan the data 
10df0 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75  once.  And becau
10e00 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74  se indices might
10e10 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68   .** exist on th
10e20 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f  e table t1, a co
10e30 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74  mplete scan of t
10e40 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65  he data might be
10e50 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a  .** avoided..**.
10e60 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73  ** Flattening is
10e70 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
10e80 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
10e90 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
10ea0 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54  :.**.**   (1)  T
10eb0 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
10ec0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
10ed0 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
10ee0 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
10ef0 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62  *   (2)  The sub
10f00 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
10f10 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65  aggregate or the
10f20 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
10f30 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
10f40 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62  *   (3)  The sub
10f50 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65  query is not the
10f60 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
10f70 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a  f a left outer j
10f80 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20  oin, or.**      
10f90 20 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69    the subquery i
10fa0 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a  s not itself a j
10fb0 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33  oin.  (Ticket #3
10fc0 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  06).**.**   (4) 
10fd0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
10fe0 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72   not DISTINCT or
10ff0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
11000 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
11010 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65  **.**   (5)  The
11020 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
11030 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65   DISTINCT or the
11040 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
11050 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  s not use.**    
11060 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a      aggregates..
11070 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65  **.**   (6)  The
11080 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
11090 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65  ot use aggregate
110a0 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  s or the outer q
110b0 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20  uery is not.**  
110c0 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a        DISTINCT..
110d0 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65  **.**   (7)  The
110e0 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20   subquery has a 
110f0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
11100 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75  **   (8)  The su
11110 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
11120 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
11130 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
11140 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
11150 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62  *   (9)  The sub
11160 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
11170 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
11180 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
11190 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
111a0 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
111b0 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20  *.**  (10)  The 
111c0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
111d0 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
111e0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
111f0 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ery does not.** 
11200 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54         use LIMIT
11210 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54  ..**.**  (11)  T
11220 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
11230 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
11240 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65  do not both have
11250 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
11260 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20  s..**.**  (12)  
11270 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
11280 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 74 65  not the right te
11290 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  rm of a LEFT OUT
112a0 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a  ER JOIN or the.*
112b0 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72  *        subquer
112c0 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63  y has no WHERE c
112d0 6c 61 75 73 65 2e 20 20 28 61 64 64 65 64 20 62  lause.  (added b
112e0 79 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a 2a  y ticket #350).*
112f0 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20  *.**  (13)  The 
11300 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74  subquery and out
11310 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
11320 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 0a 2a  both use LIMIT.*
11330 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20  *.**  (14)  The 
11340 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
11350 74 20 75 73 65 20 4f 46 46 53 45 54 0a 2a 2a 0a  t use OFFSET.**.
11360 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
11370 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
11380 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
11390 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
113a0 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
113b0 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
113c0 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
113d0 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
113e0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
113f0 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
11400 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73  s and subqueryIs
11410 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
11420 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
11430 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
11440 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
11450 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
11460 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
11470 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
11480 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20  eturns 0..** If 
11490 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74  flattening is at
114a0 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75  tempted this rou
114b0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a  tine returns 1..
114c0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
114d0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
114e0 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20  ysis must occur 
114f0 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65  on both the oute
11500 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74  r query and.** t
11510 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f  he subquery befo
11520 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
11530 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  runs..*/.static 
11540 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75  int flattenSubqu
11550 65 72 79 28 0a 20 20 53 65 6c 65 63 74 20 2a 70  ery(.  Select *p
11560 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
11570 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74  he parent or out
11580 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  er SELECT statem
11590 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72  ent */.  int iFr
115a0 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  om,           /*
115b0 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72   Index in p->pSr
115c0 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e  c->a[] of the in
115d0 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ner subquery */.
115e0 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20    int isAgg,    
115f0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
11600 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75  f outer SELECT u
11610 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
11620 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  nctions */.  int
11630 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 20   subqueryIsAgg  
11640 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
11650 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
11660 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
11670 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63  ns */.){.  Selec
11680 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f  t *pSub;       /
11690 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  * The inner quer
116a0 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20  y or "subquery" 
116b0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
116c0 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
116d0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
116e0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
116f0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75  /.  SrcList *pSu
11700 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  bSrc;   /* The F
11710 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
11720 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
11730 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
11740 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
11750 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74  t set of the out
11760 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  er query */.  in
11770 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20  t iParent;      
11780 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72    /* VDBE cursor
11790 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
117a0 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74  Sub result set t
117b0 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  emp table */.  i
117c0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
117d0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
117e0 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  er */.  Expr *pW
117f0 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 20  here;           
11800 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11810 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
11820 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
11830 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b  _item *pSubitem;
11840 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
11850 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  ry */..  /* Chec
11860 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74  k to see if flat
11870 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
11880 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ted.  Return 0 i
11890 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  f not..  */.  if
118a0 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
118b0 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  0;.  pSrc = p->p
118c0 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
118d0 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20  Src && iFrom>=0 
118e0 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e  && iFrom<pSrc->n
118f0 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65  Src );.  pSubite
11900 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72  m = &pSrc->a[iFr
11910 6f 6d 5d 3b 0a 20 20 70 53 75 62 20 3d 20 70 53  om];.  pSub = pS
11920 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
11930 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21  .  assert( pSub!
11940 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67  =0 );.  if( isAg
11950 67 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41  g && subqueryIsA
11960 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  gg ) return 0;  
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11980 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
11990 29 20 20 2a 2f 0a 20 20 69 66 28 20 73 75 62 71  )  */.  if( subq
119a0 75 65 72 79 49 73 41 67 67 20 26 26 20 70 53 72  ueryIsAgg && pSr
119b0 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75  c->nSrc>1 ) retu
119c0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f  rn 0;          /
119d0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
119e0 29 20 20 2a 2f 0a 20 20 70 53 75 62 53 72 63 20  )  */.  pSubSrc 
119f0 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20  = pSub->pSrc;.  
11a00 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20  assert( pSubSrc 
11a10 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f  );.  /* Prior to
11a20 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20   version 3.1.2, 
11a30 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
11a40 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65 20  FFSET had to be 
11a50 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73  simple constants
11a60 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74  ,.  ** not arbit
11a70 72 61 72 79 20 65 78 70 72 65 73 73 73 69 6f 6e  rary expresssion
11a80 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f  s, we allowed so
11a90 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20  me combining of 
11aa0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
11ab0 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68  .  ** because th
11ac0 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70  ey could be comp
11ad0 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  uted at compile-
11ae0 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20  time.  But when 
11af0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
11b00 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62  .  ** became arb
11b10 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  itrary expressio
11b20 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63  ns, we were forc
11b30 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69  ed to add restri
11b40 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a  ctions (13).  **
11b50 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20   and (14). */.  
11b60 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
11b70 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20   && p->pLimit ) 
11b80 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
11b90 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
11ba0 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20  ction (13) */.  
11bb0 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65  if( pSub->pOffse
11bc0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
11bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11be0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
11bf0 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20  ction (14) */.  
11c00 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
11c10 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
11c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c30 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
11c40 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20  ction (7)  */.  
11c50 69 66 28 20 28 70 53 75 62 2d 3e 69 73 44 69 73  if( (pSub->isDis
11c60 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 70  tinct || pSub->p
11c70 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20  Limit) .        
11c80 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e   && (pSrc->nSrc>
11c90 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 20 20  1 || isAgg) ){  
11ca0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
11cb0 69 63 74 69 6f 6e 73 20 28 34 29 28 35 29 28 38  ictions (4)(5)(8
11cc0 29 28 39 29 20 2a 2f 0a 20 20 20 20 20 72 65 74  )(9) */.     ret
11cd0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 0a 20 20  urn 0;       .  
11ce0 7d 0a 20 20 69 66 28 20 70 2d 3e 69 73 44 69 73  }.  if( p->isDis
11cf0 74 69 6e 63 74 20 26 26 20 73 75 62 71 75 65 72  tinct && subquer
11d00 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20  yIsAgg ) return 
11d10 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
11d20 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a  striction (6)  *
11d30 2f 0a 20 20 69 66 28 20 28 70 2d 3e 64 69 73 61  /.  if( (p->disa
11d40 6c 6c 6f 77 4f 72 64 65 72 42 79 20 7c 7c 20 70  llowOrderBy || p
11d50 2d 3e 70 4f 72 64 65 72 42 79 29 20 26 26 20 70  ->pOrderBy) && p
11d60 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
11d70 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 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 20 20 20 20 2f 2a 20 52 65 73            /* Res
11db0 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f  triction (11) */
11dc0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72  .  }..  /* Restr
11dd0 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68  iction 3:  If th
11de0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20  e subquery is a 
11df0 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
11e00 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
11e10 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61  .  ** not used a
11e20 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
11e30 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20  and of an outer 
11e40 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20  join.  Examples 
11e50 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a  of why this.  **
11e60 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a   is not allowed:
11e70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
11e80 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
11e90 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74   JOIN (t2 JOIN t
11ea0 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  3).  **.  ** If 
11eb0 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
11ec0 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
11ed0 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
11ee0 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
11ef0 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49  TER JOIN t2) JOI
11f00 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77  N t3.  **.  ** w
11f10 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61  hich is not at a
11f20 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  ll the same thin
11f30 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  g..  */.  if( pS
11f40 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26 26  ubSrc->nSrc>1 &&
11f50 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e   (pSubitem->join
11f60 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
11f70 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
11f80 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  n 0;.  }..  /* R
11f90 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20  estriction 12:  
11fa0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
11fb0 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
11fc0 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f  rand of a left o
11fd0 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20  uter.  ** join, 
11fe0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
11ff0 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48  bquery has no WH
12000 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ERE clause..  **
12010 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20   An examples of 
12020 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20  why this is not 
12030 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
12040 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
12050 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53  FT OUTER JOIN (S
12060 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
12070 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20  WHERE t2.x>0).  
12080 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
12090 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
120a0 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
120b0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
120c0 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
120d0 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32  OIN t2) WHERE t2
120e0 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42  .x>0.  **.  ** B
120f0 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65  ut the t2.x>0 te
12100 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66  st will always f
12110 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f  ail on a NULL ro
12120 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20  w of t2, which. 
12130 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20   ** effectively 
12140 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54  converts the OUT
12150 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20  ER JOIN into an 
12160 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f  INNER JOIN..  */
12170 0a 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d  .  if( (pSubitem
12180 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
12190 4f 55 54 45 52 29 21 3d 30 20 26 26 20 70 53 75  OUTER)!=0 && pSu
121a0 62 2d 3e 70 57 68 65 72 65 21 3d 30 20 29 7b 0a  b->pWhere!=0 ){.
121b0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
121c0 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  }..  /* If we re
121d0 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
121e0 69 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e  it means flatten
121f0 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
12200 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 46   for the.  ** iF
12210 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20  rom-th entry of 
12220 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
12230 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
12240 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d  ry..  */..  /* M
12250 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 46  ove all of the F
12260 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  ROM elements of 
12270 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
12280 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46  o the.  ** the F
12290 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
122a0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20  e outer query.  
122b0 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69  Before doing thi
122c0 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a  s, remember.  **
122d0 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
122e0 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69  er for the origi
122f0 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20  nal outer query 
12300 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a  FROM element in.
12310 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54    ** iParent.  T
12320 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f  he iParent curso
12330 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  r will never be 
12340 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e  used.  Subsequen
12350 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c  t code.  ** will
12360 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e   scan expression
12370 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50  s looking for iP
12380 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73  arent references
12390 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a   and replace.  *
123a0 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63  * those referenc
123b0 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69  es with expressi
123c0 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65  ons that resolve
123d0 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79   to the subquery
123e0 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65   FROM.  ** eleme
123f0 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63  nts we are now c
12400 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a  opying in..  */.
12410 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62    iParent = pSub
12420 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  item->iCursor;. 
12430 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53   {.    int nSubS
12440 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
12450 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69 6e  rc;.    int join
12460 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
12470 3e 6a 6f 69 6e 74 79 70 65 3b 0a 0a 20 20 20 20  >jointype;..    
12480 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
12490 6c 65 28 30 2c 20 70 53 75 62 69 74 65 6d 2d 3e  le(0, pSubitem->
124a0 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
124b0 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e  eFree(pSubitem->
124c0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
124d0 73 71 6c 69 74 65 46 72 65 65 28 70 53 75 62 69  sqliteFree(pSubi
124e0 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
124f0 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 75 62   sqliteFree(pSub
12500 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  item->zAlias);. 
12510 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
12520 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78   ){.      int ex
12530 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d 20  tra = nSubSrc - 
12540 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  1;.      for(i=1
12550 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
12560 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 20  ){.        pSrc 
12570 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
12580 41 70 70 65 6e 64 28 70 53 72 63 2c 20 30 2c 20  Append(pSrc, 0, 
12590 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
125a0 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63    p->pSrc = pSrc
125b0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53  ;.      for(i=pS
125c0 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65 78  rc->nSrc-1; i-ex
125d0 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29  tra>=iFrom; i--)
125e0 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e  {.        pSrc->
125f0 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69  a[i] = pSrc->a[i
12600 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20 20 7d  -extra];.      }
12610 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
12620 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69  =0; i<nSubSrc; i
12630 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d  ++){.      pSrc-
12640 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53  >a[i+iFrom] = pS
12650 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  ubSrc->a[i];.   
12660 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53     memset(&pSubS
12670 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a  rc->a[i], 0, siz
12680 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69  eof(pSubSrc->a[i
12690 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ]));.    }.    p
126a0 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f  Src->a[iFrom].jo
126b0 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70  intype = jointyp
126c0 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  e;.  }..  /* Now
126d0 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74   begin substitut
126e0 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73  ing subquery res
126f0 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
12700 6f 6e 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72 65  ons for .  ** re
12710 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
12720 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
12730 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2a  uter query..  **
12740 20 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a   .  ** Example:.
12750 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c 45    **.  **   SELE
12760 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f  CT a+5, b*10 FRO
12770 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53  M (SELECT x*3 AS
12780 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52   a, y+10 AS b FR
12790 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62  OM t1) WHERE a>b
127a0 3b 0a 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20  ;.  **   \      
127b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
127c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
127d0 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
127e0 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
127f0 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  **    \_________
12800 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74  ____________ out
12810 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  er query _______
12820 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
12830 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20 20  _______/.  **.  
12840 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
12850 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
12860 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
12870 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
12880 65 20 77 65 20 73 65 65 0a 20 20 2a 2a 20 22 61  e we see.  ** "a
12890 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
128a0 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20  "x*3" and every 
128b0 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22  place we see "b"
128c0 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
128d0 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 70 4c  y+10"..  */.  pL
128e0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
128f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
12900 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
12910 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
12920 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  r;.    if( pList
12930 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20  ->a[i].zName==0 
12940 26 26 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73  && (pExpr = pLis
12950 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e  t->a[i].pExpr)->
12960 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  span.z!=0 ){.   
12970 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a     pList->a[i].z
12980 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
12990 4e 44 75 70 28 28 63 68 61 72 2a 29 70 45 78 70  NDup((char*)pExp
129a0 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72  r->span.z, pExpr
129b0 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d  ->span.n);.    }
129c0 0a 20 20 7d 0a 20 20 73 75 62 73 74 45 78 70 72  .  }.  substExpr
129d0 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
129e0 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
129f0 45 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 69 73  EList);.  if( is
12a00 41 67 67 20 29 7b 0a 20 20 20 20 73 75 62 73 74  Agg ){.    subst
12a10 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
12a20 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70  upBy, iParent, p
12a30 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
12a40 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
12a50 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
12a60 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
12a70 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e    }.  if( pSub->
12a80 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
12a90 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
12aa0 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  rBy==0 );.    p-
12ab0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62  >pOrderBy = pSub
12ac0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
12ad0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pSub->pOrderBy =
12ae0 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
12af0 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
12b00 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
12b10 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50  (p->pOrderBy, iP
12b20 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
12b30 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ist);.  }.  if( 
12b40 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a  pSub->pWhere ){.
12b50 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c      pWhere = sql
12b60 69 74 65 33 45 78 70 72 44 75 70 28 70 53 75 62  ite3ExprDup(pSub
12b70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 7d 65 6c  ->pWhere);.  }el
12b80 73 65 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  se{.    pWhere =
12b90 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 75   0;.  }.  if( su
12ba0 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20  bqueryIsAgg ){. 
12bb0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48     assert( p->pH
12bc0 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20  aving==0 );.    
12bd0 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  p->pHaving = p->
12be0 70 57 68 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70  pWhere;.    p->p
12bf0 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
12c00 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 2d      substExpr(p-
12c10 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e  >pHaving, iParen
12c20 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
12c30 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67  ;.    p->pHaving
12c40 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
12c50 64 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 73 71  d(p->pHaving, sq
12c60 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 53 75  lite3ExprDup(pSu
12c70 62 2d 3e 70 48 61 76 69 6e 67 29 29 3b 0a 20 20  b->pHaving));.  
12c80 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
12c90 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  oupBy==0 );.    
12ca0 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
12cb0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
12cc0 28 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29  (pSub->pGroupBy)
12cd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
12ce0 75 62 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65  ubstExpr(p->pWhe
12cf0 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  re, iParent, pSu
12d00 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
12d10 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
12d20 74 65 33 45 78 70 72 41 6e 64 28 70 2d 3e 70 57  te3ExprAnd(p->pW
12d30 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20  here, pWhere);. 
12d40 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c 61   }..  /* The fla
12d50 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20  ttened query is 
12d60 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68  distinct if eith
12d70 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20  er the inner or 
12d80 74 68 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20 71  the.  ** outer q
12d90 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
12da0 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44  . .  */.  p->isD
12db0 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
12dc0 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d  istinct || pSub-
12dd0 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20  >isDistinct;..  
12de0 2f 2a 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e  /*.  ** SELECT .
12df0 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  .. FROM (SELECT 
12e00 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53  ... LIMIT a OFFS
12e10 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46  ET b) LIMIT x OF
12e20 46 53 45 54 20 79 3b 0a 20 20 2a 2a 0a 20 20 2a  FSET y;.  **.  *
12e30 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64  * One is tempted
12e40 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61   to try to add a
12e50 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e   and b to combin
12e60 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42  e the limits.  B
12e70 75 74 20 74 68 69 73 0a 20 20 2a 2a 20 64 6f 65  ut this.  ** doe
12e80 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69  s not work if ei
12e90 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65  ther limit is ne
12ea0 67 61 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 69  gative..  */.  i
12eb0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
12ec0 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  ){.    p->pLimit
12ed0 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b   = pSub->pLimit;
12ee0 0a 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69  .    pSub->pLimi
12ef0 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t = 0;.  }..  /*
12f00 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74   Finially, delet
12f10 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f  e what is left o
12f20 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61  f the subquery a
12f30 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73  nd return.  ** s
12f40 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  uccess..  */.  s
12f50 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
12f60 74 65 28 70 53 75 62 29 3b 0a 20 20 72 65 74 75  te(pSub);.  retu
12f70 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
12f80 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
12f90 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61  EW */../*.** Ana
12fa0 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20  lyze the SELECT 
12fb0 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
12fc0 20 69 6e 20 61 73 20 61 6e 20 61 72 67 75 6d 65   in as an argume
12fd0 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a  nt to see if it.
12fe0 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d  ** is a simple m
12ff0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
13000 65 72 79 2e 20 20 49 66 20 69 74 20 69 73 20 61  ery.  If it is a
13010 6e 64 20 74 68 69 73 20 71 75 65 72 79 20 63 61  nd this query ca
13020 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73 66 69 65  n be.** satisfie
13030 64 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65  d using a single
13040 20 73 65 65 6b 20 74 6f 20 74 68 65 20 62 65 67   seek to the beg
13050 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66  inning or end of
13060 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68   an index,.** th
13070 65 6e 20 67 65 6e 65 72 61 74 65 20 74 68 65 20  en generate the 
13080 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 53 45  code for this SE
13090 4c 45 43 54 20 61 6e 64 20 72 65 74 75 72 6e 20  LECT and return 
130a0 31 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 6e  1.  If this is n
130b0 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20  ot a .** simple 
130c0 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
130d0 75 65 72 79 2c 20 74 68 65 6e 20 72 65 74 75 72  uery, then retur
130e0 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d  n 0;.**.** A sim
130f0 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ply min() or max
13100 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c  () query looks l
13110 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
13120 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 61 29     SELECT min(a)
13130 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20   FROM table;.** 
13140 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 61 29     SELECT max(a)
13150 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a   FROM table;.**.
13160 2a 2a 20 54 68 65 20 71 75 65 72 79 20 6d 61 79  ** The query may
13170 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e   have only a sin
13180 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 69 74 73  gle table in its
13190 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20   FROM argument. 
131a0 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65   There.** can be
131b0 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f 72 20   no GROUP BY or 
131c0 48 41 56 49 4e 47 20 6f 72 20 57 48 45 52 45 20  HAVING or WHERE 
131d0 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 72 65  clauses.  The re
131e0 73 75 6c 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a  sult set must.**
131f0 20 62 65 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   be the min() or
13200 20 6d 61 78 28 29 20 6f 66 20 61 20 73 69 6e 67   max() of a sing
13210 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  le column of the
13220 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c   table.  The col
13230 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69  umn.** in the mi
13240 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e  n() or max() fun
13250 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e  ction must be in
13260 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dexed..**.** The
13270 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74   parameters to t
13280 68 69 73 20 72 6f 75 74 69 6e 65 20 61 72 65 20  his routine are 
13290 74 68 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20  the same as for 
132a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2e  sqlite3Select().
132b0 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61 64  .** See the head
132c0 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  er comment on th
132d0 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  at routine for a
132e0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
132f0 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
13300 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61   int simpleMinMa
13310 78 51 75 65 72 79 28 50 61 72 73 65 20 2a 70 50  xQuery(Parse *pP
13320 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
13330 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20   int eDest, int 
13340 69 50 61 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a  iParm){.  Expr *
13350 70 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f  pExpr;.  int iCo
13360 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  l;.  Table *pTab
13370 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
13380 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 56  .  int base;.  V
13390 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65  dbe *v;.  int se
133a0 65 6b 4f 70 3b 0a 20 20 45 78 70 72 4c 69 73 74  ekOp;.  ExprList
133b0 20 2a 70 45 4c 69 73 74 2c 20 2a 70 4c 69 73 74   *pEList, *pList
133c0 2c 20 65 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  , eList;.  struc
133d0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
133e0 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 53 72 63  eListItem;.  Src
133f0 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 69 6e  List *pSrc;.  in
13400 74 20 62 72 6b 3b 0a 20 20 69 6e 74 20 69 44 62  t brk;.  int iDb
13410 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
13420 20 73 65 65 20 69 66 20 74 68 69 73 20 71 75 65   see if this que
13430 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d  ry is a simple m
13440 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
13450 65 72 79 2e 20 20 52 65 74 75 72 6e 0a 20 20 2a  ery.  Return.  *
13460 2a 20 7a 65 72 6f 20 69 66 20 69 74 20 69 73 20  * zero if it is 
13470 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   not..  */.  if(
13480 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20   p->pGroupBy || 
13490 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c 20 70 2d  p->pHaving || p-
134a0 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
134b0 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
134c0 70 53 72 63 3b 0a 20 20 69 66 28 20 70 53 72 63  pSrc;.  if( pSrc
134d0 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
134e0 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d  rn 0;.  pEList =
134f0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
13500 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ( pEList->nExpr!
13510 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
13520 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   pExpr = pEList-
13530 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
13540 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
13550 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
13560 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4c 69 73  return 0;.  pLis
13570 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
13580 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
13590 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72   || pList->nExpr
135a0 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
135b0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
135c0 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75 72 6e  en.n!=3 ) return
135d0 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
135e0 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a  3StrNICmp((char*
135f0 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
13600 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20  "min",3)==0 ){. 
13610 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52     seekOp = OP_R
13620 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69  ewind;.  }else i
13630 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
13640 6d 70 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d  mp((char*)pExpr-
13650 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33  >token.z,"max",3
13660 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b  )==0 ){.    seek
13670 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20 20  Op = OP_Last;.  
13680 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
13690 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72  n 0;.  }.  pExpr
136a0 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70   = pList->a[0].p
136b0 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70  Expr;.  if( pExp
136c0 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
136d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
136e0 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Col = pExpr->iCo
136f0 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20 3d 20 70  lumn;.  pTab = p
13700 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
13710 0a 20 20 2f 2a 20 54 68 69 73 20 6f 70 74 69 6d  .  /* This optim
13720 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ization cannot b
13730 65 20 75 73 65 64 20 77 69 74 68 20 76 69 72 74  e used with virt
13740 75 61 6c 20 74 61 62 6c 65 73 2e 20 2a 2f 0a 20  ual tables. */. 
13750 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
13760 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
13770 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
13780 20 74 6f 20 68 65 72 65 2c 20 69 74 20 6d 65 61   to here, it mea
13790 6e 73 20 74 68 65 20 71 75 65 72 79 20 69 73 20  ns the query is 
137a0 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74 20 66  of the correct f
137b0 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65 63 6b 20  orm..  ** Check 
137c0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20  to make sure we 
137d0 68 61 76 65 20 61 6e 20 69 6e 64 65 78 20 61 6e  have an index an
137e0 64 20 6d 61 6b 65 20 70 49 64 78 20 70 6f 69 6e  d make pIdx poin
137f0 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 61 70  t to the.  ** ap
13800 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78 2e  propriate index.
13810 20 20 49 66 20 74 68 65 20 6d 69 6e 28 29 20 6f    If the min() o
13820 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 61 6e  r max() is on an
13830 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
13840 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e  .  ** key column
13850 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 6e 65  , no index is ne
13860 63 65 73 73 61 72 79 20 73 6f 20 73 65 74 20 70  cessary so set p
13870 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66  Idx to NULL.  If
13880 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62 6c 65 20   no.  ** usable 
13890 69 6e 64 65 78 20 69 73 20 66 6f 75 6e 64 2c 20  index is found, 
138a0 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20  return 0..  */. 
138b0 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
138c0 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d     pIdx = 0;.  }
138d0 65 6c 73 65 7b 0a 20 20 20 20 43 6f 6c 6c 53 65  else{.    CollSe
138e0 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
138f0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
13900 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
13910 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29    if( pColl==0 )
13920 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66   return 0;.    f
13930 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
13940 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
13950 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
13960 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
13970 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b  x->nColumn>=1 );
13980 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
13990 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43  >aiColumn[0]==iC
139a0 6f 6c 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  ol && .         
139b0 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
139c0 6d 70 28 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  mp(pIdx->azColl[
139d0 30 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  0], pColl->zName
139e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  ) ){.        bre
139f0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
13a00 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d  }.    if( pIdx==
13a10 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
13a20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79  }..  /* Identify
13a30 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69 66   column types if
13a40 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
13a50 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20  g the callback. 
13a60 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20   This.  ** step 
13a70 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
13a80 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e  e output is goin
13a90 67 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 72 20  g to a table or 
13aa0 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20  a memory cell.. 
13ab0 20 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e   ** The column n
13ac0 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ames have alread
13ad0 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64  y been generated
13ae0 20 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   in the calling 
13af0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  function..  */. 
13b00 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
13b10 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
13b20 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
13b30 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   0;..  /* If the
13b40 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
13b50 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
13b60 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
13b70 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
13b80 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
13b90 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
13ba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13bb0 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  Op(v, OP_OpenEph
13bc0 65 6d 65 72 61 6c 2c 20 69 50 61 72 6d 2c 20 31  emeral, iParm, 1
13bd0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
13be0 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74 6f 20  erating code to 
13bf0 66 69 6e 64 20 74 68 65 20 6d 69 6e 20 6f 72 20  find the min or 
13c00 74 68 65 20 6d 61 78 2e 20 20 42 61 73 69 63 61  the max.  Basica
13c10 6c 6c 79 20 61 6c 6c 20 77 65 20 68 61 76 65 0a  lly all we have.
13c20 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 66 69    ** to do is fi
13c30 6e 64 20 74 68 65 20 66 69 72 73 74 20 6f 72 20  nd the first or 
13c40 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
13c50 6e 20 74 68 65 20 63 68 6f 73 65 6e 20 69 6e 64  n the chosen ind
13c60 65 78 2e 20 20 49 66 0a 20 20 2a 2a 20 74 68 65  ex.  If.  ** the
13c70 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
13c80 69 73 20 6f 6e 20 74 68 65 20 49 4e 54 45 47 45  is on the INTEGE
13c90 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74  R PRIMARY KEY, t
13ca0 68 65 6e 20 66 69 6e 64 20 74 68 65 20 66 69 72  hen find the fir
13cb0 73 74 0a 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20  st.  ** or last 
13cc0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6d 61 69  entry in the mai
13cd0 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  n table..  */.  
13ce0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
13cf0 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
13d00 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
13d10 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28  hema);.  assert(
13d20 20 69 44 62 3e 3d 30 20 7c 7c 20 70 54 61 62 2d   iDb>=0 || pTab-
13d30 3e 69 73 45 70 68 65 6d 20 29 3b 0a 20 20 73 71  >isEphem );.  sq
13d40 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
13d50 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
13d60 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62  b);.  sqlite3Tab
13d70 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
13d80 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
13d90 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
13da0 0a 20 20 62 61 73 65 20 3d 20 70 53 72 63 2d 3e  .  base = pSrc->
13db0 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[0].iCursor;.  
13dc0 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  brk = sqlite3Vdb
13dd0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
13de0 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
13df0 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
13e00 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28 20 70 53  , brk);.  if( pS
13e10 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
13e20 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
13e30 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
13e40 73 65 2c 20 62 61 73 65 2c 20 69 44 62 2c 20 70  se, base, iDb, p
13e50 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
13e60 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64  );.  }.  if( pId
13e70 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x==0 ){.    sqli
13e80 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13e90 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29  seekOp, base, 0)
13ea0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
13eb0 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68  * Even though th
13ec0 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f  e cursor used to
13ed0 20 6f 70 65 6e 20 74 68 65 20 69 6e 64 65 78 20   open the index 
13ee0 68 65 72 65 20 69 73 20 63 6c 6f 73 65 64 0a 20  here is closed. 
13ef0 20 20 20 2a 2a 20 61 73 20 73 6f 6f 6e 20 61 73     ** as soon as
13f00 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 20   a single value 
13f10 68 61 73 20 62 65 65 6e 20 72 65 61 64 20 66 72  has been read fr
13f20 6f 6d 20 69 74 2c 20 61 6c 6c 6f 63 61 74 65 20  om it, allocate 
13f30 69 74 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20  it.    ** using 
13f40 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 29  (pParse->nTab++)
13f50 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
13f60 63 75 72 73 6f 72 20 69 64 20 66 72 6f 6d 20 62  cursor id from b
13f70 65 69 6e 67 20 0a 20 20 20 20 2a 2a 20 72 65 75  eing .    ** reu
13f80 73 65 64 2e 20 54 68 69 73 20 69 73 20 69 6d 70  sed. This is imp
13f90 6f 72 74 61 6e 74 20 66 6f 72 20 73 74 61 74 65  ortant for state
13fa0 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72  ments of the for
13fb0 6d 20 0a 20 20 20 20 2a 2a 20 22 49 4e 53 45 52  m .    ** "INSER
13fc0 54 20 49 4e 54 4f 20 78 20 53 45 4c 45 43 54 20  T INTO x SELECT 
13fd0 6d 61 78 28 29 20 46 52 4f 4d 20 78 22 2e 0a 20  max() FROM x".. 
13fe0 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49     */.    int iI
13ff0 64 78 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20  dx;.    KeyInfo 
14000 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49  *pKey = sqlite3I
14010 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72  ndexKeyinfo(pPar
14020 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69  se, pIdx);.    i
14030 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
14040 61 62 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ab++;.    assert
14050 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d  ( pIdx->pSchema=
14060 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
14070 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14080 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
14090 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20  eger, iDb, 0);. 
140a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
140b0 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  3(v, OP_OpenRead
140c0 2c 20 69 49 64 78 2c 20 70 49 64 78 2d 3e 74 6e  , iIdx, pIdx->tn
140d0 75 6d 2c 20 0a 20 20 20 20 20 20 20 20 28 63 68  um, .        (ch
140e0 61 72 2a 29 70 4b 65 79 2c 20 50 33 5f 4b 45 59  ar*)pKey, P3_KEY
140f0 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
14100 20 20 20 69 66 28 20 73 65 65 6b 4f 70 3d 3d 4f     if( seekOp==O
14110 50 5f 52 65 77 69 6e 64 20 29 7b 0a 20 20 20 20  P_Rewind ){.    
14120 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14130 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  Op(v, OP_Null, 0
14140 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
14150 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14160 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31  OP_MakeRecord, 1
14170 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 65 65 6b  , 0);.      seek
14180 4f 70 20 3d 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a  Op = OP_MoveGt;.
14190 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
141a0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65  3VdbeAddOp(v, se
141b0 65 6b 4f 70 2c 20 69 49 64 78 2c 20 30 29 3b 0a  ekOp, iIdx, 0);.
141c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
141d0 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 6f  ddOp(v, OP_IdxRo
141e0 77 69 64 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20  wid, iIdx, 0);. 
141f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14200 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
14210 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 73   iIdx, 0);.    s
14220 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
14230 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 62 61  v, OP_MoveGe, ba
14240 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 65 4c  se, 0);.  }.  eL
14250 69 73 74 2e 6e 45 78 70 72 20 3d 20 31 3b 0a 20  ist.nExpr = 1;. 
14260 20 6d 65 6d 73 65 74 28 26 65 4c 69 73 74 49 74   memset(&eListIt
14270 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 65 4c  em, 0, sizeof(eL
14280 69 73 74 49 74 65 6d 29 29 3b 0a 20 20 65 4c 69  istItem));.  eLi
14290 73 74 2e 61 20 3d 20 26 65 4c 69 73 74 49 74 65  st.a = &eListIte
142a0 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b 30 5d 2e  m;.  eList.a[0].
142b0 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
142c0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
142d0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 65 4c 69  (pParse, p, &eLi
142e0 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c  st, 0, 0, 0, -1,
142f0 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 62   eDest, iParm, b
14300 72 6b 2c 20 62 72 6b 2c 20 30 29 3b 0a 20 20 73  rk, brk, 0);.  s
14310 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
14320 65 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a  eLabel(v, brk);.
14330 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14340 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
14350 62 61 73 65 2c 20 30 29 3b 0a 20 20 0a 20 20 72  base, 0);.  .  r
14360 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
14370 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 64 20 4f 52  * Analyze and OR
14380 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
14390 42 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20 53  BY clause in a S
143a0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
143b0 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
143c0 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
143d0 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20   seen..**.** An 
143e0 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
143f0 50 20 42 59 20 69 73 20 61 20 6c 69 73 74 20 6f  P BY is a list o
14400 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  f expressions.  
14410 49 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  If any expressio
14420 6e 0a 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67  n.** is an integ
14430 65 72 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65  er constant, the
14440 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  n that expressio
14450 6e 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79  n is replaced by
14460 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
14470 6e 64 69 6e 67 20 65 6e 74 72 79 20 69 6e 20 74  nding entry in t
14480 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a  he result set..*
14490 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
144a0 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79  cessOrderGroupBy
144b0 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
144c0 2a 70 4e 43 2c 20 20 20 20 20 2f 2a 20 4e 61 6d  *pNC,     /* Nam
144d0 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65  e context of the
144e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
144f0 74 2e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  t. */.  ExprList
14500 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
14510 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72   The ORDER BY or
14520 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
14530 20 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65 64   to be processed
14540 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
14550 20 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a 20 45   *zType     /* E
14560 69 74 68 65 72 20 22 4f 52 44 45 52 22 20 6f 72  ither "ORDER" or
14570 20 22 47 52 4f 55 50 22 2c 20 61 73 20 61 70 70   "GROUP", as app
14580 72 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b 0a 20  ropriate */.){. 
14590 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c 69   int i;.  ExprLi
145a0 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 4e 43  st *pEList = pNC
145b0 2d 3e 70 45 4c 69 73 74 3b 20 20 20 20 20 2f 2a  ->pEList;     /*
145c0 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
145d0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 2a 2f  of the SELECT */
145e0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
145f0 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 20   = pNC->pParse; 
14600 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
14610 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
14620 45 43 54 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ECT */.  assert(
14630 20 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 69 66   pEList );..  if
14640 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ( pOrderBy==0 ) 
14650 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28  return 0;.  for(
14660 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
14670 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
14680 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20    int iCol;.    
14690 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65  Expr *pE = pOrde
146a0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
146b0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
146c0 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
146d0 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20  , &iCol) ){.    
146e0 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 26 26 20    if( iCol>0 && 
146f0 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45  iCol<=pEList->nE
14700 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 43  xpr ){.        C
14710 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
14720 70 45 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  pE->pColl;.     
14730 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
14740 45 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  E->flags & EP_Ex
14750 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20  pCollate;.      
14760 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
14770 65 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20 20  ete(pE);.       
14780 20 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e   pE = pOrderBy->
14790 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c  a[i].pExpr = sql
147a0 69 74 65 33 45 78 70 72 44 75 70 28 70 45 4c 69  ite3ExprDup(pELi
147b0 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45  st->a[iCol-1].pE
147c0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
147d0 28 20 70 43 6f 6c 6c 20 26 26 20 66 6c 61 67 73  ( pColl && flags
147e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45   ){.          pE
147f0 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b  ->pColl = pColl;
14800 0a 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 66  .          pE->f
14810 6c 61 67 73 20 7c 3d 20 66 6c 61 67 73 3b 0a 20  lags |= flags;. 
14820 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14830 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
14840 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14850 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
14860 20 20 22 25 73 20 42 59 20 63 6f 6c 75 6d 6e 20    "%s BY column 
14870 6e 75 6d 62 65 72 20 25 64 20 6f 75 74 20 6f 66  number %d out of
14880 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20   range - should 
14890 62 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  be ".           
148a0 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25  "between 1 and %
148b0 64 22 2c 20 7a 54 79 70 65 2c 20 69 43 6f 6c 2c  d", zType, iCol,
148c0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
148d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
148e0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
148f0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14900 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
14910 28 70 4e 43 2c 20 70 45 29 20 29 7b 0a 20 20 20  (pNC, pE) ){.   
14920 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
14930 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
14940 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
14950 20 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76 65   routine resolve
14960 73 20 61 6e 79 20 6e 61 6d 65 73 20 75 73 65 64  s any names used
14970 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
14980 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 73 75 70  et of the.** sup
14990 70 6c 69 65 64 20 53 45 4c 45 43 54 20 73 74 61  plied SELECT sta
149a0 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 53  tement. If the S
149b0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
149c0 62 65 69 6e 67 20 72 65 73 6f 6c 76 65 64 0a 2a  being resolved.*
149d0 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  * is a sub-selec
149e0 74 2c 20 74 68 65 6e 20 70 4f 75 74 65 72 4e 43  t, then pOuterNC
149f0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
14a00 20 74 68 65 20 4e 61 6d 65 43 6f 6e 74 65 78 74   the NameContext
14a10 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65   .** of the pare
14a20 6e 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 69 6e  nt SELECT..*/.in
14a30 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52  t sqlite3SelectR
14a40 65 73 6f 6c 76 65 28 0a 20 20 50 61 72 73 65 20  esolve(.  Parse 
14a50 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
14a60 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
14a70 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
14a80 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
14a90 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
14aa0 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
14ab0 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d   coded. */.  Nam
14ac0 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72  eContext *pOuter
14ad0 4e 43 20 20 2f 2a 20 54 68 65 20 6f 75 74 65 72  NC  /* The outer
14ae0 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 4d   name context. M
14af0 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 29  ay be NULL. */.)
14b00 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  {.  ExprList *pE
14b10 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f  List;          /
14b20 2a 20 52 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f  * Result set. */
14b30 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
14b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14b50 20 46 6f 72 2d 6c 6f 6f 70 20 76 61 72 69 61 62   For-loop variab
14b60 6c 65 20 75 73 65 64 20 69 6e 20 6d 75 6c 74 69  le used in multi
14b70 70 6c 65 20 70 6c 61 63 65 73 20 2a 2f 0a 20 20  ple places */.  
14b80 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
14b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
14ba0 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  cal name-context
14bb0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
14bc0 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20 20 20  pGroupBy;       
14bd0 20 2f 2a 20 54 68 65 20 67 72 6f 75 70 20 62 79   /* The group by
14be0 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a   clause */..  /*
14bf0 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
14c00 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72 65 2c   has run before,
14c10 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
14c20 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ely. */.  if( p-
14c30 3e 69 73 52 65 73 6f 6c 76 65 64 20 29 7b 0a 20  >isResolved ){. 
14c40 20 20 20 61 73 73 65 72 74 28 20 21 70 4f 75 74     assert( !pOut
14c50 65 72 4e 43 20 29 3b 0a 20 20 20 20 72 65 74 75  erNC );.    retu
14c60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14c70 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65  }.  p->isResolve
14c80 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20  d = 1;..  /* If 
14c90 74 68 65 72 65 20 68 61 76 65 20 61 6c 72 65 61  there have alrea
14ca0 64 79 20 62 65 65 6e 20 65 72 72 6f 72 73 2c 20  dy been errors, 
14cb0 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20  do nothing. */. 
14cc0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
14cd0 72 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  r>0 ){.    retur
14ce0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
14cf0 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72    }..  /* Prepar
14d00 65 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61  e the select sta
14d10 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 63 61 6c  tement. This cal
14d20 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74 65 20  l will allocate 
14d30 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  all cursors.  **
14d40 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e   required to han
14d50 64 6c 65 20 74 68 65 20 74 61 62 6c 65 73 20 61  dle the tables a
14d60 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  nd subqueries in
14d70 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
14d80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65  ..  */.  if( pre
14d90 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72  pSelectStmt(pPar
14da0 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65  se, p) ){.    re
14db0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
14dc0 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  R;.  }..  /* Res
14dd0 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73 73  olve the express
14de0 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d 49  ions in the LIMI
14df0 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
14e00 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20 2a 2a  uses. These.  **
14e10 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
14e20 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61 6e 79   to refer to any
14e30 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73 73 20   names, so pass 
14e40 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43 6f 6e  an empty NameCon
14e50 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  text..  */.  mem
14e60 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
14e70 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43  eof(sNC));.  sNC
14e80 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
14e90 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
14ea0 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
14eb0 26 73 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  &sNC, p->pLimit)
14ec0 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ||.      sqlite
14ed0 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
14ee0 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 66 66 73  s(&sNC, p->pOffs
14ef0 65 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  et) ){.    retur
14f00 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
14f10 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70    }..  /* Set up
14f20 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d   the local name-
14f30 63 6f 6e 74 65 78 74 20 74 6f 20 70 61 73 73 20  context to pass 
14f40 74 6f 20 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  to ExprResolveNa
14f50 6d 65 73 28 29 20 74 6f 0a 20 20 2a 2a 20 72 65  mes() to.  ** re
14f60 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73  solve the expres
14f70 73 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  sion-list..  */.
14f80 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d    sNC.allowAgg =
14f90 20 31 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69   1;.  sNC.pSrcLi
14fa0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
14fb0 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4f 75 74  sNC.pNext = pOut
14fc0 65 72 4e 43 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f  erNC;..  /* Reso
14fd0 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74 68 65  lve names in the
14fe0 20 72 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a   result set. */.
14ff0 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
15000 4c 69 73 74 3b 0a 20 20 69 66 28 20 21 70 45 4c  List;.  if( !pEL
15010 69 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ist ) return SQL
15020 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72  ITE_ERROR;.  for
15030 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
15040 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
15050 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45 4c 69   Expr *pX = pELi
15060 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
15070 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
15080 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
15090 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a 20 20 20  &sNC, pX) ){.   
150a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
150b0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
150c0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
150d0 20 61 72 65 20 6e 6f 20 61 67 67 72 65 67 61 74   are no aggregat
150e0 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74  e functions in t
150f0 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c 20 61  he result-set, a
15100 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 0a  nd no GROUP BY .
15110 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c    ** expression,
15120 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 67   do not allow ag
15130 67 72 65 67 61 74 65 73 20 69 6e 20 61 6e 79 20  gregates in any 
15140 6f 66 20 74 68 65 20 6f 74 68 65 72 20 65 78 70  of the other exp
15150 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
15160 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69 73 41   assert( !p->isA
15170 67 67 20 29 3b 0a 20 20 70 47 72 6f 75 70 42 79  gg );.  pGroupBy
15180 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
15190 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 7c    if( pGroupBy |
151a0 7c 20 73 4e 43 2e 68 61 73 41 67 67 20 29 7b 0a  | sNC.hasAgg ){.
151b0 20 20 20 20 70 2d 3e 69 73 41 67 67 20 3d 20 31      p->isAgg = 1
151c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
151d0 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 30 3b  NC.allowAgg = 0;
151e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20  .  }..  /* If a 
151f0 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73  HAVING clause is
15200 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74   present, then t
15210 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 47  here must be a G
15220 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a  ROUP BY clause..
15230 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 48    */.  if( p->pH
15240 61 76 69 6e 67 20 26 26 20 21 70 47 72 6f 75 70  aving && !pGroup
15250 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
15260 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15270 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c  , "a GROUP BY cl
15280 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64  ause is required
15290 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22 29   before HAVING")
152a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
152b0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
152c0 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 78 70    /* Add the exp
152d0 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
152e0 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  the name-context
152f0 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e 67 20   before parsing 
15300 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 65  the.  ** other e
15310 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
15320 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
15330 6e 74 2e 20 54 68 69 73 20 69 73 20 73 6f 20 74  nt. This is so t
15340 68 61 74 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  hat.  ** express
15350 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52  ions in the WHER
15360 45 20 63 6c 61 75 73 65 20 28 65 74 63 2e 29 20  E clause (etc.) 
15370 63 61 6e 20 72 65 66 65 72 20 74 6f 20 65 78 70  can refer to exp
15380 72 65 73 73 69 6f 6e 73 20 62 79 0a 20 20 2a 2a  ressions by.  **
15390 20 61 6c 69 61 73 65 73 20 69 6e 20 74 68 65 20   aliases in the 
153a0 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2a  result set..  **
153b0 0a 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e  .  ** Minor poin
153c0 74 3a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  t: If this is th
153d0 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
153e0 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c   expression will
153f0 20 62 65 0a 20 20 2a 2a 20 72 65 2d 65 76 61 6c   be.  ** re-eval
15400 75 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 72  uated for each r
15410 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 0a  eference to it..
15420 20 20 2a 2f 0a 20 20 73 4e 43 2e 70 45 4c 69 73    */.  sNC.pELis
15430 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
15440 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
15450 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
15460 43 2c 20 70 2d 3e 70 57 68 65 72 65 29 20 7c 7c  C, p->pWhere) ||
15470 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
15480 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
15490 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  sNC, p->pHaving)
154a0 20 7c 7c 0a 20 20 20 20 20 20 70 72 6f 63 65 73   ||.      proces
154b0 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26 73  sOrderGroupBy(&s
154c0 4e 43 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  NC, p->pOrderBy,
154d0 20 22 4f 52 44 45 52 22 29 20 7c 7c 0a 20 20 20   "ORDER") ||.   
154e0 20 20 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47     processOrderG
154f0 72 6f 75 70 42 79 28 26 73 4e 43 2c 20 70 47 72  roupBy(&sNC, pGr
15500 6f 75 70 42 79 2c 20 22 47 52 4f 55 50 22 29 0a  oupBy, "GROUP").
15510 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
15520 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
15530 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
15540 65 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  e the GROUP BY c
15550 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 63  lause does not c
15560 6f 6e 74 61 69 6e 20 61 67 67 72 65 67 61 74 65  ontain aggregate
15570 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f   functions..  */
15580 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20  .  if( pGroupBy 
15590 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
155a0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
155b0 65 6d 3b 0a 20 20 0a 20 20 20 20 66 6f 72 28 69  em;.  .    for(i
155c0 3d 30 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70  =0, pItem=pGroup
155d0 42 79 2d 3e 61 3b 20 69 3c 70 47 72 6f 75 70 42  By->a; i<pGroupB
155e0 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  y->nExpr; i++, p
155f0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Item++){.      i
15600 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
15610 74 79 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  ty(pItem->pExpr,
15620 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20 20 20   EP_Agg) ){.    
15630 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
15640 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 67 67  Msg(pParse, "agg
15650 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
15660 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
15670 20 69 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20   in ".          
15680 20 20 22 74 68 65 20 47 52 4f 55 50 20 42 59 20    "the GROUP BY 
15690 63 6c 61 75 73 65 22 29 3b 0a 20 20 20 20 20 20  clause");.      
156a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
156b0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
156c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
156d0 66 20 74 68 69 73 20 69 73 20 6f 6e 65 20 53 45  f this is one SE
156e0 4c 45 43 54 20 6f 66 20 61 20 63 6f 6d 70 6f 75  LECT of a compou
156f0 6e 64 2c 20 62 65 20 73 75 72 65 20 74 6f 20 72  nd, be sure to r
15700 65 73 6f 6c 76 65 20 6e 61 6d 65 73 0a 20 20 2a  esolve names.  *
15710 2a 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 53  * in the other S
15720 45 4c 45 43 54 73 2e 0a 20 20 2a 2f 0a 20 20 69  ELECTs..  */.  i
15730 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
15740 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
15750 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
15760 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f  pParse, p->pPrio
15770 72 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20  r, pOuterNC);.  
15780 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
15790 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
157a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20  .}../*.** Reset 
157b0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
157c0 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  cumulator..**.**
157d0 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61   The aggregate a
157e0 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20  ccumulator is a 
157f0 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65  set of memory ce
15800 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a  lls that hold.**
15810 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
15820 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63  sults while calc
15830 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65  ulating an aggre
15840 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72  gate.  This.** r
15850 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79 20 73 74  outine simply st
15860 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c  ores NULLs in al
15870 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72  l of those memor
15880 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  y cells..*/.stat
15890 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63  ic void resetAcc
158a0 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
158b0 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
158c0 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
158d0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
158e0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
158f0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
15900 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20  _func *pFunc;.  
15910 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  if( pAggInfo->nF
15920 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  unc+pAggInfo->nC
15930 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  olumn==0 ){.    
15940 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f  return;.  }.  fo
15950 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
15960 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  o->nColumn; i++)
15970 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
15980 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
15990 4e 75 6c 6c 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  Null, pAggInfo->
159a0 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 2c 20 30 29  aCol[i].iMem, 0)
159b0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e  ;.  }.  for(pFun
159c0 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  c=pAggInfo->aFun
159d0 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  c, i=0; i<pAggIn
159e0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
159f0 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71  pFunc++){.    sq
15a00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
15a10 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 70 46  , OP_MemNull, pF
15a20 75 6e 63 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20  unc->iMem, 0);. 
15a30 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44     if( pFunc->iD
15a40 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
15a50 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
15a60 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Func->pExpr;.   
15a70 20 20 20 69 66 28 20 70 45 2d 3e 70 4c 69 73 74     if( pE->pList
15a80 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 4c 69 73 74  ==0 || pE->pList
15a90 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20  ->nExpr!=1 ){.  
15aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
15ab0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44  orMsg(pParse, "D
15ac0 49 53 54 49 4e 43 54 20 69 6e 20 61 67 67 72 65  ISTINCT in aggre
15ad0 67 61 74 65 20 6d 75 73 74 20 62 65 20 66 6f 6c  gate must be fol
15ae0 6c 6f 77 65 64 20 22 0a 20 20 20 20 20 20 20 20  lowed ".        
15af0 20 20 20 22 62 79 20 61 6e 20 65 78 70 72 65 73     "by an expres
15b00 73 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  sion");.        
15b10 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
15b20 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
15b30 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49  se{.        KeyI
15b40 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
15b50 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
15b60 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e  ist(pParse, pE->
15b70 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pList);.        
15b80 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
15b90 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
15ba0 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  al, pFunc->iDist
15bb0 69 6e 63 74 2c 20 30 2c 20 0a 20 20 20 20 20 20  inct, 0, .      
15bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bd0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
15be0 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f  nfo, P3_KEYINFO_
15bf0 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
15c00 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
15c10 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
15c20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f  OP_AggFinalize o
15c30 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  pcode for every 
15c40 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
15c50 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67  on.** in the Agg
15c60 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  Info structure..
15c70 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
15c80 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
15c90 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ons(Parse *pPars
15ca0 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
15cb0 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
15cc0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
15cd0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
15ce0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
15cf0 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   *pF;.  for(i=0,
15d00 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
15d10 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
15d20 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
15d30 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  +){.    ExprList
15d40 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
15d50 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
15d60 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
15d70 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70  , OP_AggFinal, p
15d80 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f  F->iMem, pList ?
15d90 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
15da0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
15db0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
15dc0 70 46 2d 3e 70 46 75 6e 63 2c 20 50 33 5f 46 55  pF->pFunc, P3_FU
15dd0 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  NCDEF);.  }.}../
15de0 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20  *.** Update the 
15df0 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f  accumulator memo
15e00 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20  ry cells for an 
15e10 61 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20  aggregate based 
15e20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  on.** the curren
15e30 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
15e40 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
15e50 64 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61  d updateAccumula
15e60 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
15e70 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
15e80 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
15e90 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
15ea0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
15eb0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
15ec0 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41   *pF;.  struct A
15ed0 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a  ggInfo_col *pC;.
15ee0 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
15ef0 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66  ectMode = 1;.  f
15f00 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
15f10 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
15f20 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
15f30 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69  ++, pF++){.    i
15f40 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74  nt nArg;.    int
15f50 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20   addrNext = 0;. 
15f60 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
15f70 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
15f80 70 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70  pList;.    if( p
15f90 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41  List ){.      nA
15fa0 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  rg = pList->nExp
15fb0 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
15fc0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
15fd0 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 29 3b  (pParse, pList);
15fe0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15ff0 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20    nArg = 0;.    
16000 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44  }.    if( pF->iD
16010 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
16020 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73      addrNext = s
16030 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
16040 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73  bel(v);.      as
16050 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b  sert( nArg==1 );
16060 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69  .      codeDisti
16070 6e 63 74 28 76 2c 20 70 46 2d 3e 69 44 69 73 74  nct(v, pF->iDist
16080 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20  inct, addrNext, 
16090 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
160a0 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65  ( pF->pFunc->nee
160b0 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20  dCollSeq ){.    
160c0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
160d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75   = 0;.      stru
160e0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
160f0 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69   *pItem;.      i
16100 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65  nt j;.      asse
16110 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20  rt( pList!=0 ); 
16120 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20   /* pList!=0 if 
16130 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43  pF->pFunc->needC
16140 6f 6c 6c 53 65 71 20 69 73 20 74 72 75 65 20 2a  ollSeq is true *
16150 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  /.      for(j=0,
16160 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
16170 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72   !pColl && j<nAr
16180 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  g; j++, pItem++)
16190 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
161a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
161b0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
161c0 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
161d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
161e0 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
161f0 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
16200 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
16210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
16220 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
16230 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
16240 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
16250 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P3_COLLSEQ);.   
16260 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
16270 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 53  beOp3(v, OP_AggS
16280 74 65 70 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 6e  tep, pF->iMem, n
16290 41 72 67 2c 20 28 76 6f 69 64 2a 29 70 46 2d 3e  Arg, (void*)pF->
162a0 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43 44 45  pFunc, P3_FUNCDE
162b0 46 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72  F);.    if( addr
162c0 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71  Next ){.      sq
162d0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
162e0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78  Label(v, addrNex
162f0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
16300 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67  for(i=0, pC=pAgg
16310 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41  Info->aCol; i<pA
16320 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
16330 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29  ator; i++, pC++)
16340 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
16350 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43  rCode(pParse, pC
16360 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->pExpr);.    sq
16370 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
16380 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70  , OP_MemStore, p
16390 43 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 7d  C->iMem, 1);.  }
163a0 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
163b0 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a  ectMode = 0;.}..
163c0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
163d0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 67 69 76  code for the giv
163e0 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  en SELECT statem
163f0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ent..**.** The r
16400 65 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 72  esults are distr
16410 69 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75  ibuted in variou
16420 73 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67  s ways depending
16430 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65   on the.** value
16440 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20 69 50   of eDest and iP
16450 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65  arm..**.**     e
16460 44 65 73 74 20 56 61 6c 75 65 20 20 20 20 20 20  Dest Value      
16470 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d   Result.**     -
16480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 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 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
164c0 20 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20    SRT_Callback  
164d0 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c    Invoke the cal
164e0 6c 62 61 63 6b 20 66 6f 72 20 65 61 63 68 20 72  lback for each r
164f0 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
16500 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
16510 4d 65 6d 20 20 20 20 20 20 20 20 20 53 74 6f 72  Mem         Stor
16520 65 20 66 69 72 73 74 20 72 65 73 75 6c 74 20 69  e first result i
16530 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50  n memory cell iP
16540 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  arm.**.**     SR
16550 54 5f 53 65 74 20 20 20 20 20 20 20 20 20 53 74  T_Set         St
16560 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 6b  ore results as k
16570 65 79 73 20 6f 66 20 74 61 62 6c 65 20 69 50 61  eys of table iPa
16580 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  rm..**.**     SR
16590 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74  T_Union       St
165a0 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 61  ore results as a
165b0 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72   key in a tempor
165c0 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a  ary table iParm.
165d0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78  **.**     SRT_Ex
165e0 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65  cept      Remove
165f0 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68   results from th
16600 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
16610 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  e iParm..**.**  
16620 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20     SRT_Table    
16630 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
16640 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61   in temporary ta
16650 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20  ble iParm.**.** 
16660 54 68 65 20 74 61 62 6c 65 20 61 62 6f 76 65 20  The table above 
16670 69 73 20 69 6e 63 6f 6d 70 6c 65 74 65 2e 20 20  is incomplete.  
16680 41 64 64 69 74 69 6f 6e 61 6c 20 65 44 69 73 74  Additional eDist
16690 20 76 61 6c 75 65 20 68 61 76 65 20 62 65 20 61   value have be a
166a0 64 64 65 64 0a 2a 2a 20 73 69 6e 63 65 20 74 68  dded.** since th
166b0 69 73 20 63 6f 6d 6d 65 6e 74 20 77 61 73 20 77  is comment was w
166c0 72 69 74 74 65 6e 2e 20 20 53 65 65 20 74 68 65  ritten.  See the
166d0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
166e0 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 0a  () function for.
166f0 2a 2a 20 61 20 63 6f 6d 70 6c 65 74 65 20 6c 69  ** a complete li
16700 73 74 69 6e 67 20 6f 66 20 74 68 65 20 61 6c 6c  sting of the all
16710 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 65  owed values of e
16720 44 65 73 74 20 61 6e 64 20 74 68 65 69 72 20 6d  Dest and their m
16730 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  eanings..**.** T
16740 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
16750 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
16760 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
16770 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20  y errors are.** 
16780 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
16790 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
167a0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
167b0 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61  s left in.** pPa
167c0 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
167d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
167e0 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74   does NOT free t
167f0 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  he Select struct
16800 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20  ure passed in.  
16810 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66  The.** calling f
16820 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  unction needs to
16830 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20   do that..**.** 
16840 54 68 65 20 70 50 61 72 65 6e 74 2c 20 70 61 72  The pParent, par
16850 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70 50 61  entTab, and *pPa
16860 72 65 6e 74 41 67 67 20 66 69 65 6c 64 73 20 61  rentAgg fields a
16870 72 65 20 66 69 6c 6c 65 64 20 69 6e 20 69 66 20  re filled in if 
16880 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69  this.** SELECT i
16890 73 20 61 20 73 75 62 71 75 65 72 79 2e 20 20 54  s a subquery.  T
168a0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  his routine may 
168b0 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  try to combine t
168c0 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69  his SELECT.** wi
168d0 74 68 20 69 74 73 20 70 61 72 65 6e 74 20 74 6f  th its parent to
168e0 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 66   form a single f
168f0 6c 61 74 20 71 75 65 72 79 2e 20 20 49 6e 20 73  lat query.  In s
16900 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68  o doing, it migh
16910 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20  t.** change the 
16920 70 61 72 65 6e 74 20 71 75 65 72 79 20 66 72 6f  parent query fro
16930 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74  m a non-aggregat
16940 65 20 74 6f 20 61 6e 20 61 67 67 72 65 67 61 74  e to an aggregat
16950 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20  e query..** For 
16960 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 74 68 65  that reason, the
16970 20 70 50 61 72 65 6e 74 41 67 67 20 66 6c 61 67   pParentAgg flag
16980 20 69 73 20 70 61 73 73 65 64 20 61 73 20 61 20   is passed as a 
16990 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a  pointer, so it.*
169a0 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64  * can be changed
169b0 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20  ..**.** Example 
169c0 31 3a 20 20 20 54 68 65 20 6d 65 61 6e 69 6e 67  1:   The meaning
169d0 20 6f 66 20 74 68 65 20 70 50 61 72 65 6e 74 20   of the pParent 
169e0 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
169f0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
16a00 4d 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43  M t1 JOIN (SELEC
16a10 54 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52  T x, count(*) FR
16a20 4f 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a  OM t2) JOIN t3;.
16a30 2a 2a 20 20 20 20 5c 20 20 20 20 20 20 20 20 20  **    \         
16a40 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
16a50 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f  _____ subquery _
16a60 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f  ______/        /
16a70 0a 2a 2a 20 20 20 20 20 5c 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 20 20 20 20 2f                 /
16ab0 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  .**      \______
16ac0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
16ad0 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
16ae0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
16af0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
16b00 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
16b10 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
16b20 20 66 69 72 73 74 2e 20 20 20 46 6f 72 20 74 68   first.   For th
16b30 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72  at call,.** pPar
16b40 65 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ent will be NULL
16b50 2e 20 20 44 75 72 69 6e 67 20 74 68 65 20 70 72  .  During the pr
16b60 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20  ocessing of the 
16b70 6f 75 74 65 72 20 71 75 65 72 79 2c 20 74 68 69  outer query, thi
16b80 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  s .** routine is
16b90 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
16ba0 65 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ely to handle th
16bb0 65 20 73 75 62 71 75 65 72 79 2e 20 20 46 6f 72  e subquery.  For
16bc0 20 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 2a   the recursive.*
16bd0 2a 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20  * call, pParent 
16be0 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68  will point to th
16bf0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20  e outer query.  
16c00 42 65 63 61 75 73 65 20 74 68 65 20 73 75 62 71  Because the subq
16c10 75 65 72 79 20 69 73 0a 2a 2a 20 74 68 65 20 73  uery is.** the s
16c20 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e  econd element in
16c30 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69   a three-way joi
16c40 6e 2c 20 74 68 65 20 70 61 72 65 6e 74 54 61 62  n, the parentTab
16c50 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a   parameter will.
16c60 2a 2a 20 62 65 20 31 20 28 74 68 65 20 32 6e 64  ** be 1 (the 2nd
16c70 20 76 61 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e   value of a 0-in
16c80 64 65 78 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f  dexed array.).*/
16c90 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
16ca0 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
16cb0 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
16cc0 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
16cd0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
16ce0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
16cf0 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
16d00 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
16d10 65 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  ed. */.  int eDe
16d20 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
16d30 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
16d40 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73  e of the results
16d50 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c   */.  int iParm,
16d60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16d70 41 20 70 61 72 61 6d 65 74 65 72 20 75 73 65 64  A parameter used
16d80 20 62 79 20 74 68 65 20 65 44 65 73 74 20 64 69   by the eDest di
16d90 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f  sposal method */
16da0 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65  .  Select *pPare
16db0 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  nt,       /* Ano
16dc0 74 68 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20  ther SELECT for 
16dd0 77 68 69 63 68 20 74 68 69 73 20 69 73 20 61 20  which this is a 
16de0 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69  sub-query */.  i
16df0 6e 74 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20  nt parentTab,   
16e00 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
16e10 6e 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20  n pParent->pSrc 
16e20 6f 66 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f  of this query */
16e30 0a 20 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41  .  int *pParentA
16e40 67 67 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75  gg,       /* Tru
16e50 65 20 69 66 20 70 50 61 72 65 6e 74 20 75 73 65  e if pParent use
16e60 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
16e70 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20  tions */.  char 
16e80 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20  *aff            
16e90 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73    /* If eDest is
16ea0 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20   SRT_Union, the 
16eb0 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
16ec0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
16ed0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
16ee0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
16ef0 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
16f00 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52  pWInfo;     /* R
16f10 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74  eturn from sqlit
16f20 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
16f30 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
16f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16f50 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
16f60 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
16f70 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  tion */.  int is
16f80 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Agg;            
16f90 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c   /* True for sel
16fa0 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22  ect lists like "
16fb0 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45  count(*)" */.  E
16fc0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
16fd0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
16fe0 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72   columns to extr
16ff0 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  act. */.  SrcLis
17000 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
17010 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
17020 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f  es to select fro
17030 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  m */.  Expr *pWh
17040 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ere;          /*
17050 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
17060 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
17070 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
17080 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54  OrderBy;    /* T
17090 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
170a0 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
170b0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
170c0 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20  pGroupBy;    /* 
170d0 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  The GROUP BY cla
170e0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
170f0 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  L */.  Expr *pHa
17100 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  ving;         /*
17110 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   The HAVING clau
17120 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
17130 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74   */.  int isDist
17140 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  inct;        /* 
17150 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
17160 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
17170 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
17180 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20   distinct;      
17190 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
171a0 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74  use for the dist
171b0 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e  inct set */.  in
171c0 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20  t rc = 1;       
171d0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
171e0 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69   return from thi
171f0 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
17200 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65  int addrSortInde
17210 78 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  x;     /* Addres
17220 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45  s of an OP_OpenE
17230 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
17240 74 69 6f 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66  tion */.  AggInf
17250 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20  o sAggInfo;     
17260 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
17270 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74  used by aggregat
17280 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69  e queries */.  i
17290 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20  nt iEnd;        
172a0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
172b0 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74   of the end of t
172c0 68 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69  he query */..  i
172d0 66 28 20 70 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  f( p==0 || sqlit
172e0 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
172f0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
17300 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
17310 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
17320 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
17330 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
17340 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  CT, 0, 0, 0) ) r
17350 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65  eturn 1;.  memse
17360 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20  t(&sAggInfo, 0, 
17370 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29  sizeof(sAggInfo)
17380 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
17390 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
173a0 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20  _SELECT.  /* If 
173b0 74 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73  there is are a s
173c0 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69  equence of queri
173d0 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69  es, do the earli
173e0 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20  er ones first.. 
173f0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
17400 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ior ){.    if( p
17410 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20  ->pRightmost==0 
17420 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  ){.      Select 
17430 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 66 6f  *pLoop;.      fo
17440 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
17450 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
17460 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 20 20  Prior){.        
17470 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73  pLoop->pRightmos
17480 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20  t = p;.      }. 
17490 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
174a0 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72  multiSelect(pPar
174b0 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50  se, p, eDest, iP
174c0 61 72 6d 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 23  arm, aff);.  }.#
174d0 65 6e 64 69 66 0a 0a 20 20 70 4f 72 64 65 72 42  endif..  pOrderB
174e0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
174f0 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65  .  if( Ignorable
17500 4f 72 64 65 72 62 79 28 65 44 65 73 74 29 20 29  Orderby(eDest) )
17510 7b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  {.    p->pOrderB
17520 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  y = 0;.  }.  if(
17530 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65   sqlite3SelectRe
17540 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2c  solve(pParse, p,
17550 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   0) ){.    goto 
17560 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
17570 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
17580 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  pOrderBy;..  /* 
17590 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65  Make local copie
175a0 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  s of the paramet
175b0 65 72 73 20 66 6f 72 20 74 68 69 73 20 71 75 65  ers for this que
175c0 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c  ry..  */.  pTabL
175d0 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
175e0 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
175f0 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20  ere;.  pGroupBy 
17600 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
17610 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
17620 61 76 69 6e 67 3b 0a 20 20 69 73 41 67 67 20 3d  aving;.  isAgg =
17630 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 69 73 44   p->isAgg;.  isD
17640 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
17650 69 73 74 69 6e 63 74 3b 0a 20 20 70 45 4c 69 73  istinct;.  pELis
17660 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
17670 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29   if( pEList==0 )
17680 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
17690 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f  ;..  /* .  ** Do
176a0 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d 70   not even attemp
176b0 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  t to generate an
176c0 79 20 63 6f 64 65 20 69 66 20 77 65 20 68 61 76  y code if we hav
176d0 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a 20  e already seen. 
176e0 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f 72   ** errors befor
176f0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  e this routine s
17700 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tarts..  */.  if
17710 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  ( pParse->nErr>0
17720 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
17730 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69  nd;..  /* If wri
17740 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f  ting to memory o
17750 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73  r generating a s
17760 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73  et.  ** only a s
17770 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79  ingle column may
17780 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
17790 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
177a0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
177b0 69 66 28 20 28 65 44 65 73 74 3d 3d 53 52 54 5f  if( (eDest==SRT_
177c0 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  Mem || eDest==SR
177d0 54 5f 53 65 74 29 20 26 26 20 70 45 4c 69 73 74  T_Set) && pEList
177e0 2d 3e 6e 45 78 70 72 3e 31 20 29 7b 0a 20 20 20  ->nExpr>1 ){.   
177f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
17800 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61  (pParse, "only a
17810 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61   single result a
17820 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20  llowed for ".   
17830 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74 68      "a SELECT th
17840 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
17850 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20   expression");. 
17860 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
17870 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  nd;.  }.#endif..
17880 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 69 73    /* ORDER BY is
17890 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d   ignored for som
178a0 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a  e destinations..
178b0 20 20 2a 2f 0a 20 20 69 66 28 20 49 67 6e 6f 72    */.  if( Ignor
178c0 61 62 6c 65 4f 72 64 65 72 62 79 28 65 44 65 73  ableOrderby(eDes
178d0 74 29 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72  t) ){.    pOrder
178e0 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  By = 0;.  }..  /
178f0 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
17900 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng code..  */.  
17910 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
17920 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
17930 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ( v==0 ) goto se
17940 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
17950 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
17960 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
17970 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
17980 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ause.  */.#if !d
17990 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
179a0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
179b0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
179c0 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72  OMIT_VIEW).  for
179d0 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
179e0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
179f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
17a00 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
17a10 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65  = 0;.    int nee
17a20 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 3b  dRestoreContext;
17a30 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
17a40 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
17a50 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
17a60 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65  ];..    if( pIte
17a70 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c  m->pSelect==0 ||
17a80 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61   pItem->isPopula
17a90 74 65 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ted ) continue;.
17aa0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
17ab0 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
17ac0 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65   zSavedAuthConte
17ad0 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75  xt = pParse->zAu
17ae0 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20  thContext;.     
17af0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
17b00 6e 74 65 78 74 20 3d 20 70 49 74 65 6d 2d 3e 7a  ntext = pItem->z
17b10 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e 65 65 64  Name;.      need
17b20 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d  RestoreContext =
17b30 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
17b40 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65       needRestore
17b50 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20  Context = 0;.   
17b60 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65   }.    sqlite3Se
17b70 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 49 74  lect(pParse, pIt
17b80 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54  em->pSelect, SRT
17b90 5f 45 70 68 65 6d 54 61 62 2c 20 0a 20 20 20 20  _EphemTab, .    
17ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
17bb0 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70 2c 20  em->iCursor, p, 
17bc0 69 2c 20 26 69 73 41 67 67 2c 20 30 29 3b 0a 20  i, &isAgg, 0);. 
17bd0 20 20 20 69 66 28 20 6e 65 65 64 52 65 73 74 6f     if( needResto
17be0 72 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20 20  reContext ){.   
17bf0 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68     pParse->zAuth
17c00 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64  Context = zSaved
17c10 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20  AuthContext;.   
17c20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20   }.    pTabList 
17c30 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70  = p->pSrc;.    p
17c40 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72  Where = p->pWher
17c50 65 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f  e;.    if( !Igno
17c60 72 61 62 6c 65 4f 72 64 65 72 62 79 28 65 44 65  rableOrderby(eDe
17c70 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 72  st) ){.      pOr
17c80 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
17c90 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rBy;.    }.    p
17ca0 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
17cb0 6f 75 70 42 79 3b 0a 20 20 20 20 70 48 61 76 69  oupBy;.    pHavi
17cc0 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
17cd0 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63 74 20  .    isDistinct 
17ce0 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b  = p->isDistinct;
17cf0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
17d00 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20  * Check for the 
17d10 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20  special case of 
17d20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  a min() or max()
17d30 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 69 74 73   function by its
17d40 65 6c 66 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  elf.  ** in the 
17d50 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f  result set..  */
17d60 0a 20 20 69 66 28 20 73 69 6d 70 6c 65 4d 69 6e  .  if( simpleMin
17d70 4d 61 78 51 75 65 72 79 28 70 50 61 72 73 65 2c  MaxQuery(pParse,
17d80 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d   p, eDest, iParm
17d90 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b  ) ){.    rc = 0;
17da0 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
17db0 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
17dc0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
17dd0 74 68 69 73 20 69 73 20 61 20 73 75 62 71 75 65  this is a subque
17de0 72 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 22  ry that can be "
17df0 66 6c 61 74 74 65 6e 65 64 22 20 69 6e 74 6f 20  flattened" into 
17e00 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a  its parent..  **
17e10 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
17e20 73 20 61 20 70 6f 73 73 69 62 6c 69 74 79 2c 20  s a possiblity, 
17e30 64 6f 20 73 6f 20 61 6e 64 20 72 65 74 75 72 6e  do so and return
17e40 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a   immediately.  .
17e50 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
17e60 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
17e70 69 66 28 20 70 50 61 72 65 6e 74 20 26 26 20 70  if( pParent && p
17e80 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20  ParentAgg &&.   
17e90 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65     flattenSubque
17ea0 72 79 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65  ry(pParent, pare
17eb0 6e 74 54 61 62 2c 20 2a 70 50 61 72 65 6e 74 41  ntTab, *pParentA
17ec0 67 67 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20  gg, isAgg) ){.  
17ed0 20 20 69 66 28 20 69 73 41 67 67 20 29 20 2a 70    if( isAgg ) *p
17ee0 50 61 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20  ParentAgg = 1;. 
17ef0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
17f00 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  nd;.  }.#endif..
17f10 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
17f20 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
17f30 75 73 65 2c 20 74 68 65 6e 20 74 68 69 73 20 73  use, then this s
17f40 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65  orting.  ** inde
17f50 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62  x might end up b
17f60 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74  eing unused if t
17f70 68 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a  he data can be .
17f80 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69    ** extracted i
17f90 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64  n pre-sorted ord
17fa0 65 72 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  er.  If that is 
17fb0 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
17fc0 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45  he.  ** OP_OpenE
17fd0 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
17fe0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61  tion will be cha
17ff0 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f  nged to an OP_No
18000 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20  op once.  ** we 
18010 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20  figure out that 
18020 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
18030 78 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e  x is not needed.
18040 20 20 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e    The addrSortIn
18050 64 65 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  dex.  ** variabl
18060 65 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63  e is used to fac
18070 69 6c 69 74 61 74 65 20 74 68 61 74 20 63 68 61  ilitate that cha
18080 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nge..  */.  if( 
18090 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
180a0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
180b0 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  o;.    if( pPars
180c0 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20  e->nErr ){.     
180d0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
180e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79  ;.    }.    pKey
180f0 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
18100 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
18110 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  e, pOrderBy);.  
18120 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75    pOrderBy->iECu
18130 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
18140 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64  Tab++;.    p->ad
18150 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
18160 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a  addrSortIndex =.
18170 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18180 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  eOp3(v, OP_OpenE
18190 70 68 65 6d 65 72 61 6c 2c 20 70 4f 72 64 65 72  phemeral, pOrder
181a0 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f  By->iECursor, pO
181b0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c  rderBy->nExpr+2,
181c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181d0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
181e0 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  Info, P3_KEYINFO
181f0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c  _HANDOFF);.  }el
18200 73 65 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74  se{.    addrSort
18210 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a  Index = -1;.  }.
18220 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74  .  /* If the out
18230 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20  put is destined 
18240 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  for a temporary 
18250 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74  table, open that
18260 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
18270 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  f( eDest==SRT_Ep
18280 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71  hemTab ){.    sq
18290 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
182a0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
182b0 61 6c 2c 20 69 50 61 72 6d 2c 20 70 45 4c 69 73  al, iParm, pELis
182c0 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a  t->nExpr);.  }..
182d0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d    /* Set the lim
182e0 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e  iter..  */.  iEn
182f0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
18300 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63  akeLabel(v);.  c
18310 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
18320 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
18330 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65  iEnd);..  /* Ope
18340 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  n a virtual inde
18350 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  x to use for the
18360 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
18370 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74   */.  if( isDist
18380 69 6e 63 74 20 29 7b 0a 20 20 20 20 4b 65 79 49  inct ){.    KeyI
18390 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
183a0 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50     distinct = pP
183b0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
183c0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
183d0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
183e0 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
183f0 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
18400 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
18410 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 69 73  enEphemeral, dis
18420 74 69 6e 63 74 2c 20 30 2c 20 0a 20 20 20 20 20  tinct, 0, .     
18430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18440 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
18450 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P3_KEYINFO_H
18460 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65  ANDOFF);.  }else
18470 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d  {.    distinct =
18480 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41   -1;.  }..  /* A
18490 67 67 72 65 67 61 74 65 20 61 6e 64 20 6e 6f 6e  ggregate and non
184a0 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69  -aggregate queri
184b0 65 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 64  es are handled d
184c0 69 66 66 65 72 65 6e 74 6c 79 20 2a 2f 0a 20 20  ifferently */.  
184d0 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47  if( !isAgg && pG
184e0 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20  roupBy==0 ){.   
184f0 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 69 73   /* This case is
18500 20 66 6f 72 20 6e 6f 6e 2d 61 67 67 72 65 67 61   for non-aggrega
18510 74 65 20 71 75 65 72 69 65 73 0a 20 20 20 20 2a  te queries.    *
18520 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
18530 62 61 73 65 20 73 63 61 6e 0a 20 20 20 20 2a 2f  base scan.    */
18540 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  .    pWInfo = sq
18550 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
18560 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
18570 2c 20 70 57 68 65 72 65 2c 20 26 70 4f 72 64 65  , pWhere, &pOrde
18580 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 57  rBy);.    if( pW
18590 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
185a0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20  elect_end;..    
185b0 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e  /* If sorting in
185c0 64 65 78 20 74 68 61 74 20 77 61 73 20 63 72 65  dex that was cre
185d0 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20  ated by a prior 
185e0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
185f0 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63   .    ** instruc
18600 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f  tion ended up no
18610 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20  t being needed, 
18620 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20  then change the 
18630 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
18640 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20  .    ** into an 
18650 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  OP_Noop..    */.
18660 20 20 20 20 69 66 28 20 61 64 64 72 53 6f 72 74      if( addrSort
18670 49 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f 72 64  Index>=0 && pOrd
18680 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
18690 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
186a0 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
186b0 53 6f 72 74 49 6e 64 65 78 2c 20 31 29 3b 0a 20  SortIndex, 1);. 
186c0 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
186d0 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[2] = -1;.  
186e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20    }..    /* Use 
186f0 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e  the standard inn
18700 65 72 20 6c 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20  er loop.    */. 
18710 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e     if( selectInn
18720 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
18730 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  , pEList, 0, 0, 
18740 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e  pOrderBy, distin
18750 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20  ct, eDest,.     
18760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
18770 50 61 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69 43  Parm, pWInfo->iC
18780 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d  ontinue, pWInfo-
18790 3e 69 42 72 65 61 6b 2c 20 61 66 66 29 20 29 7b  >iBreak, aff) ){
187a0 0a 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  .       goto sel
187b0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a  ect_end;.    }..
187c0 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64      /* End the d
187d0 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f  atabase scan loo
187e0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  p..    */.    sq
187f0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
18800 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Info);.  }else{.
18810 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
18820 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  he processing fo
18830 72 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  r aggregate quer
18840 69 65 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43  ies */.    NameC
18850 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f  ontext sNC;    /
18860 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
18870 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67  or processing ag
18880 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74  gregate informat
18890 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ion */.    int i
188a0 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  AMem;          /
188b0 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72  * First Mem addr
188c0 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ess for storing 
188d0 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
188e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65   */.    int iBMe
188f0 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
18900 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
18910 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52   for previous GR
18920 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
18930 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20  t iUseFlag;     
18940 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
18950 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e   holding flag in
18960 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74  dicating that at
18970 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20   least.         
18980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
18990 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65  * one row of the
189a0 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67   input to the ag
189b0 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65  gregator has bee
189c0 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
189d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
189e0 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e  cessed */.    in
189f0 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20  t iAbortFlag;   
18a00 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
18a10 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75   which causes qu
18a20 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73  ery abort if pos
18a30 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74  itive */.    int
18a40 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20   groupBySort;   
18a50 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72   /* Rows come fr
18a60 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f  om source in GRO
18a70 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 0a  UP BY order */..
18a80 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
18a90 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 20  owing variables 
18aa0 68 6f 6c 64 20 61 64 64 72 65 73 73 65 73 20 6f  hold addresses o
18ab0 72 20 6c 61 62 65 6c 73 20 66 6f 72 20 70 61 72  r labels for par
18ac0 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ts of the.    **
18ad0 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
18ae0 20 70 72 6f 67 72 61 6d 20 77 65 20 61 72 65 20   program we are 
18af0 70 75 74 74 69 6e 67 20 74 6f 67 65 74 68 65 72  putting together
18b00 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
18b10 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 20 20 20  OutputRow;      
18b20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72  /* Start of subr
18b30 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
18b40 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77  uts a result row
18b50 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
18b60 53 65 74 41 62 6f 72 74 3b 20 20 20 20 20 20 20  SetAbort;       
18b70 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74  /* Set the abort
18b80 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e   flag and return
18b90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
18ba0 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 3b 20  InitializeLoop; 
18bb0 2f 2a 20 53 74 61 72 74 20 6f 66 20 63 6f 64 65  /* Start of code
18bc0 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65   that initialize
18bd0 73 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70  s the input loop
18be0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
18bf0 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 20 20 20 20  TopOfLoop;      
18c00 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
18c10 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  put loop */.    
18c20 69 6e 74 20 61 64 64 72 47 72 6f 75 70 42 79 43  int addrGroupByC
18c30 68 61 6e 67 65 3b 20 20 2f 2a 20 43 6f 64 65 20  hange;  /* Code 
18c40 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 20 61  that runs when a
18c50 6e 79 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  ny GROUP BY term
18c60 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20   changes */.    
18c70 69 6e 74 20 61 64 64 72 50 72 6f 63 65 73 73 52  int addrProcessR
18c80 6f 77 3b 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ow;     /* Code 
18c90 74 6f 20 70 72 6f 63 65 73 73 20 61 20 73 69 6e  to process a sin
18ca0 67 6c 65 20 69 6e 70 75 74 20 72 6f 77 20 2a 2f  gle input row */
18cb0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64  .    int addrEnd
18cc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18cd0 45 6e 64 20 6f 66 20 61 6c 6c 20 70 72 6f 63 65  End of all proce
18ce0 73 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  ssing */.    int
18cf0 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b   addrSortingIdx;
18d00 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f 4f       /* The OP_O
18d10 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72  penEphemeral for
18d20 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
18d30 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  ex */.    int ad
18d40 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 20 20  drReset;        
18d50 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20    /* Subroutine 
18d60 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68  for resetting th
18d70 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f  e accumulator */
18d80 0a 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20  ..    addrEnd = 
18d90 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
18da0 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  abel(v);..    /*
18db0 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55   Convert TK_COLU
18dc0 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b  MN nodes into TK
18dd0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20  _AGG_COLUMN and 
18de0 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a  make entries in.
18df0 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20      ** sAggInfo 
18e00 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46  for all TK_AGG_F
18e10 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e  UNCTION nodes in
18e20 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   expressions of 
18e30 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43  the.    ** SELEC
18e40 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  T statement..   
18e50 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
18e60 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
18e70 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50  NC));.    sNC.pP
18e80 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
18e90 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
18ea0 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  = pTabList;.    
18eb0 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26  sNC.pAggInfo = &
18ec0 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41  sAggInfo;.    sA
18ed0 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
18ee0 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79  olumn = pGroupBy
18ef0 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   ? pGroupBy->nEx
18f00 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73 41  pr+1 : 0;.    sA
18f10 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20  ggInfo.pGroupBy 
18f20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = pGroupBy;.    
18f30 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41  if( sqlite3ExprA
18f40 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
18f50 4e 43 2c 20 70 45 4c 69 73 74 29 20 29 7b 0a 20  NC, pEList) ){. 
18f60 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
18f70 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
18f80 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41  if( sqlite3ExprA
18f90 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
18fa0 4e 43 2c 20 70 4f 72 64 65 72 42 79 29 20 29 7b  NC, pOrderBy) ){
18fb0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
18fc0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
18fd0 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 26 26    if( pHaving &&
18fe0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
18ff0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73  yzeAggregates(&s
19000 4e 43 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a  NC, pHaving) ){.
19010 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
19020 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
19030 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d   sAggInfo.nAccum
19040 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66  ulator = sAggInf
19050 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66  o.nColumn;.    f
19060 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
19070 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a  fo.nFunc; i++){.
19080 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
19090 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
190a0 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e  ist(&sNC, sAggIn
190b0 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
190c0 72 2d 3e 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  r->pList) ){.   
190d0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
190e0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
190f0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
19100 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
19110 29 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  ) ) goto select_
19120 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  end;..    /* Pro
19130 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72  cessing for aggr
19140 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55  egates with GROU
19150 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66  P BY is very dif
19160 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a  ferent and.    *
19170 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70  * much more comp
19180 6c 65 78 20 74 68 61 20 61 67 67 72 65 67 61 74  lex tha aggregat
19190 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f  es without a GRO
191a0 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  UP BY..    */.  
191b0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
191c0 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  {.      KeyInfo 
191d0 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b  *pKeyInfo;  /* K
191e0 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  eying informatio
191f0 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20  n for the group 
19200 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20  by clause */..  
19210 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61      /* Create la
19220 62 65 6c 73 20 74 68 61 74 20 77 65 20 77 69 6c  bels that we wil
19230 6c 20 62 65 20 6e 65 65 64 69 6e 67 0a 20 20 20  l be needing.   
19240 20 20 20 2a 2f 0a 20 20 20 20 20 0a 20 20 20 20     */.     .    
19250 20 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65    addrInitialize
19260 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
19270 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
19280 20 20 20 20 20 20 61 64 64 72 47 72 6f 75 70 42        addrGroupB
19290 79 43 68 61 6e 67 65 20 3d 20 73 71 6c 69 74 65  yChange = sqlite
192a0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
192b0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 50 72 6f  );.      addrPro
192c0 63 65 73 73 52 6f 77 20 3d 20 73 71 6c 69 74 65  cessRow = sqlite
192d0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
192e0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
192f0 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50  there is a GROUP
19300 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69   BY clause we mi
19310 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69  ght need a sorti
19320 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20  ng index to.    
19330 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69    ** implement i
19340 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61  t.  Allocate tha
19350 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  t sorting index 
19360 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e  now.  If it turn
19370 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  s out.      ** t
19380 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  hat we do not ne
19390 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c  ed it after all,
193a0 20 74 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72   the OpenEphemer
193b0 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20  al instruction. 
193c0 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20       ** will be 
193d0 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
193e0 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a   Noop.  .      *
193f0 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f  /.      sAggInfo
19400 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50  .sortingIdx = pP
19410 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
19420 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
19430 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
19440 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
19450 70 42 79 29 3b 0a 20 20 20 20 20 20 61 64 64 72  pBy);.      addr
19460 53 6f 72 74 69 6e 67 49 64 78 20 3d 0a 20 20 20  SortingIdx =.   
19470 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19480 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  beOp3(v, OP_Open
19490 45 70 68 65 6d 65 72 61 6c 2c 20 73 41 67 67 49  Ephemeral, sAggI
194a0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a  nfo.sortingIdx,.
194b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194c0 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
194d0 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
194e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
194f0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
19500 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b  *)pKeyInfo, P3_K
19510 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
19520 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69  ..      /* Initi
19530 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63  alize memory loc
19540 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47  ations used by G
19550 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74  ROUP BY aggregat
19560 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20  e processing.   
19570 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65     */.      iUse
19580 46 6c 61 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Flag = pParse->n
19590 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69 41 62  Mem++;.      iAb
195a0 6f 72 74 46 6c 61 67 20 3d 20 70 50 61 72 73 65  ortFlag = pParse
195b0 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  ->nMem++;.      
195c0 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iAMem = pParse->
195d0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72  nMem;.      pPar
195e0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
195f0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
19600 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73     iBMem = pPars
19610 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70  e->nMem;.      p
19620 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
19630 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
19640 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19650 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
19660 49 6e 74 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c  Int, 0, iAbortFl
19670 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
19680 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 63 6c  omment((v, "# cl
19690 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29  ear abort flag")
196a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
196b0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
196c0 4d 65 6d 49 6e 74 2c 20 30 2c 20 69 55 73 65 46  MemInt, 0, iUseF
196d0 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
196e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 69  Comment((v, "# i
196f0 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61  ndicate accumula
19700 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20  tor empty"));.  
19710 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19720 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
19730 20 30 2c 20 61 64 64 72 49 6e 69 74 69 61 6c 69   0, addrInitiali
19740 7a 65 4c 6f 6f 70 29 3b 0a 0a 20 20 20 20 20 20  zeLoop);..      
19750 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
19760 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
19770 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72  tputs a single r
19780 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
19790 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20  .      ** set.  
197a0 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  This subroutine 
197b0 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74  first looks at t
197c0 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66  he iUseFlag.  If
197d0 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20   iUseFlag.      
197e0 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ** is less than 
197f0 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
19800 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
19810 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
19820 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72  .      ** the pr
19830 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66  ocessing calls f
19840 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  or the query to 
19850 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72  abort, this subr
19860 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
19870 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69  increments the i
19880 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79  AbortFlag memory
19890 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65   location before
198a0 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20   returning in.  
198b0 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20      ** order to 
198c0 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65  signal the calle
198d0 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20  r to abort..    
198e0 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53    */.      addrS
198f0 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65  etAbort = sqlite
19900 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
19910 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
19920 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
19930 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 69 41 62  P_MemInt, 1, iAb
19940 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
19950 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
19960 22 23 20 73 65 74 20 61 62 6f 72 74 20 66 6c 61  "# set abort fla
19970 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
19980 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
19990 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29  OP_Return, 0, 0)
199a0 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70  ;.      addrOutp
199b0 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  utRow = sqlite3V
199c0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
199d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
199e0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
199f0 49 66 4d 65 6d 50 6f 73 2c 20 69 55 73 65 46 6c  IfMemPos, iUseFl
19a00 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ag, addrOutputRo
19a10 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65  w+2);.      Vdbe
19a20 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 47  Comment((v, "# G
19a30 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65  roupby result ge
19a40 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f  nerator entry po
19a50 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71  int"));.      sq
19a60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
19a70 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20  , OP_Return, 0, 
19a80 30 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69  0);.      finali
19a90 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
19aa0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
19ab0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 61  );.      if( pHa
19ac0 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  ving ){.        
19ad0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
19ae0 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
19af0 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ng, addrOutputRo
19b00 77 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  w+1, 1);.      }
19b10 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65  .      rc = sele
19b20 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
19b30 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
19b40 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
19b50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19b60 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
19b70 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 20 69 50  tinct, eDest, iP
19b80 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  arm, .          
19b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ba0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31   addrOutputRow+1
19bb0 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74 2c 20  , addrSetAbort, 
19bc0 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  aff);.      if( 
19bd0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
19be0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
19bf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
19c00 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
19c10 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30   OP_Return, 0, 0
19c20 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
19c30 6d 65 6e 74 28 28 76 2c 20 22 23 20 65 6e 64 20  ment((v, "# end 
19c40 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  groupby result g
19c50 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20  enerator"));..  
19c60 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
19c70 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
19c80 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65  t will reset the
19c90 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75   group-by accumu
19ca0 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20  lator.      */. 
19cb0 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d       addrReset =
19cc0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
19cd0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
19ce0 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
19cf0 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
19d00 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
19d10 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
19d20 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30   OP_Return, 0, 0
19d30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67  );..      /* Beg
19d40 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77  in a loop that w
19d50 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20  ill extract all 
19d60 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47  source rows in G
19d70 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20  ROUP BY order.. 
19d80 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
19d90 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73  ht involve two s
19da0 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69  eparate loops wi
19db0 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e  th an OP_Sort in
19dc0 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20   between, or.   
19dd0 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
19de0 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20  e a single loop 
19df0 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64  that uses an ind
19e00 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e  ex to extract in
19e10 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20  formation.      
19e20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20  ** in the right 
19e30 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77  order to begin w
19e40 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ith..      */.  
19e50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
19e60 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
19e70 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f  ddrInitializeLoo
19e80 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
19e90 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
19ea0 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 52  _Gosub, 0, addrR
19eb0 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49  eset);.      pWI
19ec0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
19ed0 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
19ee0 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
19ef0 2c 20 26 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  , &pGroupBy);.  
19f00 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
19f10 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
19f20 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70  end;.      if( p
19f30 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20  GroupBy==0 ){.  
19f40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74        /* The opt
19f50 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74  imizer is able t
19f60 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69  o deliver rows i
19f70 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72  n group by order
19f80 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   so.        ** w
19f90 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  e do not have to
19fa0 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f   sort.  The OP_O
19fb0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62  penEphemeral tab
19fc0 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  le will be.     
19fd0 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20     ** cancelled 
19fe0 6c 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65  later because we
19ff0 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75   still need to u
1a000 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a  se the pKeyInfo.
1a010 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1a020 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
1a030 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20  >pGroupBy;.     
1a040 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
1a050 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
1a060 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73  .        /* Rows
1a070 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20   are coming out 
1a080 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20  in undetermined 
1a090 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20  order.  We have 
1a0a0 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20  to push.        
1a0b0 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f  ** each row into
1a0c0 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
1a0d0 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  , terminate the 
1a0e0 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20  first loop,.    
1a0f0 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70      ** then loop
1a100 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e   over the sortin
1a110 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72  g index in order
1a120 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70   to get the outp
1a130 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ut.        ** in
1a140 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20   sorted order.  
1a150 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1a160 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31   groupBySort = 1
1a170 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1a180 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
1a190 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  t(pParse, pGroup
1a1a0 42 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  By);.        sql
1a1b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1a1c0 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 73 41   OP_Sequence, sA
1a1d0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
1a1e0 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a  x, 0);.        j
1a1f0 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   = pGroupBy->nEx
1a200 70 72 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f  pr+1;.        fo
1a210 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
1a220 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
1a230 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
1a240 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
1a250 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e  Col = &sAggInfo.
1a260 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  aCol[i];.       
1a270 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
1a280 72 74 65 72 43 6f 6c 75 6d 6e 3c 6a 20 29 20 63  rterColumn<j ) c
1a290 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1a2a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1a2b0 64 65 47 65 74 43 6f 6c 75 6d 6e 28 76 2c 20 70  deGetColumn(v, p
1a2c0 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d  Col->pTab, pCol-
1a2d0 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e  >iColumn, pCol->
1a2e0 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20  iTable);.       
1a2f0 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     j++;.        
1a300 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
1a310 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1a320 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6a 2c 20  _MakeRecord, j, 
1a330 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
1a340 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1a350 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 73 41  OP_IdxInsert, sA
1a360 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
1a370 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  x, 0);.        s
1a380 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
1a390 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
1a3a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a3b0 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 73 41 67  (v, OP_Sort, sAg
1a3c0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
1a3d0 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
1a3e0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1a3f0 28 76 2c 20 22 23 20 47 52 4f 55 50 20 42 59 20  (v, "# GROUP BY 
1a400 73 6f 72 74 22 29 29 3b 0a 20 20 20 20 20 20 20  sort"));.       
1a410 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72   sAggInfo.useSor
1a420 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20  tingIdx = 1;.   
1a430 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45     }..      /* E
1a440 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72  valuate the curr
1a450 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
1a460 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20  ms and store in 
1a470 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20  b0, b1, b2....  
1a480 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65      ** (b0 is me
1a490 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42  mory location iB
1a4a0 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d  Mem+0, b1 is iBM
1a4b0 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72  em+1, and so for
1a4c0 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  th).      ** The
1a4d0 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75  n compare the cu
1a4e0 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
1a4f0 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65  erms against the
1a500 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a   GROUP BY terms.
1a510 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
1a520 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63  e previous row c
1a530 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
1a540 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e  in a0, a1, a2...
1a550 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1a560 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20  addrTopOfLoop = 
1a570 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1a580 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
1a590 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f   for(j=0; j<pGro
1a5a0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  upBy->nExpr; j++
1a5b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  ){.        if( g
1a5c0 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
1a5d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1a5e0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
1a5f0 6f 6c 75 6d 6e 2c 20 73 41 67 67 49 6e 66 6f 2e  olumn, sAggInfo.
1a600 73 6f 72 74 69 6e 67 49 64 78 2c 20 6a 29 3b 0a  sortingIdx, j);.
1a610 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1a620 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
1a630 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  o.directMode = 1
1a640 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1a650 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1a660 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
1a670 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  j].pExpr);.     
1a680 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
1a690 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1a6a0 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 42   OP_MemStore, iB
1a6b0 4d 65 6d 2b 6a 2c 20 6a 3c 70 47 72 6f 75 70 42  Mem+j, j<pGroupB
1a6c0 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  y->nExpr-1);.   
1a6d0 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
1a6e0 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  =pGroupBy->nExpr
1a6f0 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a  -1; j>=0; j--){.
1a700 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 47          if( j<pG
1a710 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 20  roupBy->nExpr-1 
1a720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
1a730 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1a740 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69 42 4d   OP_MemLoad, iBM
1a750 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20  em+j, 0);.      
1a760 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
1a770 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1a780 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69 41 4d 65  OP_MemLoad, iAMe
1a790 6d 2b 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  m+j, 0);.       
1a7a0 20 69 66 28 20 6a 3d 3d 30 20 29 7b 0a 20 20 20   if( j==0 ){.   
1a7b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1a7c0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 45 71  beAddOp(v, OP_Eq
1a7d0 2c 20 30 78 32 30 30 2c 20 61 64 64 72 50 72 6f  , 0x200, addrPro
1a7e0 63 65 73 73 52 6f 77 29 3b 0a 20 20 20 20 20 20  cessRow);.      
1a7f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a800 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a810 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c 20 30 78  dOp(v, OP_Ne, 0x
1a820 32 30 30 2c 20 61 64 64 72 47 72 6f 75 70 42 79  200, addrGroupBy
1a830 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 20  Change);.       
1a840 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
1a850 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
1a860 2c 20 2d 31 2c 20 28 76 6f 69 64 2a 29 70 4b 65  , -1, (void*)pKe
1a870 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 2c  yInfo->aColl[j],
1a880 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P3_COLLSEQ);.  
1a890 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1a8a0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1a8b0 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72  at runs whenever
1a8c0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 68   the GROUP BY ch
1a8d0 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20  anges..      ** 
1a8e0 43 68 61 6e 67 65 20 69 6e 20 74 68 65 20 47 52  Change in the GR
1a8f0 4f 55 50 20 42 59 20 61 72 65 20 64 65 74 65 63  OUP BY are detec
1a900 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69  ted by the previ
1a910 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a  ous code.      *
1a920 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65  * block.  If the
1a930 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67  re were no chang
1a940 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69  es, this block i
1a950 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20  s skipped..     
1a960 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69   **.      ** Thi
1a970 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75  s code copies cu
1a980 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74  rrent group by t
1a990 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32  erms in b0,b1,b2
1a9a0 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76  ,....      ** ov
1a9b0 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20  er to a0,a1,a2. 
1a9c0 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74   It then calls t
1a9d0 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  he output subrou
1a9e0 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e  tine.      ** an
1a9f0 64 20 72 65 73 65 74 73 20 74 68 65 20 61 67 67  d resets the agg
1aa00 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
1aa10 6f 72 20 72 65 67 69 73 74 65 72 73 20 69 6e 20  or registers in 
1aa20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20  preparation.    
1aa30 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78    ** for the nex
1aa40 74 20 47 52 4f 55 50 20 42 59 20 62 61 74 63 68  t GROUP BY batch
1aa50 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1aa60 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1aa70 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
1aa80 47 72 6f 75 70 42 79 43 68 61 6e 67 65 29 3b 0a  GroupByChange);.
1aa90 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
1aaa0 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
1aab0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1aac0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1aad0 28 76 2c 20 4f 50 5f 4d 65 6d 4d 6f 76 65 2c 20  (v, OP_MemMove, 
1aae0 69 41 4d 65 6d 2b 6a 2c 20 69 42 4d 65 6d 2b 6a  iAMem+j, iBMem+j
1aaf0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ab00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ab10 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  p(v, OP_Gosub, 0
1ab20 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
1ab30 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
1ab40 65 6e 74 28 28 76 2c 20 22 23 20 6f 75 74 70 75  ent((v, "# outpu
1ab50 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20  t one row"));.  
1ab60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ab70 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d  ddOp(v, OP_IfMem
1ab80 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c  Pos, iAbortFlag,
1ab90 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
1aba0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1abb0 20 22 23 20 63 68 65 63 6b 20 61 62 6f 72 74 20   "# check abort 
1abc0 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
1abd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1abe0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20  v, OP_Gosub, 0, 
1abf0 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
1ac00 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1ac10 2c 20 22 23 20 72 65 73 65 74 20 61 63 63 75 6d  , "# reset accum
1ac20 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  ulator"));..    
1ac30 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
1ac40 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
1ac50 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20  lators based on 
1ac60 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20  the content of. 
1ac70 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72       ** the curr
1ac80 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f  ent row.      */
1ac90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1aca0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1acb0 2c 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77  , addrProcessRow
1acc0 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41  );.      updateA
1acd0 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
1ace0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
1acf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ad00 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
1ad10 6e 74 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29  nt, 1, iUseFlag)
1ad20 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
1ad30 65 6e 74 28 28 76 2c 20 22 23 20 69 6e 64 69 63  ent((v, "# indic
1ad40 61 74 65 20 64 61 74 61 20 69 6e 20 61 63 63 75  ate data in accu
1ad50 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  mulator"));..   
1ad60 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65     /* End of the
1ad70 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20   loop.      */. 
1ad80 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
1ad90 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
1ada0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1adb0 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 73 41 67  (v, OP_Next, sAg
1adc0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
1add0 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29  , addrTopOfLoop)
1ade0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1adf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
1ae00 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
1ae10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1ae20 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
1ae30 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  v, addrSortingId
1ae40 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  x, 1);.      }..
1ae50 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
1ae60 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66  the final row of
1ae70 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f   result.      */
1ae80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ae90 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
1aea0 73 75 62 2c 20 30 2c 20 61 64 64 72 4f 75 74 70  sub, 0, addrOutp
1aeb0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
1aec0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
1aed0 20 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f   output final ro
1aee0 77 22 29 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  w"));.      .   
1aef0 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f   } /* endif pGro
1af00 75 70 42 79 20 2a 2f 0a 20 20 20 20 65 6c 73 65  upBy */.    else
1af10 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73   {.      /* This
1af20 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74 68   case runs if th
1af30 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20  e aggregate has 
1af40 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
1af50 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a  se.  The.      *
1af60 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20  * processing is 
1af70 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e  much simpler sin
1af80 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79  ce there is only
1af90 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20   a single row.  
1afa0 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74      ** of output
1afb0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1afc0 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
1afd0 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
1afe0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  nfo);.      pWIn
1aff0 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
1b000 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
1b010 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
1b020 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
1b030 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
1b040 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
1b050 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
1b060 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
1b070 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
1b080 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
1b090 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 66 69 6e  Info);.      fin
1b0a0 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
1b0b0 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  s(pParse, &sAggI
1b0c0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 4f 72 64  nfo);.      pOrd
1b0d0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
1b0e0 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20  if( pHaving ){. 
1b0f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1b100 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1b110 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45  , pHaving, addrE
1b120 6e 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  nd, 1);.      }.
1b130 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
1b140 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
1b150 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30   p->pEList, 0, 0
1b160 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20  , 0, -1, .      
1b170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b180 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 61 64  eDest, iParm, ad
1b190 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 2c 20  drEnd, addrEnd, 
1b1a0 61 66 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  aff);.    }.    
1b1b0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1b1c0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45  veLabel(v, addrE
1b1d0 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a  nd);.    .  } /*
1b1e0 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65   endif aggregate
1b1f0 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20   query */..  /* 
1b200 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
1b210 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
1b220 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  then we need to 
1b230 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73  sort the results
1b240 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74  .  ** and send t
1b250 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  hem to the callb
1b260 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  ack one by one..
1b270 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
1b280 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  rBy ){.    gener
1b290 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72  ateSortTail(pPar
1b2a0 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74  se, p, v, pEList
1b2b0 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20  ->nExpr, eDest, 
1b2c0 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 23 69 66  iParm);.  }..#if
1b2d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b2e0 5f 53 55 42 51 55 45 52 59 0a 20 20 2f 2a 20 49  _SUBQUERY.  /* I
1b2f0 66 20 74 68 69 73 20 77 61 73 20 61 20 73 75 62  f this was a sub
1b300 71 75 65 72 79 2c 20 77 65 20 68 61 76 65 20 6e  query, we have n
1b310 6f 77 20 63 6f 6e 76 65 72 74 65 64 20 74 68 65  ow converted the
1b320 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 61   subquery into a
1b330 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
1b340 74 61 62 6c 65 2e 20 20 53 6f 20 73 65 74 20 74  table.  So set t
1b350 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2e  he SrcList_item.
1b360 69 73 50 6f 70 75 6c 61 74 65 64 20 66 6c 61 67  isPopulated flag
1b370 20 74 6f 20 70 72 65 76 65 6e 74 0a 20 20 2a 2a   to prevent.  **
1b380 20 74 68 69 73 20 73 75 62 71 75 65 72 79 20 66   this subquery f
1b390 72 6f 6d 20 62 65 69 6e 67 20 65 76 61 6c 75 61  rom being evalua
1b3a0 74 65 64 20 61 67 61 69 6e 20 61 6e 64 20 74 6f  ted again and to
1b3b0 20 66 6f 72 63 65 20 74 68 65 20 75 73 65 20 6f   force the use o
1b3c0 66 0a 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f  f.  ** the tempo
1b3d0 72 61 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  rary table..  */
1b3e0 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 29  .  if( pParent )
1b3f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1b400 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53 72  arent->pSrc->nSr
1b410 63 3e 70 61 72 65 6e 74 54 61 62 20 29 3b 0a 20  c>parentTab );. 
1b420 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
1b430 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65  nt->pSrc->a[pare
1b440 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 3d 3d  ntTab].pSelect==
1b450 70 20 29 3b 0a 20 20 20 20 70 50 61 72 65 6e 74  p );.    pParent
1b460 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74  ->pSrc->a[parent
1b470 54 61 62 5d 2e 69 73 50 6f 70 75 6c 61 74 65 64  Tab].isPopulated
1b480 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 1;.  }.#endif
1b490 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
1b4a0 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75   to skip this qu
1b4b0 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ery.  */.  sqlit
1b4c0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1b4d0 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20  el(v, iEnd);..  
1b4e0 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61  /* The SELECT wa
1b4f0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
1b500 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20  oded.   Set the 
1b510 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30  return code to 0
1b520 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
1b530 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a  e no errors..  *
1b540 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f  /.  rc = 0;..  /
1b550 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20  * Control jumps 
1b560 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72  to here if an er
1b570 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
1b580 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f  ed above, or upo
1b590 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75  n.  ** successfu
1b5a0 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  l coding of the 
1b5b0 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c  SELECT..  */.sel
1b5c0 65 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f 2a 20 49  ect_end:..  /* I
1b5d0 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e  dentify column n
1b5e0 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20  ames if we will 
1b5f0 62 65 20 75 73 69 6e 67 20 74 68 65 6d 20 69 6e  be using them in
1b600 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68   a callback.  Th
1b610 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20  is.  ** step is 
1b620 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f  skipped if the o
1b630 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74  utput is going t
1b640 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20 64 65 73  o some other des
1b650 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  tination..  */. 
1b660 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b670 4f 4b 20 26 26 20 65 44 65 73 74 3d 3d 53 52 54  OK && eDest==SRT
1b680 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
1b690 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
1b6a0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
1b6b0 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
1b6c0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 46 72 65    }..  sqliteFre
1b6d0 65 28 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29  e(sAggInfo.aCol)
1b6e0 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 73  ;.  sqliteFree(s
1b6f0 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a  AggInfo.aFunc);.
1b700 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b710 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1b720 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
1b730 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
1b740 29 0a 2f 2a 0a 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 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ****.** The foll
1b7a0 6f 77 69 6e 67 20 63 6f 64 65 20 69 73 20 75 73  owing code is us
1b7b0 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
1b7c0 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
1b7d0 79 2e 20 20 54 68 65 20 63 6f 64 65 0a 2a 2a 20  y.  The code.** 
1b7e0 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64 6f 65  that follows doe
1b7f0 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20  s not appear in 
1b800 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2e 0a 2a  normal builds..*
1b810 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
1b820 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
1b830 70 72 69 6e 74 20 6f 75 74 20 74 68 65 20 63 6f  print out the co
1b840 6e 74 65 6e 74 20 6f 66 20 61 6c 6c 20 6f 72 20  ntent of all or 
1b850 70 61 72 74 20 6f 66 20 61 20 0a 2a 2a 20 70 61  part of a .** pa
1b860 72 73 65 20 73 74 72 75 63 74 75 72 65 73 20 73  rse structures s
1b870 75 63 68 20 61 73 20 53 65 6c 65 63 74 20 6f 72  uch as Select or
1b880 20 45 78 70 72 2e 20 20 53 75 63 68 20 70 72 69   Expr.  Such pri
1b890 6e 74 6f 75 74 73 20 61 72 65 20 75 73 65 66 75  ntouts are usefu
1b8a0 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c 70 69 6e 67  l.** for helping
1b8b0 20 74 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 77   to understand w
1b8c0 68 61 74 20 69 73 20 68 61 70 70 65 6e 69 6e 67  hat is happening
1b8d0 20 69 6e 73 69 64 65 20 74 68 65 20 63 6f 64 65   inside the code
1b8e0 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 64 75   generator.** du
1b8f0 72 69 6e 67 20 74 68 65 20 65 78 65 63 75 74 69  ring the executi
1b900 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65 78 20 53 45  on of complex SE
1b910 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
1b920 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
1b930 74 69 6e 65 20 61 72 65 20 6e 6f 74 20 63 61 6c  tine are not cal
1b940 6c 65 64 20 61 6e 79 77 68 65 72 65 20 66 72 6f  led anywhere fro
1b950 6d 20 77 69 74 68 69 6e 20 74 68 65 20 6e 6f 72  m within the nor
1b960 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20 62 61 73 65  mal.** code base
1b970 2e 20 20 54 68 65 6e 20 61 72 65 20 69 6e 74 65  .  Then are inte
1b980 6e 64 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  nded to be calle
1b990 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68  d from within th
1b9a0 65 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 6f 72  e debugger.** or
1b9b0 20 66 72 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20   from temporary 
1b9c0 22 70 72 69 6e 74 66 22 20 73 74 61 74 65 6d 65  "printf" stateme
1b9d0 6e 74 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72  nts inserted for
1b9e0 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76   debugging..*/.v
1b9f0 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74  oid sqlite3Print
1ba00 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a 20  Expr(Expr *p){. 
1ba10 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20   if( p->token.z 
1ba20 26 26 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 3e 30 20  && p->token.n>0 
1ba30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
1ba40 62 75 67 50 72 69 6e 74 66 28 22 28 25 2e 2a 73  bugPrintf("(%.*s
1ba50 22 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 70  ", p->token.n, p
1ba60 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 7d 65  ->token.z);.  }e
1ba70 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
1ba80 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 25 64  DebugPrintf("(%d
1ba90 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a 20  ", p->op);.  }. 
1baa0 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 29 7b   if( p->pLeft ){
1bab0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
1bac0 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20  gPrintf(" ");.  
1bad0 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
1bae0 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  pr(p->pLeft);.  
1baf0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68  }.  if( p->pRigh
1bb00 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
1bb10 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 22 29  DebugPrintf(" ")
1bb20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
1bb30 6e 74 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74  ntExpr(p->pRight
1bb40 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1bb50 44 65 62 75 67 50 72 69 6e 74 66 28 22 29 22 29  DebugPrintf(")")
1bb60 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
1bb70 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 45 78  PrintExprList(Ex
1bb80 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
1bb90 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1bba0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
1bbb0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  pr; i++){.    sq
1bbc0 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70  lite3PrintExpr(p
1bbd0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1bbe0 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 4c 69  );.    if( i<pLi
1bbf0 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20  st->nExpr-1 ){. 
1bc00 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
1bc10 67 50 72 69 6e 74 66 28 22 2c 20 22 29 3b 0a 20  gPrintf(", ");. 
1bc20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20     }.  }.}.void 
1bc30 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65  sqlite3PrintSele
1bc40 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  ct(Select *p, in
1bc50 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 73 71 6c  t indent){.  sql
1bc60 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1bc70 22 25 2a 73 53 45 4c 45 43 54 28 25 70 29 20 22  "%*sSELECT(%p) "
1bc80 2c 20 69 6e 64 65 6e 74 2c 20 22 22 2c 20 70 29  , indent, "", p)
1bc90 3b 0a 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74  ;.  sqlite3Print
1bca0 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
1bcb0 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  st);.  sqlite3De
1bcc0 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
1bcd0 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20 29  .  if( p->pSrc )
1bce0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72 65  {.    char *zPre
1bcf0 66 69 78 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  fix;.    int i;.
1bd00 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22 46      zPrefix = "F
1bd10 52 4f 4d 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ROM";.    for(i=
1bd20 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53  0; i<p->pSrc->nS
1bd30 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
1bd40 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1bd50 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
1bd60 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  >pSrc->a[i];.   
1bd70 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1bd80 72 69 6e 74 66 28 22 25 2a 73 20 22 2c 20 69 6e  rintf("%*s ", in
1bd90 64 65 6e 74 2b 36 2c 20 7a 50 72 65 66 69 78 29  dent+6, zPrefix)
1bda0 3b 0a 20 20 20 20 20 20 7a 50 72 65 66 69 78 20  ;.      zPrefix 
1bdb0 3d 20 22 22 3b 0a 20 20 20 20 20 20 69 66 28 20  = "";.      if( 
1bdc0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
1bdd0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1bde0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 5c  3DebugPrintf("(\
1bdf0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  n");.        sql
1be00 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28  ite3PrintSelect(
1be10 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
1be20 69 6e 64 65 6e 74 2b 31 30 29 3b 0a 20 20 20 20  indent+10);.    
1be30 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1be40 50 72 69 6e 74 66 28 22 25 2a 73 29 22 2c 20 69  Printf("%*s)", i
1be50 6e 64 65 6e 74 2b 38 2c 20 22 22 29 3b 0a 20 20  ndent+8, "");.  
1be60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49      }else if( pI
1be70 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20  tem->zName ){.  
1be80 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
1be90 75 67 50 72 69 6e 74 66 28 22 25 73 22 2c 20 70  ugPrintf("%s", p
1bea0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
1beb0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1bec0 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20  pItem->pTab ){. 
1bed0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
1bee0 62 75 67 50 72 69 6e 74 66 28 22 28 74 61 62 6c  bugPrintf("(tabl
1bef0 65 3a 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e  e: %s)", pItem->
1bf00 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
1bf10 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1bf20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
1bf30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1bf40 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 41 53  DebugPrintf(" AS
1bf50 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c   %s", pItem->zAl
1bf60 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ias);.      }.  
1bf70 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 70 53 72      if( i<p->pSr
1bf80 63 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20  c->nSrc-1 ){.   
1bf90 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
1bfa0 67 50 72 69 6e 74 66 28 22 2c 22 29 3b 0a 20 20  gPrintf(",");.  
1bfb0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1bfc0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1bfd0 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  \n");.    }.  }.
1bfe0 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
1bff0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
1c000 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 57  bugPrintf("%*s W
1c010 48 45 52 45 20 22 2c 20 69 6e 64 65 6e 74 2c 20  HERE ", indent, 
1c020 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "");.    sqlite3
1c030 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 57 68  PrintExpr(p->pWh
1c040 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ere);.    sqlite
1c050 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
1c060 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ");.  }.  if( p-
1c070 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  >pGroupBy ){.   
1c080 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1c090 6e 74 66 28 22 25 2a 73 20 47 52 4f 55 50 20 42  ntf("%*s GROUP B
1c0a0 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29  Y ", indent, "")
1c0b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
1c0c0 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47  ntExprList(p->pG
1c0d0 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c  roupBy);.    sql
1c0e0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1c0f0 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  "\n");.  }.  if(
1c100 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20   p->pHaving ){. 
1c110 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1c120 72 69 6e 74 66 28 22 25 2a 73 20 48 41 56 49 4e  rintf("%*s HAVIN
1c130 47 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29  G ", indent, "")
1c140 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
1c150 6e 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  ntExpr(p->pHavin
1c160 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  g);.    sqlite3D
1c170 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
1c180 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
1c190 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
1c1a0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1c1b0 66 28 22 25 2a 73 20 4f 52 44 45 52 20 42 59 20  f("%*s ORDER BY 
1c1c0 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a  ", indent, "");.
1c1d0 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
1c1e0 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64  ExprList(p->pOrd
1c1f0 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  erBy);.    sqlit
1c200 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
1c210 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45 6e  n");.  }.}./* En
1c220 64 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75  d of the structu
1c230 72 65 20 64 65 62 75 67 20 70 72 69 6e 74 69 6e  re debug printin
1c240 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g code.*********
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 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  ****/.#endif /* 
1c2a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1c2b0 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  EST) || defined(
1c2c0 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 2a 2f  SQLITE_DEBUG) */
1c2d0 0a                                               .