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

Artifact 7e52f53ccf116456f1f5eebb5493973eda43c89a:


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 32 36 35  select.c,v 1.265
0200: 20 32 30 30 35 2f 30 39 2f 30 38 20 30 31 3a 35   2005/09/08 01:5
0210: 38 3a 34 33 20 64 72 68 20 45 78 70 20 24 0a 2a  8:43 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 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0250: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0260: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0270: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0280: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0290: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
02a0: 6c 65 63 74 4e 65 77 28 0a 20 20 45 78 70 72 4c  lectNew(.  ExprL
02b0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
02c0: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
02d0: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
02e0: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
02f0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0300: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0310: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0320: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0330: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0340: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0350: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0360: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0370: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0380: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0390: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
03a0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
03b0: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
03c0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
03d0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
03e0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
03f0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  use */.  int isD
0400: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f  istinct,       /
0410: 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  * true if the DI
0420: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
0430: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 45  s present */.  E
0440: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20  xpr *pLimit,    
0450: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0460: 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73  lue.  NULL means
0470: 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 45   not used */.  E
0480: 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20 20  xpr *pOffset    
0490: 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76       /* OFFSET v
04a0: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
04b0: 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29  s no offset */.)
04c0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
04d0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
04e0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
04f0: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65  *pNew) );.  asse
0500: 72 74 28 20 21 70 4f 66 66 73 65 74 20 7c 7c 20  rt( !pOffset || 
0510: 70 4c 69 6d 69 74 20 29 3b 20 20 20 2f 2a 20 43  pLimit );   /* C
0520: 61 6e 27 74 20 68 61 76 65 20 4f 46 46 53 45 54  an't have OFFSET
0530: 20 77 69 74 68 6f 75 74 20 4c 49 4d 49 54 2e 20   without LIMIT. 
0540: 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  */.  if( pNew==0
0550: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
0560: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45  xprListDelete(pE
0570: 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
0580: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
0590: 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74  pSrc);.    sqlit
05a0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 57 68  e3ExprDelete(pWh
05b0: 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ere);.    sqlite
05c0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
05d0: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73  pGroupBy);.    s
05e0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
05f0: 28 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 73  (pHaving);.    s
0600: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
0610: 6c 65 74 65 28 70 4f 72 64 65 72 42 79 29 3b 0a  lete(pOrderBy);.
0620: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
0630: 65 6c 65 74 65 28 70 4c 69 6d 69 74 29 3b 0a 20  elete(pLimit);. 
0640: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0650: 6c 65 74 65 28 70 4f 66 66 73 65 74 29 3b 0a 20  lete(pOffset);. 
0660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
0670: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
0680: 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69     pEList = sqli
0690: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
06a0: 64 28 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72  d(0, sqlite3Expr
06b0: 28 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30 29 2c 20  (TK_ALL,0,0,0), 
06c0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  0);.    }.    pN
06d0: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c  ew->pEList = pEL
06e0: 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  ist;.    pNew->p
06f0: 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
0700: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70  pNew->pWhere = p
0710: 57 68 65 72 65 3b 0a 20 20 20 20 70 4e 65 77 2d  Where;.    pNew-
0720: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
0730: 75 70 42 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  upBy;.    pNew->
0740: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
0750: 67 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72  g;.    pNew->pOr
0760: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
0770: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 73 44 69  ;.    pNew->isDi
0780: 73 74 69 6e 63 74 20 3d 20 69 73 44 69 73 74 69  stinct = isDisti
0790: 6e 63 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f  nct;.    pNew->o
07a0: 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
07b0: 20 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20     pNew->pLimit 
07c0: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 4e  = pLimit;.    pN
07d0: 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f  ew->pOffset = pO
07e0: 66 66 73 65 74 3b 0a 20 20 20 20 70 4e 65 77 2d  ffset;.    pNew-
07f0: 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  >iLimit = -1;.  
0800: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
0810: 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  = -1;.    pNew->
0820: 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 30 5d 20  addrOpenVirt[0] 
0830: 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  = -1;.    pNew->
0840: 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 31 5d 20  addrOpenVirt[1] 
0850: 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  = -1;.    pNew->
0860: 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 20  addrOpenVirt[2] 
0870: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
0880: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
0890: 2a 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69  * Given 1 to 3 i
08a0: 64 65 6e 74 69 66 69 65 72 73 20 70 72 65 63 65  dentifiers prece
08b0: 65 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b  eding the JOIN k
08c0: 65 79 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e  eyword, determin
08d0: 65 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66  e the.** type of
08e0: 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61   join.  Return a
08f0: 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
0900: 6e 74 20 74 68 61 74 20 65 78 70 72 65 73 73 65  nt that expresse
0910: 73 20 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69  s that type.** i
0920: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  n terms of the f
0930: 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c  ollowing bit val
0940: 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a  ues:.**.**     J
0950: 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a  T_INNER.**     J
0960: 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a  T_OUTER.**     J
0970: 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20  T_NATURAL.**    
0980: 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20   JT_LEFT.**     
0990: 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41  JT_RIGHT.**.** A
09a0: 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e   full outer join
09b0: 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74   is the combinat
09c0: 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61  ion of JT_LEFT a
09d0: 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a  nd JT_RIGHT..**.
09e0: 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c  ** If an illegal
09f0: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
0a00: 6a 6f 69 6e 20 74 79 70 65 20 69 73 20 73 65 65  join type is see
0a10: 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  n, then still re
0a20: 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74  turn.** a join t
0a30: 79 70 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20  ype, but put an 
0a40: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61  error in the pPa
0a50: 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
0a60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69  /.int sqlite3Joi
0a70: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
0a80: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20  rse, Token *pA, 
0a90: 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e  Token *pB, Token
0aa0: 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69   *pC){.  int joi
0ab0: 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b  ntype = 0;.  Tok
0ac0: 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20  en *apAll[3];.  
0ad0: 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73 74 61 74  Token *p;.  stat
0ae0: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
0af0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
0b00: 20 7a 4b 65 79 77 6f 72 64 5b 38 5d 3b 0a 20 20   zKeyword[8];.  
0b10: 20 20 75 38 20 6e 43 68 61 72 3b 0a 20 20 20 20    u8 nChar;.    
0b20: 75 38 20 63 6f 64 65 3b 0a 20 20 7d 20 6b 65 79  u8 code;.  } key
0b30: 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  words[] = {.    
0b40: 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20 37 2c 20  { "natural", 7, 
0b50: 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c 0a 20 20  JT_NATURAL },.  
0b60: 20 20 7b 20 22 6c 65 66 74 22 2c 20 20 20 20 34    { "left",    4
0b70: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
0b80: 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 72 69 67  ER },.    { "rig
0b90: 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f 52 49 47  ht",   5, JT_RIG
0ba0: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  HT|JT_OUTER },. 
0bb0: 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20 20 20 20     { "full",    
0bc0: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49  4, JT_LEFT|JT_RI
0bd0: 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a  GHT|JT_OUTER },.
0be0: 20 20 20 20 7b 20 22 6f 75 74 65 72 22 2c 20 20      { "outer",  
0bf0: 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a   5, JT_OUTER },.
0c00: 20 20 20 20 7b 20 22 69 6e 6e 65 72 22 2c 20 20      { "inner",  
0c10: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a   5, JT_INNER },.
0c20: 20 20 20 20 7b 20 22 63 72 6f 73 73 22 2c 20 20      { "cross",  
0c30: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a   5, JT_INNER },.
0c40: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b    };.  int i, j;
0c50: 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41  .  apAll[0] = pA
0c60: 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70  ;.  apAll[1] = p
0c70: 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20  B;.  apAll[2] = 
0c80: 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  pC;.  for(i=0; i
0c90: 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20  <3 && apAll[i]; 
0ca0: 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70  i++){.    p = ap
0cb0: 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28  All[i];.    for(
0cc0: 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b 65  j=0; j<sizeof(ke
0cd0: 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b  ywords)/sizeof(k
0ce0: 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b 2b  eywords[0]); j++
0cf0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
0d00: 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 6e  n==keywords[j].n
0d10: 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20 20  Char .          
0d20: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
0d30: 6d 70 28 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72 64  mp(p->z, keyword
0d40: 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20 70  s[j].zKeyword, p
0d50: 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->n)==0 ){.     
0d60: 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 6b     jointype |= k
0d70: 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65 3b  eywords[j].code;
0d80: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
0d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
0da0: 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f 66 28    if( j>=sizeof(
0db0: 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66  keywords)/sizeof
0dc0: 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20 29 7b  (keywords[0]) ){
0dd0: 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
0de0: 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20  |= JT_ERROR;.   
0df0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
0e00: 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28    }.  if(.     (
0e10: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49  jointype & (JT_I
0e20: 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d  NNER|JT_OUTER))=
0e30: 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55  =(JT_INNER|JT_OU
0e40: 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f  TER) ||.     (jo
0e50: 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f  intype & JT_ERRO
0e60: 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63  R)!=0.  ){.    c
0e70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 31 20  onst char *zSp1 
0e80: 3d 20 22 20 22 3b 0a 20 20 20 20 63 6f 6e 73 74  = " ";.    const
0e90: 20 63 68 61 72 20 2a 7a 53 70 32 20 3d 20 22 20   char *zSp2 = " 
0ea0: 22 3b 0a 20 20 20 20 69 66 28 20 70 42 3d 3d 30  ";.    if( pB==0
0eb0: 20 29 7b 20 7a 53 70 31 2b 2b 3b 20 7d 0a 20 20   ){ zSp1++; }.  
0ec0: 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a    if( pC==0 ){ z
0ed0: 53 70 32 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c  Sp2++; }.    sql
0ee0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
0ef0: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72  rse, "unknown or
0f00: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
0f10: 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20  n type: ".      
0f20: 20 22 25 54 25 73 25 54 25 73 25 54 22 2c 20 70   "%T%s%T%s%T", p
0f30: 41 2c 20 7a 53 70 31 2c 20 70 42 2c 20 7a 53 70  A, zSp1, pB, zSp
0f40: 32 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e  2, pC);.    join
0f50: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
0f60: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f 69  .  }else if( joi
0f70: 6e 74 79 70 65 20 26 20 4a 54 5f 52 49 47 48 54  ntype & JT_RIGHT
0f80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
0f90: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
0fa0: 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e  .      "RIGHT an
0fb0: 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49  d FULL OUTER JOI
0fc0: 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65  Ns are not curre
0fd0: 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29  ntly supported")
0fe0: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
0ff0: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20   JT_INNER;.  }. 
1000: 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65   return jointype
1010: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1020: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  n the index of a
1030: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62   column in a tab
1040: 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  le.  Return -1 i
1050: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  f the column.** 
1060: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
1070: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
1080: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  /.static int col
1090: 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a  umnIndex(Table *
10a0: 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  pTab, const char
10b0: 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69   *zCol){.  int i
10c0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
10d0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
10e0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
10f0: 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43  StrICmp(pTab->aC
1100: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  ol[i].zName, zCo
1110: 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  l)==0 ) return i
1120: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
1130: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  1;.}../*.** Set 
1140: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 74  the value of a t
1150: 6f 6b 65 6e 20 74 6f 20 61 20 27 5c 30 30 30 27  oken to a '\000'
1160: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
1170: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
1180: 69 64 20 73 65 74 54 6f 6b 65 6e 28 54 6f 6b 65  id setToken(Toke
1190: 6e 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  n *p, const char
11a0: 20 2a 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20 7a   *z){.  p->z = z
11b0: 3b 0a 20 20 70 2d 3e 6e 20 3d 20 73 74 72 6c 65  ;.  p->n = strle
11c0: 6e 28 7a 29 3b 0a 20 20 70 2d 3e 64 79 6e 20 3d  n(z);.  p->dyn =
11d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
11e0: 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ate an expressio
11f0: 6e 20 6e 6f 64 65 20 66 6f 72 20 61 6e 20 69 64  n node for an id
1200: 65 6e 74 69 66 69 65 72 20 77 69 74 68 20 74 68  entifier with th
1210: 65 20 6e 61 6d 65 20 6f 66 20 7a 4e 61 6d 65 0a  e name of zName.
1220: 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a  */.static Expr *
1230: 63 72 65 61 74 65 49 64 45 78 70 72 28 63 6f 6e  createIdExpr(con
1240: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
1250: 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a  .  Token dummy;.
1260: 20 20 73 65 74 54 6f 6b 65 6e 28 26 64 75 6d 6d    setToken(&dumm
1270: 79 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  y, zName);.  ret
1280: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 28  urn sqlite3Expr(
1290: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75  TK_ID, 0, 0, &du
12a0: 6d 6d 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  mmy);.}.../*.** 
12b0: 41 64 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68  Add a term to th
12c0: 65 20 57 48 45 52 45 20 65 78 70 72 65 73 73 69  e WHERE expressi
12d0: 6f 6e 20 69 6e 20 2a 70 70 45 78 70 72 20 74 68  on in *ppExpr th
12e0: 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65 0a  at requires the.
12f0: 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74  ** zCol column t
1300: 6f 20 62 65 20 65 71 75 61 6c 20 69 6e 20 74 68  o be equal in th
1310: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 70 54 61  e two tables pTa
1320: 62 31 20 61 6e 64 20 70 54 61 62 32 2e 0a 2a 2f  b1 and pTab2..*/
1330: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64  .static void add
1340: 57 68 65 72 65 54 65 72 6d 28 0a 20 20 63 6f 6e  WhereTerm(.  con
1350: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20  st char *zCol,  
1360: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1370: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20   the column */. 
1380: 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54   const Table *pT
1390: 61 62 31 2c 20 20 20 20 20 20 2f 2a 20 46 69 72  ab1,      /* Fir
13a0: 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f  st table */.  co
13b0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c 69 61 73  nst char *zAlias
13c0: 31 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20  1,     /* Alias 
13d0: 66 6f 72 20 66 69 72 73 74 20 74 61 62 6c 65 2e  for first table.
13e0: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
13f0: 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a  .  const Table *
1400: 70 54 61 62 32 2c 20 20 20 20 20 20 2f 2a 20 53  pTab2,      /* S
1410: 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20  econd table */. 
1420: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c   const char *zAl
1430: 69 61 73 32 2c 20 20 20 20 20 2f 2a 20 41 6c 69  ias2,     /* Ali
1440: 61 73 20 66 6f 72 20 73 65 63 6f 6e 64 20 74 61  as for second ta
1450: 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  ble.  May be NUL
1460: 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70  L */.  Expr **pp
1470: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
1480: 2f 2a 20 41 64 64 20 74 68 65 20 65 71 75 61 6c  /* Add the equal
1490: 69 74 79 20 74 65 72 6d 20 74 6f 20 74 68 69 73  ity term to this
14a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29   expression */.)
14b0: 7b 0a 20 20 45 78 70 72 20 2a 70 45 31 61 2c 20  {.  Expr *pE1a, 
14c0: 2a 70 45 31 62 2c 20 2a 70 45 31 63 3b 0a 20 20  *pE1b, *pE1c;.  
14d0: 45 78 70 72 20 2a 70 45 32 61 2c 20 2a 70 45 32  Expr *pE2a, *pE2
14e0: 62 2c 20 2a 70 45 32 63 3b 0a 20 20 45 78 70 72  b, *pE2c;.  Expr
14f0: 20 2a 70 45 3b 0a 0a 20 20 70 45 31 61 20 3d 20   *pE;..  pE1a = 
1500: 63 72 65 61 74 65 49 64 45 78 70 72 28 7a 43 6f  createIdExpr(zCo
1510: 6c 29 3b 0a 20 20 70 45 32 61 20 3d 20 63 72 65  l);.  pE2a = cre
1520: 61 74 65 49 64 45 78 70 72 28 7a 43 6f 6c 29 3b  ateIdExpr(zCol);
1530: 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 31 3d 3d  .  if( zAlias1==
1540: 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73 31  0 ){.    zAlias1
1550: 20 3d 20 70 54 61 62 31 2d 3e 7a 4e 61 6d 65 3b   = pTab1->zName;
1560: 0a 20 20 7d 0a 20 20 70 45 31 62 20 3d 20 63 72  .  }.  pE1b = cr
1570: 65 61 74 65 49 64 45 78 70 72 28 7a 41 6c 69 61  eateIdExpr(zAlia
1580: 73 31 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61  s1);.  if( zAlia
1590: 73 32 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c  s2==0 ){.    zAl
15a0: 69 61 73 32 20 3d 20 70 54 61 62 32 2d 3e 7a 4e  ias2 = pTab2->zN
15b0: 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 45 32 62 20  ame;.  }.  pE2b 
15c0: 3d 20 63 72 65 61 74 65 49 64 45 78 70 72 28 7a  = createIdExpr(z
15d0: 41 6c 69 61 73 32 29 3b 0a 20 20 70 45 31 63 20  Alias2);.  pE1c 
15e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
15f0: 5f 44 4f 54 2c 20 70 45 31 62 2c 20 70 45 31 61  _DOT, pE1b, pE1a
1600: 2c 20 30 29 3b 0a 20 20 70 45 32 63 20 3d 20 73  , 0);.  pE2c = s
1610: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f  qlite3Expr(TK_DO
1620: 54 2c 20 70 45 32 62 2c 20 70 45 32 61 2c 20 30  T, pE2b, pE2a, 0
1630: 29 3b 0a 20 20 70 45 20 3d 20 73 71 6c 69 74 65  );.  pE = sqlite
1640: 33 45 78 70 72 28 54 4b 5f 45 51 2c 20 70 45 31  3Expr(TK_EQ, pE1
1650: 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a 20 20 45  c, pE2c, 0);.  E
1660: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
1670: 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  E, EP_FromJoin);
1680: 0a 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c  .  *ppExpr = sql
1690: 69 74 65 33 45 78 70 72 41 6e 64 28 2a 70 70 45  ite3ExprAnd(*ppE
16a0: 78 70 72 2c 20 70 45 29 3b 0a 7d 0a 0a 2f 2a 0a  xpr, pE);.}../*.
16b0: 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72  ** Set the EP_Fr
16c0: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
16d0: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  on all terms of 
16e0: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
16f0: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sion..**.** The 
1700: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70  EP_FromJoin prop
1710: 65 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20  erty is used on 
1720: 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72  terms of an expr
1730: 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a  ession to tell.*
1740: 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52  * the LEFT OUTER
1750: 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67   JOIN processing
1760: 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69 73   logic that this
1770: 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66   term is part of
1780: 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73   the.** join res
1790: 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69  triction specifi
17a0: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
17b0: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64  USING clause and
17c0: 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f   not a part.** o
17d0: 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72  f the more gener
17e0: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  al WHERE clause.
17f0: 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 61 72    These terms ar
1800: 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20  e moved over to 
1810: 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
1820: 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20  use during join 
1830: 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77  processing but w
1840: 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  e need to rememb
1850: 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  er that they.** 
1860: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
1870: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
1880: 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
1890: 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72  void setJoinExpr
18a0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 77 68 69  (Expr *p){.  whi
18b0: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70  le( p ){.    Exp
18c0: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20  rSetProperty(p, 
18d0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20  EP_FromJoin);.  
18e0: 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d    setJoinExpr(p-
18f0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 20 3d  >pLeft);.    p =
1900: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
1910: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1920: 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73  outine processes
1930: 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d   the join inform
1940: 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45  ation for a SELE
1950: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
1960: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
1970: 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72  auses are conver
1980: 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74  ted into extra t
1990: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
19a0: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54  E clause..** NAT
19b0: 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20  URAL joins also 
19c0: 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45  create extra WHE
19d0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  RE clause terms.
19e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73  .**.** The terms
19f0: 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
1a00: 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  e are contained 
1a10: 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  in the Select.pS
1a20: 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  rc structure..**
1a30: 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74   The left most t
1a40: 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73  able is the firs
1a50: 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63  t entry in Selec
1a60: 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67  t.pSrc.  The rig
1a70: 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65  ht-most.** table
1a80: 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74   is the last ent
1a90: 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70  ry.  The join op
1aa0: 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69  erator is held i
1ab0: 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a  n the entry to.*
1ac0: 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75  * the left.  Thu
1ad0: 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69  s entry 0 contai
1ae0: 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ns the join oper
1af0: 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69  ator for the joi
1b00: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74  n between.** ent
1b10: 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41  ries 0 and 1.  A
1b20: 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ny ON or USING c
1b30: 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65  lauses associate
1b40: 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20  d with the join 
1b50: 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61  are.** also atta
1b60: 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
1b70: 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
1b80: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1b90: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
1ba0: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
1bb0: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
1bc0: 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  nt sqliteProcess
1bd0: 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  Join(Parse *pPar
1be0: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
1bf0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c10: 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20    /* All tables 
1c20: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1c30: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  se */.  int i, j
1c40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c50: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1c60: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74  counters */.  st
1c70: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1c80: 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a  m *pLeft;     /*
1c90: 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e   Left table bein
1ca0: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74  g joined */.  st
1cb0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1cc0: 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a  m *pRight;    /*
1cd0: 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69   Right table bei
1ce0: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20  ng joined */..  
1cf0: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
1d00: 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d    pLeft = &pSrc-
1d10: 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20  >a[0];.  pRight 
1d20: 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66  = &pLeft[1];.  f
1d30: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
1d40: 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69  nSrc-1; i++, pRi
1d50: 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b  ght++, pLeft++){
1d60: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66  .    Table *pLef
1d70: 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54  tTab = pLeft->pT
1d80: 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ab;.    Table *p
1d90: 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68  RightTab = pRigh
1da0: 74 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 69 66  t->pTab;..    if
1db0: 28 20 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c 7c  ( pLeftTab==0 ||
1dc0: 20 70 52 69 67 68 74 54 61 62 3d 3d 30 20 29 20   pRightTab==0 ) 
1dd0: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f  continue;..    /
1de0: 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52  * When the NATUR
1df0: 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  AL keyword is pr
1e00: 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45  esent, add WHERE
1e10: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f   clause terms fo
1e20: 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63  r.    ** every c
1e30: 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74  olumn that the t
1e40: 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  wo tables have i
1e50: 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f  n common..    */
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  .    if( pLeft->
1e70: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
1e80: 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69  TURAL ){.      i
1e90: 66 28 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 7c 7c  f( pLeft->pOn ||
1ea0: 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 20 29   pLeft->pUsing )
1eb0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1ec0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1ed0: 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  , "a NATURAL joi
1ee0: 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22  n may not have "
1ef0: 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20  .           "an 
1f00: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
1f10: 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  se", 0);.       
1f20: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1f30: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30   }.      for(j=0
1f40: 3b 20 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e 43  ; j<pLeftTab->nC
1f50: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
1f60: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
1f70: 70 4c 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a  pLeftTab->aCol[j
1f80: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
1f90: 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78   if( columnIndex
1fa0: 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d  (pRightTab, zNam
1fb0: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
1fc0: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
1fd0: 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c  zName, pLeftTab,
1fe0: 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20   pLeft->zAlias, 
1ff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2010: 52 69 67 68 74 54 61 62 2c 20 70 52 69 67 68 74  RightTab, pRight
2020: 2d 3e 7a 41 6c 69 61 73 2c 20 26 70 2d 3e 70 57  ->zAlias, &p->pW
2030: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  here);.        }
2040: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2050: 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20      /* Disallow 
2060: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
2070: 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65  G clauses in the
2080: 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a   same join.    *
2090: 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  /.    if( pLeft-
20a0: 3e 70 4f 6e 20 26 26 20 70 4c 65 66 74 2d 3e 70  >pOn && pLeft->p
20b0: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  Using ){.      s
20c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
20d0: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68  Parse, "cannot h
20e0: 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  ave both ON and 
20f0: 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20  USING ".        
2100: 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20  "clauses in the 
2110: 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20  same join");.   
2120: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2130: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74   }..    /* Add t
2140: 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20  he ON clause to 
2150: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
2160: 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e  HERE clause, con
2170: 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a  nected by.    **
2180: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
2190: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
21a0: 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 29 7b 0a 20   pLeft->pOn ){. 
21b0: 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72       setJoinExpr
21c0: 28 70 4c 65 66 74 2d 3e 70 4f 6e 29 3b 0a 20 20  (pLeft->pOn);.  
21d0: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
21e0: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
21f0: 2d 3e 70 57 68 65 72 65 2c 20 70 4c 65 66 74 2d  ->pWhere, pLeft-
2200: 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 4c 65  >pOn);.      pLe
2210: 66 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20  ft->pOn = 0;.   
2220: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
2230: 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
2240: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2250: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
2260: 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69  n named.    ** i
2270: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
2280: 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66  se.  Example: If
2290: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
22a0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65  to be joined are
22b0: 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42   .    ** A and B
22c0: 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63   and the USING c
22d0: 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59  lause names X, Y
22e0: 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64  , and Z, then ad
22f0: 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f  d this.    ** to
2300: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2310: 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e  e:    A.X=B.X AN
2320: 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e  D A.Y=B.Y AND A.
2330: 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70  Z=B.Z.    ** Rep
2340: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
2350: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69  any column menti
2360: 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e  oned in the USIN
2370: 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20  G clause is.    
2380: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  ** not contained
2390: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20   in both tables 
23a0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20  to be joined..  
23b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65    */.    if( pLe
23c0: 66 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ft->pUsing ){.  
23d0: 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73      IdList *pLis
23e0: 74 20 3d 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e  t = pLeft->pUsin
23f0: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  g;.      for(j=0
2400: 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; j<pList->nId; 
2410: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
2420: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 69 73  ar *zName = pLis
2430: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[j].zName;. 
2440: 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d         if( colum
2450: 6e 49 6e 64 65 78 28 70 4c 65 66 74 54 61 62 2c  nIndex(pLeftTab,
2460: 20 7a 4e 61 6d 65 29 3c 30 20 7c 7c 20 63 6f 6c   zName)<0 || col
2470: 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54  umnIndex(pRightT
2480: 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a  ab, zName)<0 ){.
2490: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
24b0: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
24c0: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
24d0: 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20   column ".      
24e0: 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65        "not prese
24f0: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
2500: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
2510: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2520: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2530: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 7a    addWhereTerm(z
2540: 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20  Name, pLeftTab, 
2550: 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a  pLeft->zAlias, .
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2570: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
2580: 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a  htTab, pRight->z
2590: 41 6c 69 61 73 2c 20 26 70 2d 3e 70 57 68 65 72  Alias, &p->pWher
25a0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
25b0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
25c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
25d0: 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65  e the given Sele
25e0: 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ct structure and
25f0: 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73   all of its subs
2600: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
2610: 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
2620: 44 65 6c 65 74 65 28 53 65 6c 65 63 74 20 2a 70  Delete(Select *p
2630: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
2640: 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
2650: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
2660: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71  p->pEList);.  sq
2670: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
2680: 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73  te(p->pSrc);.  s
2690: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
26a0: 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 73  (p->pWhere);.  s
26b0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
26c0: 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75 70 42 79  lete(p->pGroupBy
26d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
26e0: 44 65 6c 65 74 65 28 70 2d 3e 70 48 61 76 69 6e  Delete(p->pHavin
26f0: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  g);.  sqlite3Exp
2700: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70  rListDelete(p->p
2710: 4f 72 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69  OrderBy);.  sqli
2720: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
2730: 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 73 71  p->pPrior);.  sq
2740: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
2750: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 73 71  p->pLimit);.  sq
2760: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
2770: 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 73  p->pOffset);.  s
2780: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a  qliteFree(p);.}.
2790: 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63 6f  ./*.** Insert co
27a0: 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61 74  de into "v" that
27b0: 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72   will push the r
27c0: 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f 70  ecord on the top
27d0: 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b   of the.** stack
27e0: 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72   into the sorter
27f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2800: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
2810: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 56  Parse *pParse, V
2820: 64 62 65 20 2a 76 2c 20 45 78 70 72 4c 69 73 74  dbe *v, ExprList
2830: 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20 20 73   *pOrderBy){.  s
2840: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
2850: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2860: 4f 72 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69  OrderBy);.  sqli
2870: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2880: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72  OP_Sequence, pOr
2890: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
28a0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
28b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
28c0: 6c 6c 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ll, pOrderBy->nE
28d0: 78 70 72 20 2b 20 31 2c 20 30 29 3b 0a 20 20 73  xpr + 1, 0);.  s
28e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
28f0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
2900: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
2910: 72 20 2b 20 32 2c 20 30 29 3b 0a 20 20 73 71 6c  r + 2, 0);.  sql
2920: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
2930: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
2940: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
2950: 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r, 0);.}../*.** 
2960: 41 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c  Add code to impl
2970: 65 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54  ement the OFFSET
2980: 20 61 6e 64 20 4c 49 4d 49 54 0a 2a 2f 0a 73 74   and LIMIT.*/.st
2990: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4c 69  atic void codeLi
29a0: 6d 69 74 65 72 28 0a 20 20 56 64 62 65 20 2a 76  miter(.  Vdbe *v
29b0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ,          /* Ge
29c0: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
29d0: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65   this VM */.  Se
29e0: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
29f0: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
2a00: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
2a10: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ded */.  int iCo
2a20: 6e 74 69 6e 75 65 2c 20 20 20 20 2f 2a 20 4a 75  ntinue,    /* Ju
2a30: 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20  mp here to skip 
2a40: 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f  the current reco
2a50: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  rd */.  int iBre
2a60: 61 6b 2c 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d  ak,       /* Jum
2a70: 70 20 68 65 72 65 20 74 6f 20 65 6e 64 20 74 68  p here to end th
2a80: 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  e loop */.  int 
2a90: 6e 50 6f 70 20 20 20 20 20 20 20 20 20 20 2f 2a  nPop          /*
2aa0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   Number of times
2ab0: 20 74 6f 20 70 6f 70 20 73 74 61 63 6b 20 77 68   to pop stack wh
2ac0: 65 6e 20 6a 75 6d 70 69 6e 67 20 2a 2f 0a 29 7b  en jumping */.){
2ad0: 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65  .  if( p->iOffse
2ae0: 74 3e 3d 30 20 26 26 20 69 43 6f 6e 74 69 6e 75  t>=0 && iContinu
2af0: 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  e!=0 ){.    int 
2b00: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
2b10: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2b20: 20 2b 20 33 3b 0a 20 20 20 20 69 66 28 20 6e 50   + 3;.    if( nP
2b30: 6f 70 3e 30 20 29 20 61 64 64 72 2b 2b 3b 0a 20  op>0 ) addr++;. 
2b40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2b50: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63  dOp(v, OP_MemInc
2b60: 72 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 30  r, p->iOffset, 0
2b70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2b80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
2b90: 4d 65 6d 50 6f 73 2c 20 70 2d 3e 69 4f 66 66 73  MemPos, p->iOffs
2ba0: 65 74 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 69  et, addr);.    i
2bb0: 66 28 20 6e 50 6f 70 3e 30 20 29 7b 0a 20 20 20  f( nPop>0 ){.   
2bc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2bd0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e  dOp(v, OP_Pop, n
2be0: 50 6f 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  Pop, 0);.    }. 
2bf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2c00: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
2c10: 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  0, iContinue);. 
2c20: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2c30: 76 2c 20 22 23 20 73 6b 69 70 20 4f 46 46 53 45  v, "# skip OFFSE
2c40: 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20  T records"));.  
2c50: 7d 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  }.  if( p->iLimi
2c60: 74 3e 3d 30 20 26 26 20 69 42 72 65 61 6b 21 3d  t>=0 && iBreak!=
2c70: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2c80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2c90: 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4c 69 6d  MemIncr, p->iLim
2ca0: 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  it, iBreak);.   
2cb0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2cc0: 20 22 23 20 65 78 69 74 20 77 68 65 6e 20 4c 49   "# exit when LI
2cd0: 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a  MIT reached"));.
2ce0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
2cf0: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
2d00: 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
2d10: 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74   the inside of t
2d20: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
2d30: 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a   of a SELECT..**
2d40: 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61 6e  .** If srcTab an
2d50: 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f  d nColumn are bo
2d60: 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  th zero, then th
2d70: 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73 73  e pEList express
2d80: 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c  ions.** are eval
2d90: 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  uated in order t
2da0: 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66  o get the data f
2db0: 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66  or this row.  If
2dc0: 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68   nColumn>0.** th
2dd0: 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65  en data is pulle
2de0: 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e  d from srcTab an
2df0: 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64  d pEList is used
2e00: 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68 65   only to get the
2e10: 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f  .** datatypes fo
2e20: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a  r each column..*
2e30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
2e40: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20  ectInnerLoop(.  
2e50: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2e60: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
2e70: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
2e80: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
2e90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2ea0: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63  e complete selec
2eb0: 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  t statement bein
2ec0: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70  g coded */.  Exp
2ed0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
2ee0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
2ef0: 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74  values being ext
2f00: 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racted */.  int 
2f10: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
2f20: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
2f30: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
2f40: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
2f50: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n,            /*
2f60: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
2f70: 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65  ns in the source
2f80: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
2f90: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
2fa0: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55      /* If not NU
2fb0: 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73  LL, sort results
2fc0: 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20   using this key 
2fd0: 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63  */.  int distinc
2fe0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
2ff0: 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72  If >=0, make sur
3000: 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
3010: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20  stinct */.  int 
3020: 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20  eDest,          
3030: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69      /* How to di
3040: 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73  spose of the res
3050: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ults */.  int iP
3060: 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  arm,            
3070: 20 20 2f 2a 20 41 6e 20 61 72 67 75 6d 65 6e 74    /* An argument
3080: 20 74 6f 20 74 68 65 20 64 69 73 70 6f 73 61 6c   to the disposal
3090: 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74   method */.  int
30a0: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20   iContinue,     
30b0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
30c0: 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  e to continue wi
30d0: 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20  th next row */. 
30e0: 20 69 6e 74 20 69 42 72 65 61 6b 2c 20 20 20 20   int iBreak,    
30f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
3100: 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f   here to break o
3110: 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  ut of the inner 
3120: 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20 2a  loop */.  char *
3130: 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20  aff             
3140: 20 20 2f 2a 20 61 66 66 69 6e 69 74 79 20 73 74    /* affinity st
3150: 72 69 6e 67 20 69 66 20 65 44 65 73 74 20 69 73  ring if eDest is
3160: 20 53 52 54 5f 55 6e 69 6f 6e 20 2a 2f 0a 29 7b   SRT_Union */.){
3170: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
3180: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
3190: 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69  t i;.  int hasDi
31a0: 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f  stinct;        /
31b0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49  * True if the DI
31c0: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
31d0: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 0a 20 20  s present */..  
31e0: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
31f0: 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 0;.  assert( p
3200: 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f  EList!=0 );..  /
3210: 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
3220: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e   LIMIT clause on
3230: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
3240: 65 6d 65 6e 74 2c 20 74 68 65 6e 20 64 6f 20 74  ement, then do t
3250: 68 65 20 63 68 65 63 6b 0a 20 20 2a 2a 20 74 6f  he check.  ** to
3260: 20 73 65 65 20 69 66 20 74 68 69 73 20 72 6f 77   see if this row
3270: 20 73 68 6f 75 6c 64 20 62 65 20 6f 75 74 70 75   should be outpu
3280: 74 2e 0a 20 20 2a 2f 0a 20 20 68 61 73 44 69 73  t..  */.  hasDis
3290: 74 69 6e 63 74 20 3d 20 64 69 73 74 69 6e 63 74  tinct = distinct
32a0: 3e 3d 30 20 26 26 20 70 45 4c 69 73 74 20 26 26  >=0 && pEList &&
32b0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30   pEList->nExpr>0
32c0: 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
32d0: 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74 69  ==0 && !hasDisti
32e0: 6e 63 74 20 29 7b 0a 20 20 20 20 63 6f 64 65 4c  nct ){.    codeL
32f0: 69 6d 69 74 65 72 28 76 2c 20 70 2c 20 69 43 6f  imiter(v, p, iCo
3300: 6e 74 69 6e 75 65 2c 20 69 42 72 65 61 6b 2c 20  ntinue, iBreak, 
3310: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75  0);.  }..  /* Pu
3320: 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ll the requested
3330: 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20   columns..  */. 
3340: 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29   if( nColumn>0 )
3350: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
3360: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
3370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3380: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
3390: 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 29 3b  umn, srcTab, i);
33a0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
33b0: 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45      nColumn = pE
33c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
33d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
33e0: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
33f0: 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20   pEList);.  }.. 
3400: 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54 49   /* If the DISTI
3410: 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20  NCT keyword was 
3420: 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53  present on the S
3430: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
3440: 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f    ** and this ro
3450: 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20  w has been seen 
3460: 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20  before, then do 
3470: 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f  not make this ro
3480: 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74  w.  ** part of t
3490: 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a  he result..  */.
34a0: 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e 63    if( hasDistinc
34b0: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  t ){.    int n =
34c0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
34d0: 23 69 66 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f  #if NULL_ALWAYS_
34e0: 44 49 53 54 49 4e 43 54 0a 20 20 20 20 73 71 6c  DISTINCT.    sql
34f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3500: 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 70 45 4c   OP_IsNull, -pEL
3510: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 73 71 6c 69  ist->nExpr, sqli
3520: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
3530: 64 72 28 76 29 2b 37 29 3b 0a 23 65 6e 64 69 66  dr(v)+7);.#endif
3540: 0a 20 20 20 20 2f 2a 20 44 65 6c 69 62 65 72 61  .    /* Delibera
3550: 74 65 6c 79 20 6c 65 61 76 65 20 74 68 65 20 61  tely leave the a
3560: 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f  ffinity string o
3570: 66 66 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ff of the follow
3580: 69 6e 67 0a 20 20 20 20 2a 2a 20 4f 50 5f 4d 61  ing.    ** OP_Ma
3590: 6b 65 52 65 63 6f 72 64 20 2a 2f 0a 20 20 20 20  keRecord */.    
35a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
35b0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
35c0: 64 2c 20 2d 6e 2c 20 30 29 3b 0a 20 20 20 20 73  d, -n, 0);.    s
35d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
35e0: 76 2c 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c 20  v, OP_Distinct, 
35f0: 64 69 73 74 69 6e 63 74 2c 20 73 71 6c 69 74 65  distinct, sqlite
3600: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
3610: 28 76 29 2b 33 29 3b 0a 20 20 20 20 73 71 6c 69  (v)+3);.    sqli
3620: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3630: 4f 50 5f 50 6f 70 2c 20 6e 2b 31 2c 20 30 29 3b  OP_Pop, n+1, 0);
3640: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3650: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
3660: 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , 0, iContinue);
3670: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
3680: 28 28 76 2c 20 22 23 20 73 6b 69 70 20 69 6e 64  ((v, "# skip ind
3690: 69 73 74 69 6e 63 74 20 72 65 63 6f 72 64 73 22  istinct records"
36a0: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
36b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
36c0: 64 78 49 6e 73 65 72 74 2c 20 64 69 73 74 69 6e  dxInsert, distin
36d0: 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ct, 0);.    if( 
36e0: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
36f0: 20 20 20 20 20 63 6f 64 65 4c 69 6d 69 74 65 72       codeLimiter
3700: 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65  (v, p, iContinue
3710: 2c 20 69 42 72 65 61 6b 2c 20 6e 43 6f 6c 75 6d  , iBreak, nColum
3720: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  n);.    }.  }.. 
3730: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
3740: 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
3750: 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63   mode, write eac
3760: 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74  h query result t
3770: 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  o the key of the
3780: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a   temporary.    *
3790: 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  * table iParm.. 
37a0: 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
37b0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
37c0: 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61  ND_SELECT.    ca
37d0: 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a  se SRT_Union: {.
37e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
3800: 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e  eRecord, nColumn
3810: 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49  , NULL_ALWAYS_DI
3820: 53 54 49 4e 43 54 29 3b 0a 20 20 20 20 20 20 69  STINCT);.      i
3830: 66 28 20 61 66 66 20 29 7b 0a 20 20 20 20 20 20  f( aff ){.      
3840: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
3850: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 61 66 66  ngeP3(v, -1, aff
3860: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
3870: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
3880: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3890: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
38a0: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  arm, 0);.      b
38b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
38c0: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20   /* Construct a 
38d0: 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
38e0: 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75  query result, bu
38f0: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20  t instead of.   
3900: 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20   ** saving that 
3910: 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61  record, use it a
3920: 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74  s a key to delet
3930: 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a  e elements from.
3940: 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f      ** the tempo
3950: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
3960: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
3970: 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a  e SRT_Except: {.
3980: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
3990: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
39a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
39b0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
39c0: 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c  nColumn, NULL_AL
39d0: 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a  WAYS_DISTINCT);.
39e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
39f0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
3a00: 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49 43 29   aff, P3_STATIC)
3a10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
3a20: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
3a30: 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20  otFound, iParm, 
3a40: 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73  addr+3);.      s
3a50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3a60: 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50  v, OP_Delete, iP
3a70: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  arm, 0);.      b
3a80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
3a90: 69 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65  if..    /* Store
3aa0: 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
3ab0: 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
3ac0: 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
3ad0: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
3ae0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
3af0: 56 69 72 74 75 61 6c 54 61 62 3a 20 7b 0a 20 20  VirtualTab: {.  
3b00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3b10: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
3b20: 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  ecord, nColumn, 
3b30: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  0);.      if( pO
3b40: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
3b50: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
3b60: 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64  (pParse, v, pOrd
3b70: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  erBy);.      }el
3b80: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
3b90: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3ba0: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
3bb0: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rm, 0);.        
3bc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3bd0: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
3be0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
3bf0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3c00: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
3c10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
3c20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3c40: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
3c50: 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
3c60: 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66  creating a set f
3c70: 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28  or an "expr IN (
3c80: 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e  SELECT ...)" con
3c90: 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74  struct,.    ** t
3ca0: 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64  hen there should
3cb0: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65   be a single ite
3cc0: 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  m on the stack. 
3cd0: 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20   Write this.    
3ce0: 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65  ** item into the
3cf0: 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20   set table with 
3d00: 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20  bogus data..    
3d10: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
3d20: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Set: {.      int
3d30: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
3d40: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
3d50: 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  v);.      int ad
3d60: 64 72 32 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  dr2;..      asse
3d70: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
3d80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
3d90: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
3da0: 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72  otNull, -1, addr
3db0: 31 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  1+3);.      sqli
3dc0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3dd0: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
3de0: 20 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c       addr2 = sql
3df0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3e00: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b   OP_Goto, 0, 0);
3e10: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
3e20: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  rBy ){.        /
3e30: 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63  * At first glanc
3e40: 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e  e you would thin
3e50: 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d  k we could optim
3e60: 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20  ize out the.    
3e70: 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
3e80: 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e  in this case sin
3e90: 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  ce the order of 
3ea0: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73  entries in the s
3eb0: 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f  et.        ** do
3ec0: 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20  es not matter.  
3ed0: 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20  But there might 
3ee0: 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  be a LIMIT claus
3ef0: 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20  e, in which.    
3f00: 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20      ** case the 
3f10: 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65  order does matte
3f20: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73  r */.        pus
3f30: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
3f40: 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29  se, v, pOrderBy)
3f50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3f60: 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66 20         char aff 
3f70: 3d 20 28 69 50 61 72 6d 3e 3e 31 36 29 26 30 78  = (iParm>>16)&0x
3f80: 46 46 3b 0a 20 20 20 20 20 20 20 20 61 66 66 20  FF;.        aff 
3f90: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
3fa0: 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d  Affinity(pEList-
3fb0: 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66  >a[0].pExpr, aff
3fc0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
3fd0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
3fe0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30  MakeRecord, 1, 0
3ff0: 2c 20 26 61 66 66 2c 20 31 29 3b 0a 20 20 20 20  , &aff, 1);.    
4000: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4010: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e  ddOp(v, OP_IdxIn
4020: 73 65 72 74 2c 20 28 69 50 61 72 6d 26 30 78 30  sert, (iParm&0x0
4030: 30 30 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20  000FFFF), 0);.  
4040: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
4050: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
4060: 76 2c 20 61 64 64 72 32 2c 20 73 71 6c 69 74 65  v, addr2, sqlite
4070: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
4080: 28 76 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  (v));.      brea
4090: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
40a0: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
40b0: 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
40c0: 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
40d0: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
40e0: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
40f0: 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
4100: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
4110: 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
4120: 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
4130: 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
4140: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
4150: 52 54 5f 45 78 69 73 74 73 3a 0a 20 20 20 20 63  RT_Exists:.    c
4160: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
4170: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
4180: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
4190: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
41a0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
41b0: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
41c0: 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  v, pOrderBy);.  
41d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
41e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
41f0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
4200: 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  re, iParm, 1);. 
4210: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4220: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
4230: 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a  to, 0, iBreak);.
4240: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
4250: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
4260: 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
4270: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
4280: 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e  Y */..    /* Sen
4290: 64 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68  d the data to th
42a0: 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  e callback funct
42b0: 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75 62 72  ion or to a subr
42c0: 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a  outine.  In the.
42d0: 20 20 20 20 2a 2a 20 63 61 73 65 20 6f 66 20 61      ** case of a
42e0: 20 73 75 62 72 6f 75 74 69 6e 65 2c 20 74 68 65   subroutine, the
42f0: 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65   subroutine itse
4300: 6c 66 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  lf is responsibl
4310: 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70  e for.    ** pop
4320: 70 69 6e 67 20 74 68 65 20 64 61 74 61 20 66 72  ping the data fr
4330: 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  om the stack..  
4340: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
4350: 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 0a 20 20  T_Subroutine:.  
4360: 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62    case SRT_Callb
4370: 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ack: {.      if(
4380: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
4390: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
43a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
43b0: 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c  Record, nColumn,
43c0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73   0);.        pus
43d0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
43e0: 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29  se, v, pOrderBy)
43f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
4400: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75 62  ( eDest==SRT_Sub
4410: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20  routine ){.     
4420: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4430: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  dOp(v, OP_Gosub,
4440: 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20   0, iParm);.    
4450: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4460: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4470: 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b  p(v, OP_Callback
4480: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
4490: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
44a0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21  ak;.    }..#if !
44b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
44c0: 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20  MIT_TRIGGER).   
44d0: 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20   /* Discard the 
44e0: 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69  results.  This i
44f0: 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43  s used for SELEC
4500: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73  T statements ins
4510: 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  ide.    ** the b
4520: 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52  ody of a TRIGGER
4530: 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f  .  The purpose o
4540: 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69  f such selects i
4550: 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  s to call.    **
4560: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
4570: 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76  nctions that hav
4580: 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20  e side effects. 
4590: 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a   We do not care.
45a0: 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65      ** about the
45b0: 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20   actual results 
45c0: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20  of the select.. 
45d0: 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
45e0: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
45f0: 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t( eDest==SRT_Di
4600: 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 73  scard );.      s
4610: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4620: 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75  v, OP_Pop, nColu
4630: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  mn, 0);.      br
4640: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
4650: 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  f.  }.  return 0
4660: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
4670: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
4680: 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ist, generate a 
4690: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
46a0: 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a  e that records.*
46b0: 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * the collating 
46c0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63  sequence for eac
46d0: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
46e0: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20  that expression 
46f0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  list..**.** If t
4700: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61  he ExprList is a
4710: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
4720: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68  OUP BY clause th
4730: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  en the resulting
4740: 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  .** KeyInfo stru
4750: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
4760: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
4770: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20  izing a virtual 
4780: 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c  index to.** impl
4790: 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73  ement that claus
47a0: 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c  e.  If the ExprL
47b0: 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c  ist is the resul
47c0: 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
47d0: 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65  T.** then the Ke
47e0: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
47f0: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
4800: 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  or initializing 
4810: 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64  a virtual.** ind
4820: 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ex to implement 
4830: 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e  a DISTINCT test.
4840: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
4850: 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f  hold the KeyInfo
4860: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62   structure is ob
4870: 74 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  tain from malloc
4880: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  .  The calling.*
4890: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  * function is re
48a0: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65  sponsible for se
48b0: 65 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73  eing that this s
48c0: 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e  tructure is even
48d0: 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e  tually.** freed.
48e0: 20 20 41 64 64 20 74 68 65 20 4b 65 79 49 6e 66    Add the KeyInf
48f0: 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  o structure to t
4900: 68 65 20 50 33 20 66 69 65 6c 64 20 6f 66 20 61  he P3 field of a
4910: 6e 20 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a  n opcode using.*
4920: 2a 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  * P3_KEYINFO_HAN
4930: 44 4f 46 46 20 69 73 20 74 68 65 20 75 73 75 61  DOFF is the usua
4940: 6c 20 77 61 79 20 6f 66 20 64 65 61 6c 69 6e 67  l way of dealing
4950: 20 77 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73   with this..*/.s
4960: 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b  tatic KeyInfo *k
4970: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
4980: 73 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  st(Parse *pParse
4990: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
49a0: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  t){.  sqlite3 *d
49b0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
49c0: 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b    int nExpr;.  K
49d0: 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20  eyInfo *pInfo;. 
49e0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
49f0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
4a00: 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20  int i;..  nExpr 
4a10: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
4a20: 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65    pInfo = sqlite
4a30: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
4a40: 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28  pInfo) + nExpr*(
4a50: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
4a60: 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  +1) );.  if( pIn
4a70: 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  fo ){.    pInfo-
4a80: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 63  >aSortOrder = (c
4a90: 68 61 72 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f  har*)&pInfo->aCo
4aa0: 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70  ll[nExpr];.    p
4ab0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  Info->nField = n
4ac0: 45 78 70 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  Expr;.    pInfo-
4ad0: 3e 65 6e 63 20 3d 20 64 62 2d 3e 65 6e 63 3b 0a  >enc = db->enc;.
4ae0: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
4af0: 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e  em=pList->a; i<n
4b00: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
4b10: 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  ++){.      CollS
4b20: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
4b30: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
4b40: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
4b50: 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
4b60: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 43  );.      if( !pC
4b70: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  oll ){.        p
4b80: 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
4b90: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
4ba0: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c      pInfo->aColl
4bb0: 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  [i] = pColl;.   
4bc0: 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f     pInfo->aSortO
4bd0: 72 64 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d  rder[i] = pItem-
4be0: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
4bf0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
4c00: 49 6e 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Info;.}.../*.** 
4c10: 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  If the inner loo
4c20: 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  p was generated 
4c30: 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c  using a non-null
4c40: 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65   pOrderBy argume
4c50: 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  nt,.** then the 
4c60: 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61  results were pla
4c70: 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e  ced in a sorter.
4c80: 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70    After the loop
4c90: 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a   is terminated.*
4ca0: 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e  * we need to run
4cb0: 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20   the sorter and 
4cc0: 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c  output the resul
4cd0: 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ts.  The followi
4ce0: 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  ng.** routine ge
4cf0: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
4d00: 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68   needed to do th
4d10: 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  at..*/.static vo
4d20: 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54  id generateSortT
4d30: 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ail(.  Parse *pP
4d40: 61 72 73 65 2c 20 20 20 2f 2a 20 54 68 65 20 70  arse,   /* The p
4d50: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
4d60: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
4d70: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
4d80: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
4d90: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
4da0: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
4db0: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44  ode into this VD
4dc0: 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  BE */.  int nCol
4dd0: 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  umn,     /* Numb
4de0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66  er of columns of
4df0: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 65   data */.  int e
4e00: 44 65 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 57  Dest,       /* W
4e10: 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20  rite the sorted 
4e20: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
4e30: 20 20 69 6e 74 20 69 50 61 72 6d 20 20 20 20 20    int iParm     
4e40: 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 70     /* Optional p
4e50: 61 72 61 6d 65 74 65 72 20 61 73 73 6f 63 69 61  arameter associa
4e60: 74 65 64 20 77 69 74 68 20 65 44 65 73 74 20 2a  ted with eDest *
4e70: 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 72 6b 20 3d  /.){.  int brk =
4e80: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
4e90: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20  Label(v);.  int 
4ea0: 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  cont = sqlite3Vd
4eb0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
4ec0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e    int addr;.  in
4ed0: 74 20 69 54 61 62 3b 0a 20 20 45 78 70 72 4c 69  t iTab;.  ExprLi
4ee0: 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
4ef0: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 69  ->pOrderBy;..  i
4f00: 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  Tab = pOrderBy->
4f10: 69 45 43 75 72 73 6f 72 3b 0a 20 20 61 64 64 72  iECursor;.  addr
4f20: 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
4f30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f  beAddOp(v, OP_So
4f40: 72 74 2c 20 69 54 61 62 2c 20 62 72 6b 29 3b 0a  rt, iTab, brk);.
4f50: 20 20 63 6f 64 65 4c 69 6d 69 74 65 72 28 76 2c    codeLimiter(v,
4f60: 20 70 2c 20 63 6f 6e 74 2c 20 62 72 6b 2c 20 30   p, cont, brk, 0
4f70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
4f80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
4f90: 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65 72  mn, iTab, pOrder
4fa0: 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31 29 3b 0a  By->nExpr + 1);.
4fb0: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
4fc0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  ){.    case SRT_
4fd0: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
4fe0: 53 52 54 5f 56 69 72 74 75 61 6c 54 61 62 3a 20  SRT_VirtualTab: 
4ff0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5000: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
5010: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
5020: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
5030: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5040: 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20  _Pull, 1, 0);.  
5050: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5060: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72  ddOp(v, OP_Inser
5070: 74 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  t, iParm, 0);.  
5080: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5090: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
50a0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
50b0: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
50c0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
50d0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
50e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
50f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  ddOp(v, OP_NotNu
5100: 6c 6c 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 56  ll, -1, sqlite3V
5110: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
5120: 29 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  )+3);.      sqli
5130: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5140: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
5150: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5160: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
5170: 2c 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65  , 0, sqlite3Vdbe
5180: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33  CurrentAddr(v)+3
5190: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
51a0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  VdbeOp3(v, OP_Ma
51b0: 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20  keRecord, 1, 0, 
51c0: 22 6e 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  "n", P3_STATIC);
51d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
51e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
51f0: 78 49 6e 73 65 72 74 2c 20 28 69 50 61 72 6d 26  xInsert, (iParm&
5200: 30 78 30 30 30 30 46 46 46 46 29 2c 20 30 29 3b  0x0000FFFF), 0);
5210: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5220: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54    }.    case SRT
5230: 5f 45 78 69 73 74 73 3a 0a 20 20 20 20 63 61 73  _Exists:.    cas
5240: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
5250: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
5260: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
5270: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5280: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
5290: 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  iParm, 1);.     
52a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
52b0: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
52c0: 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 62 72 65   brk);.      bre
52d0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
52e0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 61  .    case SRT_Ca
52f0: 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63 61 73 65  llback:.    case
5300: 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a   SRT_Subroutine:
5310: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a   {.      int i;.
5320: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5330: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
5340: 65 67 65 72 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  eger, p->pEList-
5350: 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  >nExpr, 0);.    
5360: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5370: 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31  Op(v, OP_Pull, 1
5380: 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  , 0);.      for(
5390: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20  i=0; i<nColumn; 
53a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
53b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
53c0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 2d 31 2d  , OP_Column, -1-
53d0: 69 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  i, i);.      }. 
53e0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
53f0: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
5400: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5410: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
5420: 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e  allback, nColumn
5430: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
5440: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
5450: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5460: 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72  P_Gosub, 0, iPar
5470: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
5480: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5490: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c  Op(v, OP_Pop, 2,
54a0: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
54b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
54c0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ult: {.      /* 
54d0: 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20  Do nothing */.  
54e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
54f0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
5500: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
5510: 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74  , cont);.  sqlit
5520: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5530: 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
5540: 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dr);.  sqlite3Vd
5550: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
5560: 2c 20 62 72 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , brk);.}../*.**
5570: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
5580: 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f  r to a string co
5590: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65  ntaining the 'de
55a0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20  claration type' 
55b0: 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  of the.** expres
55c0: 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20  sion pExpr. The 
55d0: 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72  string may be tr
55e0: 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20  eated as static 
55f0: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  by the caller..*
5600: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 65 63 6c  *.** If the decl
5610: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20  aration type is 
5620: 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79  the exact dataty
5630: 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78  pe definition ex
5640: 74 72 61 63 74 65 64 20 66 72 6f 6d 0a 2a 2a 20  tracted from.** 
5650: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 43 52 45  the original CRE
5660: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
5670: 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ent if the expre
5680: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
5690: 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65  n..** .** The de
56a0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
56b0: 6f 72 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  or an expression
56c0: 20 69 73 20 65 69 74 68 65 72 20 54 45 58 54 2c   is either TEXT,
56d0: 20 4e 55 4d 45 52 49 43 20 6f 72 20 41 4e 59 2e   NUMERIC or ANY.
56e0: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
56f0: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52  ion type for a R
5700: 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e  OWID field is IN
5710: 54 45 47 45 52 2e 0a 2a 2f 0a 73 74 61 74 69 63  TEGER..*/.static
5720: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c   const char *col
5730: 75 6d 6e 54 79 70 65 28 4e 61 6d 65 43 6f 6e 74  umnType(NameCont
5740: 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a  ext *pNC, Expr *
5750: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 63  pExpr){.  char c
5760: 6f 6e 73 74 20 2a 7a 54 79 70 65 3b 0a 20 20 69  onst *zType;.  i
5770: 6e 74 20 6a 3b 0a 20 20 69 66 28 20 70 45 78 70  nt j;.  if( pExp
5780: 72 3d 3d 30 20 7c 7c 20 70 4e 43 2d 3e 70 53 72  r==0 || pNC->pSr
5790: 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  cList==0 ) retur
57a0: 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 54  n 0;..  /* The T
57b0: 4b 5f 41 53 20 6f 70 65 72 61 74 6f 72 20 63 61  K_AS operator ca
57c0: 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 6e 20  n only occur in 
57d0: 4f 52 44 45 52 20 42 59 2c 20 47 52 4f 55 50 20  ORDER BY, GROUP 
57e0: 42 59 2c 20 48 41 56 49 4e 47 2c 0a 20 20 2a 2a  BY, HAVING,.  **
57f0: 20 61 6e 64 20 4c 49 4d 49 54 20 63 6c 61 75 73   and LIMIT claus
5800: 65 73 2e 20 20 42 75 74 20 70 45 78 70 72 20 6f  es.  But pExpr o
5810: 72 69 67 69 6e 61 74 65 73 20 69 6e 20 74 68 65  riginates in the
5820: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
5830: 0a 20 20 2a 2a 20 53 45 4c 45 43 54 2e 20 20 53  .  ** SELECT.  S
5840: 6f 20 70 45 78 70 72 20 63 61 6e 20 6e 65 76 65  o pExpr can neve
5850: 72 20 63 6f 6e 74 61 69 6e 20 61 6e 20 41 53 20  r contain an AS 
5860: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20  operator..  */. 
5870: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
5880: 6f 70 21 3d 54 4b 5f 41 53 20 29 3b 0a 0a 20 20  op!=TK_AS );..  
5890: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
58a0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
58b0: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
58c0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
58d0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  ;.      int iCol
58e0: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
58f0: 6e 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  n;.      while( 
5900: 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a  pNC && !pTab ){.
5910: 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20          SrcList 
5920: 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d  *pTabList = pNC-
5930: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20  >pSrcList;.     
5940: 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61     for(j=0;j<pTa
5950: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
5960: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
5970: 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54  ursor!=pExpr->iT
5980: 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20  able;j++);.     
5990: 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73     if( j<pTabLis
59a0: 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20  t->nSrc ){.     
59b0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
59c0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
59d0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
59e0: 20 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20            pNC = 
59f0: 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pNC->pNext;.    
5a00: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
5a10: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
5a20: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 49  ){.        /* FI
5a30: 58 20 4d 45 3a 0a 20 20 20 20 20 20 20 20 2a 2a  X ME:.        **
5a40: 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75 72 73   This can occurs
5a50: 20 69 66 20 79 6f 75 20 68 61 76 65 20 73 6f 6d   if you have som
5a60: 65 74 68 69 6e 67 20 6c 69 6b 65 20 22 53 45 4c  ething like "SEL
5a70: 45 43 54 20 6e 65 77 2e 78 3b 22 20 69 6e 73 69  ECT new.x;" insi
5a80: 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  de.        ** a 
5a90: 74 72 69 67 67 65 72 2e 20 20 49 6e 20 6f 74 68  trigger.  In oth
5aa0: 65 72 20 77 6f 72 64 73 2c 20 69 66 20 79 6f 75  er words, if you
5ab0: 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
5ac0: 70 65 63 69 61 6c 20 22 6e 65 77 22 0a 20 20 20  pecial "new".   
5ad0: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 6e       ** table in
5ae0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
5af0: 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 57 65  of a select.  We
5b00: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 67   do not have a g
5b10: 6f 6f 64 20 77 61 79 0a 20 20 20 20 20 20 20 20  ood way.        
5b20: 2a 2a 20 74 6f 20 66 69 6e 64 20 74 68 65 20 61  ** to find the a
5b30: 63 74 75 61 6c 20 74 61 62 6c 65 20 74 79 70 65  ctual table type
5b40: 2c 20 73 6f 20 63 61 6c 6c 20 69 74 20 22 54 45  , so call it "TE
5b50: 58 54 22 2e 20 20 54 68 69 73 20 69 73 20 72 65  XT".  This is re
5b60: 61 6c 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  ally.        ** 
5b70: 73 6f 6d 65 74 68 69 6e 67 20 6f 66 20 61 20 62  something of a b
5b80: 75 67 2c 20 62 75 74 20 49 20 64 6f 20 6e 6f 74  ug, but I do not
5b90: 20 6b 6e 6f 77 20 68 6f 77 20 74 6f 20 66 69 78   know how to fix
5ba0: 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a   it..        **.
5bb0: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
5bc0: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 70 72  code does not pr
5bd0: 6f 64 75 63 65 20 74 68 65 20 63 6f 72 72 65 63  oduce the correc
5be0: 74 20 61 6e 73 77 65 72 20 2d 20 69 74 20 6a 75  t answer - it ju
5bf0: 73 74 20 70 72 65 76 65 6e 74 73 0a 20 20 20 20  st prevents.    
5c00: 20 20 20 20 2a 2a 20 61 20 73 65 67 66 61 75 6c      ** a segfaul
5c10: 74 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  t.  See ticket #
5c20: 31 32 32 39 2e 0a 20 20 20 20 20 20 20 20 2a 2f  1229..        */
5c30: 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d  .        zType =
5c40: 20 22 54 45 58 54 22 3b 0a 20 20 20 20 20 20 20   "TEXT";.       
5c50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
5c60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
5c70: 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ab );.      if( 
5c80: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
5c90: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
5ca0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
5cb0: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
5cc0: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
5cd0: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ol) );.      if(
5ce0: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
5cf0: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
5d00: 47 45 52 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  GER";.      }els
5d10: 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65  e{.        zType
5d20: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
5d30: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20  ol].zType;.     
5d40: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
5d50: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
5d60: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
5d70: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
5d80: 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 4e  ELECT: {.      N
5d90: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
5da0: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
5db0: 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63   = pExpr->pSelec
5dc0: 74 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72  t;.      sNC.pSr
5dd0: 63 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  cList = pExpr->p
5de0: 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
5df0: 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20      sNC.pNext = 
5e00: 70 4e 43 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  pNC;.      zType
5e10: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
5e20: 4e 43 2c 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  NC, pS->pEList->
5e30: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 20 0a 20 20  a[0].pExpr); .  
5e40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5e50: 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
5e60: 75 6c 74 3a 0a 20 20 20 20 20 20 7a 54 79 70 65  ult:.      zType
5e70: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 0a 20 20 72   = 0;.  }.  .  r
5e80: 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
5e90: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
5ea0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
5eb0: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
5ec0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
5ed0: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
5ee0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
5ef0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
5f00: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
5f10: 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Types(.  Parse *
5f20: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
5f30: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
5f40: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
5f50: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
5f60: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
5f70: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
5f80: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
5f90: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
5fa0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
5fb0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
5fc0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
5fd0: 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
5fe0: 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72  t sNC;.  sNC.pSr
5ff0: 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
6000: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
6010: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
6020: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
6030: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
6040: 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Expr;.    const 
6050: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 63 6f  char *zType = co
6060: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
6070: 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65  );.    if( zType
6080: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
6090: 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20      /* The vdbe 
60a0: 6d 75 73 74 20 6d 61 6b 65 20 69 74 27 73 20 6f  must make it's o
60b0: 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  wn copy of the c
60c0: 6f 6c 75 6d 6e 2d 74 79 70 65 2c 20 69 6e 20 63  olumn-type, in c
60d0: 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ase the .    ** 
60e0: 73 63 68 65 6d 61 20 69 73 20 72 65 73 65 74 20  schema is reset 
60f0: 62 65 66 6f 72 65 20 74 68 69 73 20 76 69 72 74  before this virt
6100: 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64  ual machine is d
6110: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
6120: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
6130: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2b 70 45  tColName(v, i+pE
6140: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 7a 54 79  List->nExpr, zTy
6150: 70 65 2c 20 73 74 72 6c 65 6e 28 7a 54 79 70 65  pe, strlen(zType
6160: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
6170: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
6180: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
6190: 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73  e VDBE the names
61a0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
61b0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
61c0: 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
61d0: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70  ion is used to p
61e0: 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a  rovide the.** az
61f0: 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20  Col[] values in 
6200: 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  the callback..*/
6210: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
6220: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
6230: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6240: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
6250: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
6260: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
6270: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
6280: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
6290: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
62a0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
62b0: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
62c0: 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62   set */.){.  Vdb
62d0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
62e0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Vdbe;.  int i, j
62f0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
6300: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
6310: 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73  int fullNames, s
6320: 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e  hortNames;..#ifn
6330: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6340: 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20  EXPLAIN.  /* If 
6350: 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41  this is an EXPLA
6360: 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74  IN, skip this st
6370: 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  ep */.  if( pPar
6380: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
6390: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
63a0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
63b0: 20 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70   v!=0 );.  if( p
63c0: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
63d0: 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73 71  et || v==0 || sq
63e0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
63f0: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
6400: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
6410: 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e  Set = 1;.  fullN
6420: 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ames = (db->flag
6430: 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
6440: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
6450: 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d  hortNames = (db-
6460: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
6470: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d  ShortColNames)!=
6480: 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  0;.  sqlite3Vdbe
6490: 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45  SetNumCols(v, pE
64a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
64b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
64c0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
64d0: 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
64e0: 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69   p = pEList->a[i
64f0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
6500: 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65   p==0 ) continue
6510: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
6520: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
6530: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
6540: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
6550: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
6560: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
6570: 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c  ame(v, i, zName,
6580: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b   strlen(zName));
6590: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
65a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
65b0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
65c0: 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20  && pTabList ){. 
65d0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
65e0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  ;.      char *zC
65f0: 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  ol;.      int iC
6600: 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b  ol = p->iColumn;
6610: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
6620: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
6630: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b   && pTabList->a[
6640: 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e 69  j].iCursor!=p->i
6650: 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20  Table; j++){}.  
6660: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54      assert( j<pT
6670: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
6680: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61        pTab = pTa
6690: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  bList->a[j].pTab
66a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
66b0: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
66c0: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61  ->iPKey;.      a
66d0: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
66e0: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
66f0: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
6700: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
6710: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  l<0 ){.        z
6720: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
6730: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6740: 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
6750: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
6760: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
6770: 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73   if( !shortNames
6780: 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 26   && !fullNames &
6790: 26 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70  & p->span.z && p
67a0: 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20  ->span.z[0] ){. 
67b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
67c0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
67d0: 69 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d  i, p->span.z, p-
67e0: 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  >span.n);.      
67f0: 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61  }else if( fullNa
6800: 6d 65 73 20 7c 7c 20 28 21 73 68 6f 72 74 4e 61  mes || (!shortNa
6810: 6d 65 73 20 26 26 20 70 54 61 62 4c 69 73 74 2d  mes && pTabList-
6820: 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20  >nSrc>1) ){.    
6830: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
6840: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61  = 0;.        cha
6850: 72 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20  r *zTab;. .     
6860: 20 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69     zTab = pTabLi
6870: 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b  st->a[j].zAlias;
6880: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 75 6c  .        if( ful
6890: 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d  lNames || zTab==
68a0: 30 20 29 20 7a 54 61 62 20 3d 20 70 54 61 62 2d  0 ) zTab = pTab-
68b0: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
68c0: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
68d0: 28 26 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22  (&zName, zTab, "
68e0: 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20  .", zCol, 0);.  
68f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6900: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
6910: 2c 20 7a 4e 61 6d 65 2c 20 50 33 5f 44 59 4e 41  , zName, P3_DYNA
6920: 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
6930: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
6940: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
6950: 28 76 2c 20 69 2c 20 7a 43 6f 6c 2c 20 73 74 72  (v, i, zCol, str
6960: 6c 65 6e 28 7a 43 6f 6c 29 29 3b 0a 20 20 20 20  len(zCol));.    
6970: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
6980: 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70  ( p->span.z && p
6990: 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20  ->span.z[0] ){. 
69a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
69b0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
69c0: 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73   p->span.z, p->s
69d0: 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 2f 2a  pan.n);.      /*
69e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 70   sqlite3VdbeComp
69f0: 72 65 73 73 53 70 61 63 65 28 76 2c 20 61 64 64  ressSpace(v, add
6a00: 72 29 3b 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  r); */.    }else
6a10: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4e 61  {.      char zNa
6a20: 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20 61 73  me[30];.      as
6a30: 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f  sert( p->op!=TK_
6a40: 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69  COLUMN || pTabLi
6a50: 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  st==0 );.      s
6a60: 70 72 69 6e 74 66 28 7a 4e 61 6d 65 2c 20 22 63  printf(zName, "c
6a70: 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a  olumn%d", i+1);.
6a80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6a90: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
6aa0: 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , zName, 0);.   
6ab0: 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74   }.  }.  generat
6ac0: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61  eColumnTypes(pPa
6ad0: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
6ae0: 45 4c 69 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64  EList);.}..#ifnd
6af0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
6b00: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
6b10: 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  *.** Name of the
6b20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72   connection oper
6b30: 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65  ator, used for e
6b40: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a  rror messages..*
6b50: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
6b60: 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d  har *selectOpNam
6b70: 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61  e(int id){.  cha
6b80: 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20  r *z;.  switch( 
6b90: 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  id ){.    case T
6ba0: 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d  K_ALL:       z =
6bb0: 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20   "UNION ALL";   
6bc0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6bd0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20  TK_INTERSECT: z 
6be0: 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20  = "INTERSECT";  
6bf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6c00: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a   TK_EXCEPT:    z
6c10: 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20   = "EXCEPT";    
6c20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
6c30: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
6c40: 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20  z = "UNION";    
6c50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
6c60: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64  return z;.}.#end
6c70: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
6c80: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
6c90: 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77  T */../*.** Forw
6ca0: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  ard declaration.
6cb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
6cc0: 65 70 53 65 6c 65 63 74 53 74 6d 74 28 50 61 72  epSelectStmt(Par
6cd0: 73 65 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 0a  se*, Select*);..
6ce0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45  /*.** Given a SE
6cf0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
6d00: 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65  generate a Table
6d10: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
6d20: 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65  describes.** the
6d30: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
6d40: 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54  hat SELECT..*/.T
6d50: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73  able *sqlite3Res
6d60: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50  ultSetOfSelect(P
6d70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68  arse *pParse, ch
6d80: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65  ar *zTabName, Se
6d90: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
6da0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
6db0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70   int i, j;.  Exp
6dc0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
6dd0: 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a   Column *aCol, *
6de0: 70 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 70 72 65  pCol;..  if( pre
6df0: 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72  pSelectStmt(pPar
6e00: 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a  se, pSelect) ){.
6e10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6e20: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  }.  if( sqlite3S
6e30: 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61  electResolve(pPa
6e40: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29  rse, pSelect, 0)
6e50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
6e60: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73  ;.  }.  pTab = s
6e70: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
6e80: 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
6e90: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
6ea0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6eb0: 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20  .  pTab->nRef = 
6ec0: 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  1;.  pTab->zName
6ed0: 20 3d 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71   = zTabName ? sq
6ee0: 6c 69 74 65 53 74 72 44 75 70 28 7a 54 61 62 4e  liteStrDup(zTabN
6ef0: 61 6d 65 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69  ame) : 0;.  pELi
6f00: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
6f10: 4c 69 73 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43  List;.  pTab->nC
6f20: 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ol = pEList->nEx
6f30: 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  pr;.  assert( pT
6f40: 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20  ab->nCol>0 );.  
6f50: 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f  pTab->aCol = aCo
6f60: 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
6f70: 28 20 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61  ( sizeof(pTab->a
6f80: 43 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43  Col[0])*pTab->nC
6f90: 6f 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  ol );.  for(i=0,
6fa0: 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 70 54   pCol=aCol; i<pT
6fb0: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  ab->nCol; i++, p
6fc0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  Col++){.    Expr
6fd0: 20 2a 70 2c 20 2a 70 52 3b 0a 20 20 20 20 63 68   *p, *pR;.    ch
6fe0: 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 63  ar *zType;.    c
6ff0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
7000: 63 68 61 72 20 2a 7a 42 61 73 65 6e 61 6d 65 3b  char *zBasename;
7010: 0a 20 20 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20  .    int cnt;.  
7020: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
7030: 43 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 47  C;.    .    /* G
7040: 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  et an appropriat
7050: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63  e name for the c
7060: 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  olumn.    */.   
7070: 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69   p = pEList->a[i
7080: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ].pExpr;.    ass
7090: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
70a0: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e  0 || p->pRight->
70b0: 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d  token.z==0 || p-
70c0: 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a  >pRight->token.z
70d0: 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  [0]!=0 );.    if
70e0: 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  ( (zName = pELis
70f0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d  t->a[i].zName)!=
7100: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
7110: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74   the column cont
7120: 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d  ains an "AS <nam
7130: 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20  e>" phrase, use 
7140: 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61  <name> as the na
7150: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d  me */.      zNam
7160: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
7170: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  (zName);.    }el
7180: 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  se if( p->op==TK
7190: 5f 44 4f 54 20 0a 20 20 20 20 20 20 20 20 20 20  _DOT .          
71a0: 20 20 20 20 26 26 20 28 70 52 3d 70 2d 3e 70 52      && (pR=p->pR
71b0: 69 67 68 74 29 21 3d 30 20 26 26 20 70 52 2d 3e  ight)!=0 && pR->
71c0: 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 52 2d 3e 74  token.z && pR->t
71d0: 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  oken.z[0] ){.   
71e0: 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e     /* For column
71f0: 73 20 6f 66 20 74 68 65 20 66 72 6f 6d 20 41 2e  s of the from A.
7200: 42 20 75 73 65 20 42 20 61 73 20 74 68 65 20 6e  B use B as the n
7210: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61  ame */.      zNa
7220: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
7230: 6e 74 66 28 22 25 54 22 2c 20 26 70 52 2d 3e 74  ntf("%T", &pR->t
7240: 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  oken);.    }else
7250: 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26   if( p->span.z &
7260: 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29  & p->span.z[0] )
7270: 7b 0a 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74  {.      /* Use t
7280: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74  he original text
7290: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65   of the column e
72a0: 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73  xpression as its
72b0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a   name */.      z
72c0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
72d0: 72 69 6e 74 66 28 22 25 54 22 2c 20 26 70 2d 3e  rintf("%T", &p->
72e0: 73 70 61 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  span);.    }else
72f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c  {.      /* If al
7300: 6c 20 65 6c 73 65 20 66 61 69 6c 73 2c 20 6d 61  l else fails, ma
7310: 6b 65 20 75 70 20 61 20 6e 61 6d 65 20 2a 2f 0a  ke up a name */.
7320: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
7330: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 63 6f  lite3MPrintf("co
7340: 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20  lumn%d", i+1);. 
7350: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
7360: 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a  Dequote(zName);.
7370: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
7380: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b  malloc_failed ){
7390: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
73a0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  e(zName);.      
73b0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
73c0: 6c 65 28 30 2c 20 70 54 61 62 29 3b 0a 20 20 20  le(0, pTab);.   
73d0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
73e0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
73f0: 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  sure the column 
7400: 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20  name is unique. 
7410: 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   If the name is 
7420: 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20  not unique,.    
7430: 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65  ** append a inte
7440: 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20  ger to the name 
7450: 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d  so that it becom
7460: 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a  es unique..    *
7470: 2f 0a 20 20 20 20 7a 42 61 73 65 6e 61 6d 65 20  /.    zBasename 
7480: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 66 6f 72  = zName;.    for
7490: 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a  (j=cnt=0; j<i; j
74a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
74b0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43  qlite3StrICmp(aC
74c0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  ol[j].zName, zNa
74d0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
74e0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
74f0: 33 4d 50 72 69 6e 74 66 28 22 25 73 3a 25 64 22  3MPrintf("%s:%d"
7500: 2c 20 7a 42 61 73 65 6e 61 6d 65 2c 20 2b 2b 63  , zBasename, ++c
7510: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  nt);.        j =
7520: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28   -1;.        if(
7530: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61   zName==0 ) brea
7540: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
7550: 0a 20 20 20 20 69 66 28 20 7a 42 61 73 65 6e 61  .    if( zBasena
7560: 6d 65 21 3d 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  me!=zName ){.   
7570: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 42     sqliteFree(zB
7580: 61 73 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  asename);.    }.
7590: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20      pCol->zName 
75a0: 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a  = zName;..    /*
75b0: 20 47 65 74 20 74 68 65 20 74 79 70 65 6e 61 6d   Get the typenam
75c0: 65 2c 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  e, type affinity
75d0: 2c 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  , and collating 
75e0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
75f0: 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a  .    ** column..
7600: 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65      */.    memse
7610: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
7620: 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43  f(sNC));.    sNC
7630: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c  .pSrcList = pSel
7640: 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 7a  ect->pSrc;.    z
7650: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Type = sqliteStr
7660: 44 75 70 28 63 6f 6c 75 6d 6e 54 79 70 65 28 26  Dup(columnType(&
7670: 73 4e 43 2c 20 70 29 29 3b 0a 20 20 20 20 70 43  sNC, p));.    pC
7680: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 7a 54 79 70  ol->zType = zTyp
7690: 65 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66  e;.    pCol->aff
76a0: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
76b0: 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a  xprAffinity(p);.
76c0: 20 20 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20      pCol->pColl 
76d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
76e0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
76f0: 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 2d 3e  .    if( !pCol->
7700: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
7710: 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50 61  Col->pColl = pPa
7720: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
7730: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ll;.    }.  }.  
7740: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
7750: 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  ;.  return pTab;
7760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  .}../*.** Prepar
7770: 65 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  e a SELECT state
7780: 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73  ment for process
7790: 69 6e 67 20 62 79 20 64 6f 69 6e 67 20 74 68 65  ing by doing the
77a0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68   following.** th
77b0: 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ings:.**.**    (
77c0: 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44  1)  Make sure VD
77d0: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
77e0: 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
77f0: 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a  gned to every.**
7800: 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74           element
7810: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
7820: 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  use..**.**    (2
7830: 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  )  Fill in the p
7840: 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61  TabList->a[].pTa
7850: 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  b fields in the 
7860: 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a  SrcList that .**
7870: 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73           defines
7880: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57   FROM clause.  W
7890: 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72  hen views appear
78a0: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
78b0: 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  use,.**         
78c0: 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61  fill pTabList->a
78d0: 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20  [].pSelect with 
78e0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
78f0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
7900: 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69  *         that i
7910: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
7920: 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d  ew.  A copy is m
7930: 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27  ade of the view'
7940: 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20  s SELECT.**     
7950: 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f      statement so
7960: 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65   that we can fre
7970: 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65  ely modify or de
7980: 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d  lete that statem
7990: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77  ent.**         w
79a0: 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20  ithout worrying 
79b0: 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70  about messing up
79c0: 20 74 68 65 20 70 72 65 73 69 73 74 65 6e 74 20   the presistent 
79d0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a  representation.*
79e0: 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65  *         of the
79f0: 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   view..**.**    
7a00: 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74  (3)  Add terms t
7a10: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
7a20: 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65  se to accomodate
7a30: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
7a40: 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  word.**         
7a50: 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65  on joins and the
7a60: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
7a70: 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a  ause of joins..*
7a80: 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61  *.**    (4)  Sca
7a90: 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f  n the list of co
7aa0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
7ab0: 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29  ult set (pEList)
7ac0: 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   looking.**     
7ad0: 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65      for instance
7ae0: 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65  s of the "*" ope
7af0: 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42  rator or the TAB
7b00: 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LE.* operator..*
7b10: 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75  *         If fou
7b20: 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20  nd, expand each 
7b30: 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20  "*" to be every 
7b40: 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20  column in every 
7b50: 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
7b60: 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20   and TABLE.* to 
7b70: 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
7b80: 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  in TABLE..**.** 
7b90: 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63  Return 0 on succ
7ba0: 65 73 73 2e 20 20 49 66 20 74 68 65 72 65 20 61  ess.  If there a
7bb0: 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61  re problems, lea
7bc0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
7bd0: 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65  age.** in pParse
7be0: 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d   and return non-
7bf0: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
7c00: 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53 74  int prepSelectSt
7c10: 6d 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mt(Parse *pParse
7c20: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
7c30: 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b  int i, j, k, rc;
7c40: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
7c50: 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74  List;.  ExprList
7c60: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c   *pEList;.  Tabl
7c70: 65 20 2a 70 54 61 62 3b 0a 20 20 73 74 72 75 63  e *pTab;.  struc
7c80: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
7c90: 70 46 72 6f 6d 3b 0a 0a 20 20 69 66 28 20 70 3d  pFrom;..  if( p=
7ca0: 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30  =0 || p->pSrc==0
7cb0: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
7cc0: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
7cd0: 72 6e 20 31 3b 0a 20 20 70 54 61 62 4c 69 73 74  rn 1;.  pTabList
7ce0: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
7cf0: 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
7d00: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
7d10: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
7d20: 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
7d30: 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69  ned to all entri
7d40: 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46  es in.  ** the F
7d50: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
7d60: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
7d70: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  nt..  */.  sqlit
7d80: 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
7d90: 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
7da0: 2d 3e 70 53 72 63 29 3b 0a 0a 20 20 2f 2a 20 4c  ->pSrc);..  /* L
7db0: 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62  ook up every tab
7dc0: 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20  le named in the 
7dd0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
7de0: 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20  he select.  If. 
7df0: 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   ** an entry of 
7e00: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
7e10: 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e  is a subquery in
7e20: 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65  stead of a table
7e30: 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74   or view,.  ** t
7e40: 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61  hen create a tra
7e50: 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72  nsient table str
7e60: 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69  ucture to descri
7e70: 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  be the subquery.
7e80: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
7e90: 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
7ea0: 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
7eb0: 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
7ec0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72  ++){.    if( pFr
7ed0: 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20  om->pTab!=0 ){. 
7ee0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61       /* This sta
7ef0: 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61  tement has alrea
7f00: 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64  dy been prepared
7f10: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  .  There is no n
7f20: 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  eed.      ** to 
7f30: 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20  go further. */. 
7f40: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d       assert( i==
7f50: 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
7f60: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
7f70: 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d  f( pFrom->zName=
7f80: 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
7f90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
7fa0: 52 59 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75  RY.      /* A su
7fb0: 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46  b-query in the F
7fc0: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
7fd0: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20  SELECT */.      
7fe0: 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
7ff0: 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20  Select!=0 );.   
8000: 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41     if( pFrom->zA
8010: 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lias==0 ){.     
8020: 20 20 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73     pFrom->zAlias
8030: 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   =.          sql
8040: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 73 71 6c  ite3MPrintf("sql
8050: 69 74 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f  ite_subquery_%p_
8060: 22 2c 20 28 76 6f 69 64 2a 29 70 46 72 6f 6d 2d  ", (void*)pFrom-
8070: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
8080: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
8090: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
80a0: 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  );.      pFrom->
80b0: 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20  pTab = pTab = . 
80c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
80d0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
80e0: 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 2d 3e 7a  pParse, pFrom->z
80f0: 41 6c 69 61 73 2c 20 70 46 72 6f 6d 2d 3e 70 53  Alias, pFrom->pS
8100: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66  elect);.      if
8110: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
8120: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
8130: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
8140: 54 68 65 20 69 73 54 72 61 6e 73 69 65 6e 74 20  The isTransient 
8150: 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74  flag indicates t
8160: 68 61 74 20 74 68 65 20 54 61 62 6c 65 20 73 74  hat the Table st
8170: 72 75 63 74 75 72 65 20 68 61 73 20 62 65 65 6e  ructure has been
8180: 0a 20 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69  .      ** dynami
8190: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
81a0: 61 6e 64 20 6d 61 79 20 62 65 20 66 72 65 65 64  and may be freed
81b0: 20 61 74 20 61 6e 79 20 74 69 6d 65 2e 20 20 49   at any time.  I
81c0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 20  n other words,. 
81d0: 20 20 20 20 20 2a 2a 20 70 54 61 62 20 69 73 20       ** pTab is 
81e0: 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  not pointing to 
81f0: 61 20 70 65 72 73 69 73 74 65 6e 74 20 74 61 62  a persistent tab
8200: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
8210: 74 20 64 65 66 69 6e 65 73 0a 20 20 20 20 20 20  t defines.      
8220: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  ** part of the s
8230: 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20  chema. */.      
8240: 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e  pTab->isTransien
8250: 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20  t = 1;.#endif.  
8260: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
8270: 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  * An ordinary ta
8280: 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
8290: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
82a0: 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  use */.      ass
82b0: 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
82c0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72  ==0 );.      pFr
82d0: 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
82e0: 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  = .        sqlit
82f0: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
8300: 61 72 73 65 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d  arse,pFrom->zNam
8310: 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61  e,pFrom->zDataba
8320: 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  se);.      if( p
8330: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
8340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
8350: 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e    }.      pTab->
8360: 6e 52 65 66 2b 2b 3b 0a 23 69 66 6e 64 65 66 20  nRef++;.#ifndef 
8370: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
8380: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
8390: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
83a0: 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20      /* We reach 
83b0: 68 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65  here if the name
83c0: 64 20 74 61 62 6c 65 20 69 73 20 61 20 72 65 61  d table is a rea
83d0: 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20  lly a view */.  
83e0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
83f0: 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
8400: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
8410: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
8420: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
8430: 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66   }.        /* If
8440: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21   pFrom->pSelect!
8450: 3d 30 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61  =0 it means we a
8460: 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
8470: 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 69 65  a.        ** vie
8480: 77 20 77 69 74 68 69 6e 20 61 20 76 69 65 77 2e  w within a view.
8490: 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 72    The SELECT str
84a0: 75 63 74 75 72 65 20 68 61 73 20 61 6c 72 65 61  ucture has alrea
84b0: 64 79 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  dy been.        
84c0: 2a 2a 20 63 6f 70 69 65 64 20 62 79 20 74 68 65  ** copied by the
84d0: 20 6f 75 74 65 72 20 76 69 65 77 20 73 6f 20 77   outer view so w
84e0: 65 20 63 61 6e 20 73 6b 69 70 20 74 68 65 20 63  e can skip the c
84f0: 6f 70 79 20 73 74 65 70 20 68 65 72 65 0a 20 20  opy step here.  
8500: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
8510: 69 6e 6e 65 72 20 76 69 65 77 2e 0a 20 20 20 20  inner view..    
8520: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
8530: 66 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  f( pFrom->pSelec
8540: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
8550: 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
8560: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
8570: 44 75 70 28 70 54 61 62 2d 3e 70 53 65 6c 65 63  Dup(pTab->pSelec
8580: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
8590: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
85a0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f   }.  }..  /* Pro
85b0: 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79  cess NATURAL key
85c0: 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e  words, and ON an
85d0: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
85e0: 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20  of joins..  */. 
85f0: 20 69 66 28 20 73 71 6c 69 74 65 50 72 6f 63 65   if( sqliteProce
8600: 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70  ssJoin(pParse, p
8610: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20  ) ) return 1;.. 
8620: 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a   /* For every "*
8630: 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  " that occurs in
8640: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
8650: 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  , insert the nam
8660: 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63  es of.  ** all c
8670: 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
8680: 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65  bles.  And for e
8690: 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73  very TABLE.* ins
86a0: 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20  ert the names.  
86b0: 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  ** of all column
86c0: 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65  s in TABLE.  The
86d0: 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64   parser inserted
86e0: 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65   a special expre
86f0: 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20  ssion.  ** with 
8700: 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61  the TK_ALL opera
8710: 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22  tor for each "*"
8720: 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69   that it found i
8730: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
8740: 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  t..  ** The foll
8750: 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20  owing code just 
8760: 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  has to locate th
8770: 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73  e TK_ALL express
8780: 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a  ions and expand.
8790: 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f    ** each one to
87a0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
87b0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
87c0: 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
87d0: 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  * The first loop
87e0: 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20   just checks to 
87f0: 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
8800: 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f   any "*" operato
8810: 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65  rs.  ** that nee
8820: 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a  d expanding..  *
8830: 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70  /.  for(k=0; k<p
8840: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
8850: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
8860: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e   = pEList->a[k].
8870: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
8880: 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20  E->op==TK_ALL ) 
8890: 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70  break;.    if( p
88a0: 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
88b0: 20 70 45 2d 3e 70 52 69 67 68 74 20 26 26 20 70   pE->pRight && p
88c0: 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  E->pRight->op==T
88d0: 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20 20 26  K_ALL.         &
88e0: 26 20 70 45 2d 3e 70 4c 65 66 74 20 26 26 20 70  & pE->pLeft && p
88f0: 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  E->pLeft->op==TK
8900: 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  _ID ) break;.  }
8910: 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28  .  rc = 0;.  if(
8920: 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
8930: 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
8940: 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65  * If we get here
8950: 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65   it means the re
8960: 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e  sult set contain
8970: 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a  s one or more "*
8980: 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f  ".    ** operato
8990: 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  rs that need to 
89a0: 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f  be expanded.  Lo
89b0: 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
89c0: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
89d0: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
89e0: 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74  set and expand t
89f0: 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  hem one by one..
8a00: 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63      */.    struc
8a10: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
8a20: 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  *a = pEList->a;.
8a30: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e      ExprList *pN
8a40: 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ew = 0;.    int 
8a50: 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e  flags = pParse->
8a60: 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69  db->flags;.    i
8a70: 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28  nt longNames = (
8a80: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
8a90: 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 20  ullColNames)!=0 
8aa0: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
8ab0: 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 73 20           (flags 
8ac0: 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
8ad0: 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20  lNames)==0;..   
8ae0: 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
8af0: 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
8b00: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
8b10: 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[k].pExpr;.  
8b20: 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d      if( pE->op!=
8b30: 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20 20  TK_ALL &&.      
8b40: 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b       (pE->op!=TK
8b50: 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67  _DOT || pE->pRig
8b60: 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69  ht==0 || pE->pRi
8b70: 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ght->op!=TK_ALL)
8b80: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
8b90: 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65  his particular e
8ba0: 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e  xpression does n
8bb0: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  ot need to be ex
8bc0: 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20  panded..        
8bd0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  */.        pNew 
8be0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
8bf0: 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 61 5b  tAppend(pNew, a[
8c00: 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  k].pExpr, 0);.  
8c10: 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
8c20: 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
8c30: 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
8c40: 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45  .        a[k].pE
8c50: 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  xpr = 0;.       
8c60: 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b   a[k].zName = 0;
8c70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8c80: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78        /* This ex
8c90: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a  pression is a "*
8ca0: 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22  " or a "TABLE.*"
8cb0: 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
8cc0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61  .        ** expa
8cd0: 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nded. */.       
8ce0: 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d   int tableSeen =
8cf0: 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20   0;      /* Set 
8d00: 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20  to 1 when TABLE 
8d10: 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
8d20: 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b     char *zTName;
8d30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
8d40: 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54  ext of name of T
8d50: 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  ABLE */.        
8d60: 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
8d70: 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20  OT && pE->pLeft 
8d80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  ){.          zTN
8d90: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
8da0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70 45 2d 3e  eFromToken(&pE->
8db0: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  pLeft->token);. 
8dc0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
8dd0: 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d          zTName =
8de0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
8df0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
8e00: 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
8e10: 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
8e20: 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
8e30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62  ){.          Tab
8e40: 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
8e50: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
8e60: 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
8e70: 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73   = pFrom->zAlias
8e80: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
8e90: 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  zTabName==0 || z
8ea0: 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b  TabName[0]==0 ){
8eb0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54   .            zT
8ec0: 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a  abName = pTab->z
8ed0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
8ee0: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
8ef0: 7a 54 4e 61 6d 65 20 26 26 20 28 7a 54 61 62 4e  zTName && (zTabN
8f00: 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61  ame==0 || zTabNa
8f10: 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20  me[0]==0 || .   
8f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
8f30: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e  lite3StrICmp(zTN
8f40: 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d  ame, zTabName)!=
8f50: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
8f60: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8f70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8f80: 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b    tableSeen = 1;
8f90: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
8fa0: 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; j<pTab->nCol
8fb0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
8fc0: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c      Expr *pExpr,
8fd0: 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74   *pLeft, *pRight
8fe0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
8ff0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62  ar *zName = pTab
9000: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
9010: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
9020: 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( i>0 ){.       
9030: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
9040: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66  cList_item *pLef
9050: 74 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  t = &pTabList->a
9060: 5b 69 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  [i-1];.         
9070: 20 20 20 20 20 69 66 28 20 28 70 4c 65 66 74 2d       if( (pLeft-
9080: 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  >jointype & JT_N
9090: 41 54 55 52 41 4c 29 21 3d 30 20 26 26 0a 20 20  ATURAL)!=0 &&.  
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90b0: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65        columnInde
90c0: 78 28 70 4c 65 66 74 2d 3e 70 54 61 62 2c 20 7a  x(pLeft->pTab, z
90d0: 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
90f0: 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e  n a NATURAL join
9100: 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20  , omit the join 
9110: 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65  columns from the
9120: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
9130: 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68    ** table on th
9140: 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 20  e right */.     
9150: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
9160: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
9170: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
9180: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64     if( sqlite3Id
9190: 4c 69 73 74 49 6e 64 65 78 28 70 4c 65 66 74 2d  ListIndex(pLeft-
91a0: 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e  >pUsing, zName)>
91b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
91c0: 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f        /* In a jo
91d0: 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20  in with a USING 
91e0: 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c  clause, omit col
91f0: 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20  umns in the.    
9200: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75              ** u
9210: 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d  sing clause from
9220: 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68   the table on th
9230: 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  e right. */.    
9240: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
9250: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
9260: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9270: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
9280: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
9290: 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30  Expr(TK_ID, 0, 0
92a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
92b0: 20 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20    if( pRight==0 
92c0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
92d0: 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70       setToken(&p
92e0: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e  Right->token, zN
92f0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
9300: 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 20 26    if( zTabName &
9310: 26 20 28 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20  & (longNames || 
9320: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
9330: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
9340: 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
9350: 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c  e3Expr(TK_ID, 0,
9360: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
9370: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
9380: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54  lite3Expr(TK_DOT
9390: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
93a0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
93b0: 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20     if( pExpr==0 
93c0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
93d0: 20 20 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28         setToken(
93e0: 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a  &pLeft->token, z
93f0: 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TabName);.      
9400: 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b 65 6e          setToken
9410: 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 73  (&pExpr->span, s
9420: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25  qlite3MPrintf("%
9430: 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c  s.%s", zTabName,
9440: 20 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20   zName));.      
9450: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73          pExpr->s
9460: 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20  pan.dyn = 1;.   
9470: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
9480: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20  ->token.z = 0;. 
9490: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
94a0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b  pr->token.n = 0;
94b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
94c0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  Expr->token.dyn 
94d0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
94e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
94f0: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52        pExpr = pR
9500: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
9510: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 20      pExpr->span 
9520: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a  = pExpr->token;.
9530: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
9540: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f            if( lo
9550: 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  ngNames ){.     
9560: 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
9570: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
9580: 70 70 65 6e 64 28 70 4e 65 77 2c 20 70 45 78 70  ppend(pNew, pExp
9590: 72 2c 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29  r, &pExpr->span)
95a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
95b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
95c0: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
95d0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
95e0: 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70 52  pNew, pExpr, &pR
95f0: 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  ight->token);.  
9600: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9620: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74  }.        if( !t
9630: 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20  ableSeen ){.    
9640: 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
9650: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9660: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
9670: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
9680: 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e   table: %s", zTN
9690: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
96a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
96b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
96c0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74  sg(pParse, "no t
96d0: 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22  ables specified"
96e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
96f0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
9700: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9710: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54     sqliteFree(zT
9720: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
9730: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
9740: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
9750: 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
9760: 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
9770: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
9780: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
9790: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
97a0: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ELECT./*.** This
97b0: 20 72 6f 75 74 69 6e 65 20 61 73 73 6f 63 69 61   routine associa
97c0: 74 65 73 20 65 6e 74 72 69 65 73 20 69 6e 20 61  tes entries in a
97d0: 6e 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65  n ORDER BY expre
97e0: 73 73 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a  ssion list with.
97f0: 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20  ** columns in a 
9800: 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 65 61 63  result.  For eac
9810: 68 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65  h ORDER BY expre
9820: 73 73 69 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64  ssion, the opcod
9830: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d  e of.** the top-
9840: 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 63 68  level node is ch
9850: 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55  anged to TK_COLU
9860: 4d 4e 20 61 6e 64 20 74 68 65 20 69 43 6f 6c 75  MN and the iColu
9870: 6d 6e 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  mn value of.** t
9880: 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64  he top-level nod
9890: 65 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77  e is filled in w
98a0: 69 74 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  ith column numbe
98b0: 72 20 61 6e 64 20 74 68 65 20 69 54 61 62 6c 65  r and the iTable
98c0: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65  .** value of the
98d0: 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20   top-level node 
98e0: 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69  is filled with i
98f0: 54 61 62 6c 65 20 70 61 72 61 6d 65 74 65 72 2e  Table parameter.
9900: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
9910: 61 72 65 20 70 72 69 6f 72 20 53 45 4c 45 43 54  are prior SELECT
9920: 20 63 6c 61 75 73 65 73 2c 20 74 68 65 79 20 61   clauses, they a
9930: 72 65 20 70 72 6f 63 65 73 73 65 64 20 66 69 72  re processed fir
9940: 73 74 2e 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20  st.  A match.** 
9950: 69 6e 20 61 6e 20 65 61 72 6c 69 65 72 20 53 45  in an earlier SE
9960: 4c 45 43 54 20 74 61 6b 65 73 20 70 72 65 63 65  LECT takes prece
9970: 64 65 6e 63 65 20 6f 76 65 72 20 61 20 6c 61 74  dence over a lat
9980: 65 72 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a  er SELECT..**.**
9990: 20 41 6e 79 20 65 6e 74 72 79 20 74 68 61 74 20   Any entry that 
99a0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 69  does not match i
99b0: 73 20 66 6c 61 67 67 65 64 20 61 73 20 61 6e 20  s flagged as an 
99c0: 65 72 72 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62  error.  The numb
99d0: 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20  er.** of errors 
99e0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
99f0: 73 74 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68  static int match
9a00: 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28  OrderbyToColumn(
9a10: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9a20: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ,          /* A 
9a30: 70 6c 61 63 65 20 74 6f 20 6c 65 61 76 65 20 65  place to leave e
9a40: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f  rror messages */
9a50: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
9a60: 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  ct,        /* Ma
9a70: 74 63 68 20 74 6f 20 72 65 73 75 6c 74 20 63 6f  tch to result co
9a80: 6c 75 6d 6e 73 20 6f 66 20 74 68 69 73 20 53 45  lumns of this SE
9a90: 4c 45 43 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69  LECT */.  ExprLi
9aa0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
9ab0: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
9ac0: 59 20 76 61 6c 75 65 73 20 74 6f 20 6d 61 74 63  Y values to matc
9ad0: 68 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e  h against column
9ae0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  s */.  int iTabl
9af0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
9b00: 2a 20 49 6e 73 65 72 74 20 74 68 69 73 20 76 61  * Insert this va
9b10: 6c 75 65 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f  lue in iTable */
9b20: 0a 20 20 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c  .  int mustCompl
9b30: 65 74 65 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ete        /* If
9b40: 20 54 52 55 45 20 61 6c 6c 20 4f 52 44 45 52 20   TRUE all ORDER 
9b50: 42 59 73 20 6d 75 73 74 20 6d 61 74 63 68 20 2a  BYs must match *
9b60: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20  /.){.  int nErr 
9b70: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  = 0;.  int i, j;
9b80: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
9b90: 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c  ist;..  if( pSel
9ba0: 65 63 74 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72  ect==0 || pOrder
9bb0: 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  By==0 ) return 1
9bc0: 3b 0a 20 20 69 66 28 20 6d 75 73 74 43 6f 6d 70  ;.  if( mustComp
9bd0: 6c 65 74 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  lete ){.    for(
9be0: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
9bf0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f  >nExpr; i++){ pO
9c00: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e  rderBy->a[i].don
9c10: 65 20 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69  e = 0; }.  }.  i
9c20: 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d  f( prepSelectStm
9c30: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
9c40: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
9c50: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   1;.  }.  if( pS
9c60: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b  elect->pPrior ){
9c70: 0a 20 20 20 20 69 66 28 20 6d 61 74 63 68 4f 72  .    if( matchOr
9c80: 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50  derbyToColumn(pP
9c90: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70  arse, pSelect->p
9ca0: 50 72 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c  Prior, pOrderBy,
9cb0: 20 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20   iTable, 0) ){. 
9cc0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
9cd0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73     }.  }.  pELis
9ce0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
9cf0: 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ist;.  for(i=0; 
9d00: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
9d10: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
9d20: 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79  r *pE = pOrderBy
9d30: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
9d40: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b    int iCol = -1;
9d50: 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
9d60: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63  y->a[i].done ) c
9d70: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
9d80: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
9d90: 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29  teger(pE, &iCol)
9da0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43   ){.      if( iC
9db0: 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45  ol<=0 || iCol>pE
9dc0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
9dd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
9de0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
9df0: 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20           "ORDER 
9e00: 42 59 20 70 6f 73 69 74 69 6f 6e 20 25 64 20 73  BY position %d s
9e10: 68 6f 75 6c 64 20 62 65 20 62 65 74 77 65 65 6e  hould be between
9e20: 20 31 20 61 6e 64 20 25 64 22 2c 0a 20 20 20 20   1 and %d",.    
9e30: 20 20 20 20 20 20 69 43 6f 6c 2c 20 70 45 4c 69        iCol, pELi
9e40: 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
9e50: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
9e60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9e70: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 6d 75   }.      if( !mu
9e80: 73 74 43 6f 6d 70 6c 65 74 65 20 29 20 63 6f 6e  stComplete ) con
9e90: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 43 6f  tinue;.      iCo
9ea0: 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  l--;.    }.    f
9eb0: 6f 72 28 6a 3d 30 3b 20 69 43 6f 6c 3c 30 20 26  or(j=0; iCol<0 &
9ec0: 26 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  & j<pEList->nExp
9ed0: 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; j++){.      i
9ee0: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  f( pEList->a[j].
9ef0: 7a 4e 61 6d 65 20 26 26 20 28 70 45 2d 3e 6f 70  zName && (pE->op
9f00: 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 2d 3e 6f  ==TK_ID || pE->o
9f10: 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 29 20 29 7b  p==TK_STRING) ){
9f20: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
9f30: 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b 0a 20  Name, *zLabel;. 
9f40: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70         zName = p
9f50: 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  EList->a[j].zNam
9f60: 65 3b 0a 20 20 20 20 20 20 20 20 7a 4c 61 62 65  e;.        zLabe
9f70: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
9f80: 72 6f 6d 54 6f 6b 65 6e 28 26 70 45 2d 3e 74 6f  romToken(&pE->to
9f90: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ken);.        as
9fa0: 73 65 72 74 28 20 7a 4c 61 62 65 6c 21 3d 30 20  sert( zLabel!=0 
9fb0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
9fc0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e  qlite3StrICmp(zN
9fd0: 61 6d 65 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30 20  ame, zLabel)==0 
9fe0: 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 69 43  ){ .          iC
9ff0: 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  ol = j;.        
a000: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
a010: 46 72 65 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20  Free(zLabel);.  
a020: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
a030: 69 43 6f 6c 3c 30 20 26 26 20 73 71 6c 69 74 65  iCol<0 && sqlite
a040: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 2c  3ExprCompare(pE,
a050: 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45   pEList->a[j].pE
a060: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
a070: 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20  iCol = j;.      
a080: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
a090: 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
a0a0: 20 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c   pE->op = TK_COL
a0b0: 55 4d 4e 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69  UMN;.      pE->i
a0c0: 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
a0d0: 20 20 20 20 20 70 45 2d 3e 69 54 61 62 6c 65 20       pE->iTable 
a0e0: 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  = iTable;.      
a0f0: 70 45 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  pE->iAgg = -1;. 
a100: 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
a110: 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20  [i].done = 1;.  
a120: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c    }.    if( iCol
a130: 3c 30 20 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65  <0 && mustComple
a140: 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  te ){.      sqli
a150: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
a160: 73 65 2c 0a 20 20 20 20 20 20 20 20 22 4f 52 44  se,.        "ORD
a170: 45 52 20 42 59 20 74 65 72 6d 20 6e 75 6d 62 65  ER BY term numbe
a180: 72 20 25 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61  r %d does not ma
a190: 74 63 68 20 61 6e 79 20 72 65 73 75 6c 74 20 63  tch any result c
a1a0: 6f 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20 20  olumn", i+1);.  
a1b0: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
a1c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a1d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72   }.  return nErr
a1e0: 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;  .}.#endif /* 
a1f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a200: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
a210: 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65  ECT */../*.** Ge
a220: 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65  t a VDBE for the
a230: 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f   given parser co
a240: 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61  ntext.  Create a
a250: 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65   new one if nece
a260: 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20  ssary..** If an 
a270: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
a280: 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65  turn NULL and le
a290: 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e  ave a message in
a2a0: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65   pParse..*/.Vdbe
a2b0: 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65   *sqlite3GetVdbe
a2c0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
a2d0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
a2e0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
a2f0: 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20  ( v==0 ){.    v 
a300: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  = pParse->pVdbe 
a310: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65  = sqlite3VdbeCre
a320: 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ate(pParse->db);
a330: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b  .  }.  return v;
a340: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
a350: 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64  e the iLimit and
a360: 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20   iOffset fields 
a370: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61  of the SELECT ba
a380: 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c  sed on the.** pL
a390: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
a3a0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 6e   expressions.  n
a3b0: 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65  Limit and nOffse
a3c0: 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  t hold the expre
a3d0: 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61  ssions.** that a
a3e0: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69  ppear in the ori
a3f0: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
a400: 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49  ent after the LI
a410: 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a  MIT and OFFSET.*
a420: 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20  * keywords.  Or 
a430: 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65  NULL if those ke
a440: 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74  ywords are omitt
a450: 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  ed. iLimit and i
a460: 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74  Offset .** are t
a470: 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72  he integer memor
a480: 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  y register numbe
a490: 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20  rs for counters 
a4a0: 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
a4b0: 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e  .** the limit an
a4c0: 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68  d offset.  If th
a4d0: 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20  ere is no limit 
a4e0: 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74  and/or offset, t
a4f0: 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61  hen .** iLimit a
a500: 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e  nd iOffset are n
a510: 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  egative..**.** T
a520: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e  his routine chan
a530: 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 69  ges the values i
a540: 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  f iLimit and iOf
a550: 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20  fset only if.** 
a560: 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65  a limit or offse
a570: 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
a580: 6e 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73  nLimit and nOffs
a590: 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a  et.  iLimit and.
a5a0: 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c  ** iOffset shoul
a5b0: 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73  d have been pres
a5c0: 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74  et to appropriat
a5d0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73  e default values
a5e0: 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74  .** (usually but
a5f0: 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20   not always -1) 
a600: 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
a610: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
a620: 2a 20 4f 6e 6c 79 20 69 66 20 6e 4c 69 6d 69 74  * Only if nLimit
a630: 3e 3d 30 20 6f 72 20 6e 4f 66 66 73 65 74 3e 30  >=0 or nOffset>0
a640: 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65   do the limit re
a650: 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72  gisters get.** r
a660: 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55  edefined.  The U
a670: 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
a680: 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70  r uses this prop
a690: 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a  erty to force.**
a6a0: 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68   the reuse of th
a6b0: 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64  e same limit and
a6c0: 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72   offset register
a6d0: 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c  s across multipl
a6e0: 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
a6f0: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ements..*/.stati
a700: 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69  c void computeLi
a710: 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72  mitRegisters(Par
a720: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
a730: 63 74 20 2a 70 29 7b 0a 20 20 2f 2a 20 0a 20 20  ct *p){.  /* .  
a740: 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c  ** "LIMIT -1" al
a750: 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72  ways shows all r
a760: 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73  ows.  There is s
a770: 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76  ome.  ** contrav
a780: 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20  ersy about what 
a790: 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
a7a0: 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a  vior should be..
a7b0: 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74    ** The current
a7c0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
a7d0: 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49  interprets "LIMI
a7e0: 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a  T 0" to mean.  *
a7f0: 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a  * no rows..  */.
a800: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
a810: 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20  ){.    int iMem 
a820: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
a830: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  ;.    Vdbe *v = 
a840: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
a850: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
a860: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
a870: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
a880: 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c  de(pParse, p->pL
a890: 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  imit);.    sqlit
a8a0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a8b0: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20  P_MustBeInt, 0, 
a8c0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
a8d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
a8e0: 65 67 61 74 69 76 65 2c 20 30 2c 20 30 29 3b 0a  egative, 0, 0);.
a8f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a900: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
a910: 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20  ore, iMem, 1);. 
a920: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
a930: 76 2c 20 22 23 20 4c 49 4d 49 54 20 63 6f 75 6e  v, "# LIMIT coun
a940: 74 65 72 22 29 29 3b 0a 20 20 20 20 70 2d 3e 69  ter"));.    p->i
a950: 4c 69 6d 69 74 20 3d 20 69 4d 65 6d 3b 0a 20 20  Limit = iMem;.  
a960: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73  }.  if( p->pOffs
a970: 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d  et ){.    int iM
a980: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
a990: 6d 2b 2b 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  m++;.    Vdbe *v
a9a0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
a9b0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
a9c0: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
a9d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
a9e0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d  rCode(pParse, p-
a9f0: 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73  >pOffset);.    s
aa00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
aa10: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
aa20: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
aa30: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
aa40: 4f 50 5f 4e 65 67 61 74 69 76 65 2c 20 30 2c 20  OP_Negative, 0, 
aa50: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
aa60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
aa70: 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 31  emStore, iMem, 1
aa80: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
aa90: 6e 74 28 28 76 2c 20 22 23 20 4f 46 46 53 45 54  nt((v, "# OFFSET
aaa0: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
aab0: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4d   p->iOffset = iM
aac0: 65 6d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  em;.  }.}../*.**
aad0: 20 41 6c 6c 6f 63 61 74 65 20 61 20 76 69 72 74   Allocate a virt
aae0: 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65  ual index to use
aaf0: 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2f   for sorting..*/
ab00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
ab10: 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28  ateSortingIndex(
ab20: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
ab30: 65 6c 65 63 74 20 2a 70 2c 20 45 78 70 72 4c 69  elect *p, ExprLi
ab40: 73 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20  st *pOrderBy){. 
ab50: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
ab60: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  .    int addr;. 
ab70: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65     assert( pOrde
ab80: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3d 3d 30  rBy->iECursor==0
ab90: 20 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79   );.    pOrderBy
aba0: 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61  ->iECursor = pPa
abb0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
abc0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
abd0: 64 62 65 41 64 64 4f 70 28 70 50 61 72 73 65 2d  dbeAddOp(pParse-
abe0: 3e 70 56 64 62 65 2c 20 4f 50 5f 4f 70 65 6e 56  >pVdbe, OP_OpenV
abf0: 69 72 74 75 61 6c 2c 0a 20 20 20 20 20 20 20 20  irtual,.        
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac10: 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45      pOrderBy->iE
ac20: 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79  Cursor, pOrderBy
ac30: 2d 3e 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20 20  ->nExpr+1);.    
ac40: 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
ac50: 70 65 6e 56 69 72 74 5b 32 5d 20 3d 3d 20 2d 31  penVirt[2] == -1
ac60: 20 29 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f   );.    p->addrO
ac70: 70 65 6e 56 69 72 74 5b 32 5d 20 3d 20 61 64 64  penVirt[2] = add
ac80: 72 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r;.  }.}../*.** 
ac90: 54 68 65 20 6f 70 63 6f 64 65 20 61 74 20 61 64  The opcode at ad
aca0: 64 72 20 69 73 20 61 6e 20 4f 50 5f 4f 70 65 6e  dr is an OP_Open
acb0: 56 69 72 74 75 61 6c 20 74 68 61 74 20 63 72 65  Virtual that cre
acc0: 61 74 65 64 20 61 20 73 6f 72 74 69 6e 67 0a 2a  ated a sorting.*
acd0: 2a 20 69 6e 64 65 78 20 74 68 61 20 77 65 20 65  * index tha we e
ace0: 6e 64 65 64 20 75 70 20 6e 6f 74 20 6e 65 65 64  nded up not need
acf0: 69 6e 67 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ing.  This routi
ad00: 6e 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 0a  ne changes that.
ad10: 2a 2a 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 5f  ** opcode to OP_
ad20: 4e 6f 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Noop..*/.static 
ad30: 76 6f 69 64 20 75 6e 63 72 65 61 74 65 53 6f 72  void uncreateSor
ad40: 74 69 6e 67 49 6e 64 65 78 28 50 61 72 73 65 20  tingIndex(Parse 
ad50: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 61 64 64  *pParse, int add
ad60: 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  r){.  Vdbe *v = 
ad70: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
ad80: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73   VdbeOp *pOp = s
ad90: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
ada0: 76 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69  v, addr);.  sqli
adb0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
adc0: 76 2c 20 61 64 64 72 2c 20 30 2c 20 30 29 3b 0a  v, addr, 0, 0);.
add0: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
ade0: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 70 4f 70 2d 3e  OP_Noop;.  pOp->
adf0: 70 31 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70  p1 = 0;.  pOp->p
ae00: 32 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65  2 = 0;.}..#ifnde
ae10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
ae20: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
ae30: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
ae40: 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61  ppropriate colla
ae50: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
ae60: 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  r the iCol-th co
ae70: 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72  lumn of.** the r
ae80: 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68  esult set for th
ae90: 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  e compound-selec
aea0: 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e  t statement "p".
aeb0: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
aec0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68  .** the column h
aed0: 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f  as no default co
aee0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
aef0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ..**.** The coll
af00: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
af10: 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  or the compound 
af20: 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20  select is taken 
af30: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74  from the.** left
af40: 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68  -most term of th
af50: 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68 61  e select that ha
af60: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  s a collating se
af70: 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  quence..*/.stati
af80: 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69  c CollSeq *multi
af90: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61  SelectCollSeq(Pa
afa0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
afb0: 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c  ect *p, int iCol
afc0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52  ){.  CollSeq *pR
afd0: 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  et;.  if( p->pPr
afe0: 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20  ior ){.    pRet 
aff0: 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
b000: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
b010: 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20  pPrior, iCol);. 
b020: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74   }else{.    pRet
b030: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
b040: 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  pRet==0 ){.    p
b050: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
b060: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
b070: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43   p->pEList->a[iC
b080: 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  ol].pExpr);.  }.
b090: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
b0a0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b0b0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
b0c0: 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64  SELECT */..#ifnd
b0d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
b0e0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
b0f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b100: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70  e is called to p
b110: 72 6f 63 65 73 73 20 61 20 71 75 65 72 79 20 74  rocess a query t
b120: 68 61 74 20 69 73 20 72 65 61 6c 6c 79 20 74 68  hat is really th
b130: 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e  e union.** or in
b140: 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 77  tersection of tw
b150: 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
b160: 74 65 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a  te queries..**.*
b170: 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20  * "p" points to 
b180: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  the right-most o
b190: 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65  f the two querie
b1a0: 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e  s.  the query on
b1b0: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20   the.** left is 
b1c0: 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20  p->pPrior.  The 
b1d0: 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64  left query could
b1e0: 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f   also be a compo
b1f0: 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20  und query.** in 
b200: 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20  which case this 
b210: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
b220: 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
b230: 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ly. .**.** The r
b240: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f  esults of the to
b250: 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f  tal query are to
b260: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
b270: 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a   a destination.*
b280: 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20  * of type eDest 
b290: 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69  with parameter i
b2a0: 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  Parm..**.** Exam
b2b0: 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72  ple 1:  Consider
b2c0: 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d   a three-way com
b2d0: 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d  pound SQL statem
b2e0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ent..**.**     S
b2f0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
b300: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46  UNION SELECT b F
b310: 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c  ROM t2 UNION SEL
b320: 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
b330: 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65  .** This stateme
b340: 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20  nt is parsed up 
b350: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
b360: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46  *     SELECT c F
b370: 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c  ROM t3.**      |
b380: 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e  .**      `----->
b390: 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20    SELECT b FROM 
b3a0: 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t2.**           
b3b0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
b3c0: 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d           `------
b3d0: 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  >  SELECT a FROM
b3e0: 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72   t1.**.** The ar
b3f0: 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67  rows in the diag
b400: 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73  ram above repres
b410: 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70  ent the Select.p
b420: 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a  Prior pointer..*
b430: 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75  * So if this rou
b440: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
b450: 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74  ith p equal to t
b460: 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65  he t3 query, the
b470: 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c  n.** pPrior will
b480: 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79   be the t2 query
b490: 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65  .  p->op will be
b4a0: 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69   TK_UNION in thi
b4b0: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  s case..**.** No
b4c0: 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73  tice that becaus
b4d0: 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c  e of the way SQL
b4e0: 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f  ite parses compo
b4f0: 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65  und SELECTs, the
b500: 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73  .** individual s
b510: 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72  elects always gr
b520: 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  oup from left to
b530: 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69   right..*/.stati
b540: 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
b550: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
b560: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
b570: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
b580: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
b590: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
b5a0: 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
b5b0: 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
b5c0: 64 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  d */.  int eDest
b5d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
b5e0: 5c 5f 5f 5f 20 20 53 74 6f 72 65 20 71 75 65 72  \___  Store quer
b5f0: 79 20 72 65 73 75 6c 74 73 20 61 73 20 73 70 65  y results as spe
b600: 63 69 66 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20  cified */.  int 
b610: 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20  iParm,          
b620: 20 20 2f 2a 20 2f 20 20 20 20 20 62 79 20 74 68    /* /     by th
b630: 65 73 65 20 74 77 6f 20 70 61 72 61 6d 65 74 65  ese two paramete
b640: 72 73 2e 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  rs.         */. 
b650: 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20   char *aff      
b660: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65         /* If eDe
b670: 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c  st is SRT_Union,
b680: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
b690: 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ring */.){.  int
b6a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b6b0: 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f     /* Success co
b6c0: 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75  de from a subrou
b6d0: 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tine */.  Select
b6e0: 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
b6f0: 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
b700: 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
b710: 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
b720: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
b730: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
b740: 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
b750: 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  BE */.  int nCol
b760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
b770: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
b780: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
b790: 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69   set */.  ExprLi
b7a0: 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
b7b0: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
b7c0: 63 6c 61 75 73 65 20 6f 6e 20 70 20 2a 2f 0a 20  clause on p */. 
b7d0: 20 69 6e 74 20 61 53 65 74 50 32 5b 32 5d 3b 20   int aSetP2[2]; 
b7e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 50 32         /* Set P2
b7f0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 73 65 20   value of these 
b800: 6f 70 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20  op to number of 
b810: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
b820: 20 6e 53 65 74 50 32 20 3d 20 30 3b 20 20 20 20   nSetP2 = 0;    
b830: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b840: 73 6c 6f 74 73 20 69 6e 20 61 53 65 74 50 32 5b  slots in aSetP2[
b850: 5d 20 75 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  ] used */..  /* 
b860: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
b870: 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f  is no ORDER BY o
b880: 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f  r LIMIT clause o
b890: 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e  n prior SELECTs.
b8a0: 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20    Only.  ** the 
b8b0: 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74  last (right-most
b8c0: 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20  ) SELECT in the 
b8d0: 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65 20  series may have 
b8e0: 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  an ORDER BY or L
b8f0: 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  IMIT..  */.  if(
b900: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69   p==0 || p->pPri
b910: 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  or==0 ){.    rc 
b920: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
b930: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
b940: 20 20 7d 0a 20 20 70 50 72 69 6f 72 20 3d 20 70    }.  pPrior = p
b950: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65  ->pPrior;.  asse
b960: 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67  rt( pPrior->pRig
b970: 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20 29  htmost!=pPrior )
b980: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
b990: 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d  or->pRightmost==
b9a0: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 29 3b  p->pRightmost );
b9b0: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
b9c0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
b9d0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
b9e0: 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20  Parse,"ORDER BY 
b9f0: 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
ba00: 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
ba10: 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
ba20: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
ba30: 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
ba40: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
ba50: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
ba60: 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c    if( pPrior->pL
ba70: 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
ba80: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
ba90: 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65  se,"LIMIT clause
baa0: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
bab0: 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
bac0: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
bad0: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
bae0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
baf0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
bb00: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
bb10: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
bb20: 65 20 61 20 76 61 6c 69 64 20 71 75 65 72 79 20  e a valid query 
bb30: 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c  engine.  If not,
bb40: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
bb50: 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
bb60: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
bb70: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
bb80: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a   ){.    rc = 1;.
bb90: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
bba0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
bbb0: 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
bbc0: 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70  destination temp
bbd0: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e  orary table if n
bbe0: 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20  ecessary.  */.  
bbf0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 56  if( eDest==SRT_V
bc00: 69 72 74 75 61 6c 54 61 62 20 29 7b 0a 20 20 20  irtualTab ){.   
bc10: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
bc20: 73 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  st );.    assert
bc30: 28 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66 28  ( nSetP2<sizeof(
bc40: 61 53 65 74 50 32 29 2f 73 69 7a 65 6f 66 28 61  aSetP2)/sizeof(a
bc50: 53 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20 20  SetP2[0]) );.   
bc60: 20 61 53 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b   aSetP2[nSetP2++
bc70: 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  ] = sqlite3VdbeA
bc80: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56  ddOp(v, OP_OpenV
bc90: 69 72 74 75 61 6c 2c 20 69 50 61 72 6d 2c 20 30  irtual, iParm, 0
bca0: 29 3b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 53  );.    eDest = S
bcb0: 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20  RT_Table;.  }.. 
bcc0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
bcd0: 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61  e for the left a
bce0: 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20  nd right SELECT 
bcf0: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
bd00: 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
bd10: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 73 77 69  >pOrderBy;.  swi
bd20: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
bd30: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b    case TK_ALL: {
bd40: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
bd50: 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
bd60: 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
bd70: 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20  r->pLimit );.   
bd80: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69       pPrior->pLi
bd90: 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
bda0: 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d  .        pPrior-
bdb0: 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f  >pOffset = p->pO
bdc0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 72  ffset;.        r
bdd0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
bde0: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
bdf0: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
be00: 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20  0, 0, 0, aff);. 
be10: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
be20: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
be30: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
be40: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
be50: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
be60: 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c  0;.        p->iL
be70: 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  imit = pPrior->i
be80: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70  Limit;.        p
be90: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69  ->iOffset = pPri
bea0: 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  or->iOffset;.   
beb0: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
bec0: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   0;.        p->p
bed0: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
bee0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
bef0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
bf00: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
bf10: 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20  0, 0, 0, aff);. 
bf20: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
bf30: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
bf40: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
bf50: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
bf60: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
bf70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bf80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
bf90: 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 4f       /* For UNIO
bfa0: 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20  N ALL ... ORDER 
bfb0: 42 59 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  BY fall through 
bfc0: 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65  to the next case
bfd0: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   */.    }.    ca
bfe0: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20  se TK_EXCEPT:.  
bff0: 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
c000: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69   {.      int uni
c010: 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72  onTab;    /* Cur
c020: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
c030: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
c040: 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  e holding result
c050: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   */.      int op
c060: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4f 6e   = 0;      /* On
c070: 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70  e of the SRT_ op
c080: 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c  erations to appl
c090: 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20  y to self */.   
c0a0: 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20     int priorOp; 
c0b0: 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20      /* The SRT_ 
c0c0: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70  operation to app
c0d0: 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65  ly to prior sele
c0e0: 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  cts */.      Exp
c0f0: 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66  r *pLimit, *pOff
c100: 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61  set; /* Saved va
c110: 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69  lues of p->nLimi
c120: 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74  t and p->nOffset
c130: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
c140: 64 72 3b 0a 0a 20 20 20 20 20 20 70 72 69 6f 72  dr;..      prior
c150: 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  Op = p->op==TK_A
c160: 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65 20 3a  LL ? SRT_Table :
c170: 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
c180: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 70 72 69    if( eDest==pri
c190: 6f 72 4f 70 20 26 26 20 70 4f 72 64 65 72 42 79  orOp && pOrderBy
c1a0: 3d 3d 30 20 26 26 20 21 70 2d 3e 70 4c 69 6d 69  ==0 && !p->pLimi
c1b0: 74 20 26 26 20 21 70 2d 3e 70 4f 66 66 73 65 74  t && !p->pOffset
c1c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
c1d0: 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
c1e0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
c1f0: 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
c200: 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
c210: 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
c220: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
c230: 75 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d  unionTab = iParm
c240: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c250: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c         /* We wil
c260: 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  l need to create
c270: 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61   our own tempora
c280: 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64  ry table to hold
c290: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
c2a0: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
c2b0: 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ults..        */
c2c0: 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
c2d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
c2e0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ++;.        if( 
c2f0: 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61 74 63  pOrderBy && matc
c300: 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e  hOrderbyToColumn
c310: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 72 64  (pParse, p, pOrd
c320: 65 72 42 79 2c 20 75 6e 69 6f 6e 54 61 62 2c 31  erBy, unionTab,1
c330: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
c340: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
c350: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
c360: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
c370: 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d  }.        addr =
c380: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c390: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74  p(v, OP_OpenVirt
c3a0: 75 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  ual, unionTab, 0
c3b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
c3c0: 72 69 6f 72 4f 70 3d 3d 53 52 54 5f 54 61 62 6c  riorOp==SRT_Tabl
c3d0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  e ){.          a
c3e0: 73 73 65 72 74 28 20 6e 53 65 74 50 32 3c 73 69  ssert( nSetP2<si
c3f0: 7a 65 6f 66 28 61 53 65 74 50 32 29 2f 73 69 7a  zeof(aSetP2)/siz
c400: 65 6f 66 28 61 53 65 74 50 32 5b 30 5d 29 20 29  eof(aSetP2[0]) )
c410: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 53 65 74  ;.          aSet
c420: 50 32 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d 20 61  P2[nSetP2++] = a
c430: 64 64 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ddr;.        }el
c440: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
c450: 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
c460: 6e 56 69 72 74 5b 30 5d 20 3d 3d 20 2d 31 20 29  nVirt[0] == -1 )
c470: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  ;.          p->a
c480: 64 64 72 4f 70 65 6e 56 69 72 74 5b 30 5d 20 3d  ddrOpenVirt[0] =
c490: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 20   addr;.         
c4a0: 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e   p->pRightmost->
c4b0: 75 73 65 73 56 69 72 74 20 3d 20 31 3b 0a 20 20  usesVirt = 1;.  
c4c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c4d0: 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64  createSortingInd
c4e0: 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f  ex(pParse, p, pO
c4f0: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20  rderBy);.       
c500: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
c510: 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  st );.      }.. 
c520: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
c530: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c540: 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20  ts to our left. 
c550: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
c560: 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
c570: 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20  OrderBy );.     
c580: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
c590: 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
c5a0: 6f 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69  or, priorOp, uni
c5b0: 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20  onTab, 0, 0, 0, 
c5c0: 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  aff);.      if( 
c5d0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
c5e0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
c5f0: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
c600: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
c610: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73  current SELECT s
c620: 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a  tatement.      *
c630: 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  /.      switch( 
c640: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20  p->op ){.       
c650: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
c660: 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65  :  op = SRT_Exce
c670: 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  pt;   break;.   
c680: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e        case TK_UN
c690: 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f  ION:   op = SRT_
c6a0: 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b  Union;    break;
c6b0: 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54  .         case T
c6c0: 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20  K_ALL:     op = 
c6d0: 53 52 54 5f 54 61 62 6c 65 3b 20 20 20 20 62 72  SRT_Table;    br
c6e0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
c6f0: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
c700: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65  ;.      p->pOrde
c710: 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rBy = 0;.      p
c720: 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
c730: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
c740: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
c750: 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
c760: 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
c770: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
c780: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
c790: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 6f 70  ct(pParse, p, op
c7a0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30  , unionTab, 0, 0
c7b0: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
c7c0: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
c7d0: 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  ior;.      p->pO
c7e0: 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
c7f0: 79 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  y;.      sqlite3
c800: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c  ExprDelete(p->pL
c810: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
c820: 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
c830: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
c840: 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
c850: 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d     p->iLimit = -
c860: 31 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  1;.      p->iOff
c870: 73 65 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  set = -1;.      
c880: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
c890: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
c8a0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
c8b0: 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ...      /* Conv
c8c0: 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20  ert the data in 
c8d0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
c8e0: 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ble into whateve
c8f0: 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  r form.      ** 
c900: 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75  it is that we cu
c910: 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20  rrently need..  
c920: 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20      */      .   
c930: 20 20 20 69 66 28 20 65 44 65 73 74 21 3d 70 72     if( eDest!=pr
c940: 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61  iorOp || unionTa
c950: 62 21 3d 69 50 61 72 6d 20 29 7b 0a 20 20 20 20  b!=iParm ){.    
c960: 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
c970: 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
c980: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
c990: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
c9a0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
c9b0: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
c9c0: 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74           generat
c9d0: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
c9e0: 72 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73  rse, 0, p->pELis
c9f0: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
ca00: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
ca10: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
ca20: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
ca30: 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
ca40: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
ca50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ca60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ca70: 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62  Rewind, unionTab
ca80: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
ca90: 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
caa0: 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
cab0: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74   p);.        iSt
cac0: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
cad0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
cae0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65  .        rc = se
caf0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
cb00: 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
cb10: 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d  st, unionTab, p-
cb20: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a  >pEList->nExpr,.
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72               pOr
cb50: 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74  derBy, -1, eDest
cb60: 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20  , iParm, .      
cb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb80: 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42         iCont, iB
cb90: 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  reak, 0);.      
cba0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
cbb0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
cbc0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
cbd0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
cbe0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cbf0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
cc00: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
cc10: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
cc20: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
cc30: 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61  OP_Next, unionTa
cc40: 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20  b, iStart);.    
cc50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
cc60: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
cc70: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
cc80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cc90: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e  (v, OP_Close, un
cca0: 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
ccb0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
ccc0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ccd0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a  TK_INTERSECT: {.
cce0: 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20        int tab1, 
ccf0: 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20  tab2;.      int 
cd00: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
cd10: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70  Start;.      Exp
cd20: 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66  r *pLimit, *pOff
cd30: 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  set;.      int a
cd40: 64 64 72 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ddr;..      /* I
cd50: 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
cd60: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
cd70: 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
cd80: 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
cd90: 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
cda0: 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
cdb0: 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
cdc0: 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
cdd0: 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
cde0: 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
cdf0: 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
ce00: 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20  */.      tab1 = 
ce10: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
ce20: 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
ce30: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
ce40: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
ce50: 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  && matchOrderbyT
ce60: 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 70  oColumn(pParse,p
ce70: 2c 70 4f 72 64 65 72 42 79 2c 74 61 62 31 2c 31  ,pOrderBy,tab1,1
ce80: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
ce90: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
cea0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
ceb0: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
cec0: 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49    createSortingI
ced0: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20  ndex(pParse, p, 
cee0: 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20 20 20  pOrderBy);..    
cef0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
cf00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cf10: 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 74 61 62  OpenVirtual, tab
cf20: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  1, 0);.      ass
cf30: 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
cf40: 56 69 72 74 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b  Virt[0] == -1 );
cf50: 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
cf60: 65 6e 56 69 72 74 5b 30 5d 20 3d 20 61 64 64 72  enVirt[0] = addr
cf70: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68  ;.      p->pRigh
cf80: 74 6d 6f 73 74 2d 3e 75 73 65 73 56 69 72 74 20  tmost->usesVirt 
cf90: 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 1;.      asser
cfa0: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
cfb0: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
cfc0: 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75  he SELECTs to ou
cfd0: 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70  r left into temp
cfe0: 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
cff0: 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  1"..      */.   
d000: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
d010: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
d020: 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c  rior, SRT_Union,
d030: 20 74 61 62 31 2c 20 30 2c 20 30 2c 20 30 2c 20   tab1, 0, 0, 0, 
d040: 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  aff);.      if( 
d050: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
d060: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
d070: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
d080: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
d090: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
d0a0: 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
d0b0: 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20  ble "tab2".     
d0c0: 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d   */.      addr =
d0d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d0e0: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74  p(v, OP_OpenVirt
d0f0: 75 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ual, tab2, 0);. 
d100: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
d110: 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 31 5d 20  addrOpenVirt[1] 
d120: 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
d130: 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 31  ->addrOpenVirt[1
d140: 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
d150: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
d160: 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
d170: 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
d180: 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
d190: 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
d1a0: 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
d1b0: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
d1c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d1d0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
d1e0: 20 70 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74   p, SRT_Union, t
d1f0: 61 62 32 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  ab2, 0, 0, 0, af
d200: 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  f);.      p->pPr
d210: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
d220: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
d230: 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29  elete(p->pLimit)
d240: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
d250: 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
d260: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
d270: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66  Offset;.      if
d280: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
d290: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
d2a0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
d2b0: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
d2c0: 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74  e code to take t
d2d0: 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  he intersection 
d2e0: 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f  of the two tempo
d2f0: 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61  rary.      ** ta
d300: 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bles..      */. 
d310: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
d320: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
d330: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
d340: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
d350: 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
d360: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
d370: 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
d380: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65      }.      iBre
d390: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
d3a0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
d3b0: 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
d3c0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
d3d0: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
d3e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d3f0: 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20  P_Rewind, tab1, 
d400: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 63  iBreak);.      c
d410: 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
d420: 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 29 3b  ters(pParse, p);
d430: 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20  .      iStart = 
d440: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d450: 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74  (v, OP_RowKey, t
d460: 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ab1, 0);.      s
d470: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d480: 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
d490: 74 61 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  tab2, iCont);.  
d4a0: 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49      rc = selectI
d4b0: 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
d4c0: 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74   p, p->pEList, t
d4d0: 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ab1, p->pEList->
d4e0: 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d500: 20 20 20 20 70 4f 72 64 65 72 42 79 2c 20 2d 31      pOrderBy, -1
d510: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
d520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
d540: 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b  ont, iBreak, 0);
d550: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
d560: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
d570: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
d580: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
d590: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
d5a0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
d5b0: 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
d5c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d5d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
d5e0: 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74  xt, tab1, iStart
d5f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d600: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
d610: 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
d620: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d630: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
d640: 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
d650: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d660: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  p(v, OP_Close, t
d670: 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  ab1, 0);.      b
d680: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
d690: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
d6a0: 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74  all SELECTs in t
d6b0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76  he statement hav
d6c0: 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
d6d0: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20  r of elements.  
d6e0: 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75  ** in their resu
d6f0: 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20  lt sets..  */.  
d700: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
d710: 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c  t && pPrior->pEL
d720: 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ist );.  if( p->
d730: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70  pEList->nExpr!=p
d740: 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Prior->pEList->n
d750: 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Expr ){.    sqli
d760: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
d770: 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20  se, "SELECTs to 
d780: 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
d790: 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20  ht of %s".      
d7a0: 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68  " do not have th
d7b0: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
d7c0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22   result columns"
d7d0: 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
d7e0: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
d7f0: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
d800: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
d810: 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
d820: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
d830: 6e 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  ns in temporary 
d840: 74 61 62 6c 65 73 0a 20 20 2a 2f 0a 20 20 6e 43  tables.  */.  nC
d850: 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
d860: 6e 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20  nExpr;.  while( 
d870: 6e 53 65 74 50 32 20 29 7b 0a 20 20 20 20 73 71  nSetP2 ){.    sq
d880: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
d890: 32 28 76 2c 20 61 53 65 74 50 32 5b 2d 2d 6e 53  2(v, aSetP2[--nS
d8a0: 65 74 50 32 5d 2c 20 6e 43 6f 6c 29 3b 0a 20 20  etP2], nCol);.  
d8b0: 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
d8c0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
d8d0: 63 65 73 20 75 73 65 64 20 62 79 20 65 69 74 68  ces used by eith
d8e0: 65 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  er the ORDER BY 
d8f0: 63 6c 61 75 73 65 20 6f 72 0a 20 20 2a 2a 20 62  clause or.  ** b
d900: 79 20 61 6e 79 20 74 65 6d 70 6f 72 61 72 79 20  y any temporary 
d910: 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f  tables needed to
d920: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
d930: 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
d940: 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20    ** Attach the 
d950: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
d960: 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61  e to all tempora
d970: 72 79 20 74 61 62 6c 65 73 2e 20 20 49 6e 76 6f  ry tables.  Invo
d980: 6b 65 20 74 68 65 0a 20 20 2a 2a 20 4f 52 44 45  ke the.  ** ORDE
d990: 52 20 42 59 20 70 72 6f 63 65 73 73 69 6e 67 20  R BY processing 
d9a0: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
d9b0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
d9c0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73    **.  ** This s
d9d0: 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79  ection is run by
d9e0: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
d9f0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
da00: 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45   only..  ** SELE
da10: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
da20: 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73   the left always
da30: 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e   skip this part.
da40: 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74    The right-most
da50: 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67  .  ** SELECT mig
da60: 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69  ht also skip thi
da70: 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73  s part if it has
da80: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
da90: 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20  use and.  ** no 
daa0: 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20  temp tables are 
dab0: 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20  required..  */. 
dac0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 7c 7c   if( pOrderBy ||
dad0: 20 70 2d 3e 75 73 65 73 56 69 72 74 20 29 7b 0a   p->usesVirt ){.
dae0: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db00: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
db10: 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f  r */.    KeyInfo
db20: 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20   *pKeyInfo;     
db30: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
db40: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
db50: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
db60: 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  */.    Select *p
db70: 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
db80: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
db90: 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45  ing through SELE
dba0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  CT statements */
dbb0: 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61  .    CollSeq **a
dbc0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 43 6f 6c 6c 53  pColl;.    CollS
dbd0: 65 71 20 2a 2a 61 43 6f 70 79 3b 0a 0a 20 20 20  eq **aCopy;..   
dbe0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
dbf0: 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20  htmost==p );.   
dc00: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
dc10: 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  teMalloc(sizeof(
dc20: 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a  *pKeyInfo)+nCol*
dc30: 32 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  2*sizeof(CollSeq
dc40: 2a 29 20 2b 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  *) + nCol);.    
dc50: 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b  if( !pKeyInfo ){
dc60: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
dc70: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
dc80: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
dc90: 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  t_end;.    }..  
dca0: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20    pKeyInfo->enc 
dcb0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e  = pParse->db->en
dcc0: 63 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d  c;.    pKeyInfo-
dcd0: 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a  >nField = nCol;.
dce0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70  .    for(i=0, ap
dcf0: 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61  Coll=pKeyInfo->a
dd00: 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  Coll; i<nCol; i+
dd10: 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20  +, apColl++){.  
dd20: 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75      *apColl = mu
dd30: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
dd40: 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
dd50: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70        if( 0==*ap
dd60: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
dd70: 2a 61 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65  *apColl = pParse
dd80: 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
dd90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
dda0: 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b      for(pLoop=p;
ddb0: 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
ddc0: 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  oop->pPrior){.  
ddd0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32      for(i=0; i<2
dde0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
ddf0: 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70  int addr = pLoop
de00: 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 69  ->addrOpenVirt[i
de10: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ];.        if( a
de20: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ddr<0 ){.       
de30: 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20     /* If [0] is 
de40: 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20  unused then [1] 
de50: 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20  is also unused. 
de60: 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20   So we can.     
de70: 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
de80: 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73  afely abort as s
de90: 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74  oon as the first
dea0: 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20   unused slot is 
deb0: 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  found */.       
dec0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
ded0: 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 31  ->addrOpenVirt[1
dee0: 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ]<0 );.         
def0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
df00: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
df10: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
df20: 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20   addr, nCol);.  
df30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
df40: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
df50: 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  r, (char*)pKeyIn
df60: 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P3_KEYINFO);
df70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
df80: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
df90: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
dfa0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
dfb0: 70 4f 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42  pOTerm = pOrderB
dfc0: 79 2d 3e 61 3b 0a 20 20 20 20 20 20 69 6e 74 20  y->a;.      int 
dfd0: 6e 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  nExpr = pOrderBy
dfe0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->nExpr;.      i
dff0: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 75  nt addr;.      u
e000: 38 20 2a 70 53 6f 72 74 4f 72 64 65 72 3b 0a 0a  8 *pSortOrder;..
e010: 20 20 20 20 20 20 61 43 6f 70 79 20 3d 20 28 43        aCopy = (C
e020: 6f 6c 6c 53 65 71 2a 2a 29 26 70 4b 65 79 49 6e  ollSeq**)&pKeyIn
e030: 66 6f 5b 31 5d 3b 0a 20 20 20 20 20 20 70 53 6f  fo[1];.      pSo
e040: 72 74 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e  rtOrder = pKeyIn
e050: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  fo->aSortOrder =
e060: 20 28 75 38 2a 29 26 61 43 6f 70 79 5b 6e 45 78   (u8*)&aCopy[nEx
e070: 70 72 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  pr];.      memcp
e080: 79 28 61 43 6f 70 79 2c 20 70 4b 65 79 49 6e 66  y(aCopy, pKeyInf
e090: 6f 2d 3e 61 43 6f 6c 6c 2c 20 6e 43 6f 6c 2a 73  o->aColl, nCol*s
e0a0: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29  izeof(CollSeq*))
e0b0: 3b 0a 20 20 20 20 20 20 61 70 43 6f 6c 6c 20 3d  ;.      apColl =
e0c0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
e0d0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
e0e0: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
e0f0: 70 72 3b 20 69 2b 2b 2c 20 70 4f 54 65 72 6d 2b  pr; i++, pOTerm+
e100: 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 2c 20 70 53 6f  +, apColl++, pSo
e110: 72 74 4f 72 64 65 72 2b 2b 29 7b 0a 20 20 20 20  rtOrder++){.    
e120: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
e130: 3d 20 70 4f 54 65 72 6d 2d 3e 70 45 78 70 72 3b  = pOTerm->pExpr;
e140: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
e150: 4e 61 6d 65 20 3d 20 70 4f 54 65 72 6d 2d 3e 7a  Name = pOTerm->z
e160: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 73  Name;.        as
e170: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
e180: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
e190: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 6e 43 6f  xpr->iColumn<nCo
e1a0: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  l );.        if(
e1b0: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20   zName ){.      
e1c0: 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 73 71      *apColl = sq
e1d0: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
e1e0: 65 71 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  eq(pParse, zName
e1f0: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , -1);.        }
e200: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
e210: 2a 61 70 43 6f 6c 6c 20 3d 20 61 43 6f 70 79 5b  *apColl = aCopy[
e220: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b  pExpr->iColumn];
e230: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e240: 20 20 20 2a 70 53 6f 72 74 4f 72 64 65 72 20 3d     *pSortOrder =
e250: 20 70 4f 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64   pOTerm->sortOrd
e260: 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  er;.      }.    
e270: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
e280: 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20  ghtmost==p );.  
e290: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
e2a0: 64 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 3e 3d  ddrOpenVirt[2]>=
e2b0: 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  0 );.      addr 
e2c0: 3d 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72  = p->addrOpenVir
e2d0: 74 5b 32 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  t[2];.      sqli
e2e0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
e2f0: 76 2c 20 61 64 64 72 2c 20 70 2d 3e 70 45 4c 69  v, addr, p->pELi
e300: 73 74 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a 20 20  st->nExpr+2);.  
e310: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
e320: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
e330: 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
e340: 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P3_KEYINFO_HAN
e350: 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 70 4b 65  DOFF);.      pKe
e360: 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 20  yInfo = 0;.     
e370: 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
e380: 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20  l(pParse, p, v, 
e390: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
e3a0: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b  , eDest, iParm);
e3b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
e3c0: 74 65 46 72 65 65 28 70 4b 65 79 49 6e 66 6f 29  teFree(pKeyInfo)
e3d0: 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c  ;.  }..multi_sel
e3e0: 65 63 74 5f 65 6e 64 3a 0a 20 20 72 65 74 75 72  ect_end:.  retur
e3f0: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
e400: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
e410: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
e420: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e430: 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
e440: 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   Scan through th
e450: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
e460: 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65  pr.  Replace eve
e470: 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a  ry reference to.
e480: 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ** a column in t
e490: 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62  able number iTab
e4a0: 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  le with a copy o
e4b0: 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  f the iColumn-th
e4c0: 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c  .** entry in pEL
e4d0: 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65  ist.  (But leave
e4e0: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
e4f0: 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20  he ROWID column 
e500: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a  .** unchanged.).
e510: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
e520: 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ne is part of th
e530: 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f  e flattening pro
e540: 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75  cedure.  A subqu
e550: 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73  ery.** whose res
e560: 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e  ult set is defin
e570: 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70  ed by pEList app
e580: 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e  ears as entry in
e590: 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   the.** FROM cla
e5a0: 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
e5b0: 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44  such that the VD
e5c0: 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e  BE cursor assign
e5d0: 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f  ed to that.** FO
e5e0: 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20  RM clause entry 
e5f0: 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73  is iTable.  This
e600: 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68   routine make th
e610: 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20  e necessary .** 
e620: 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72  changes to pExpr
e630: 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65   so that it refe
e640: 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  rs directly to t
e650: 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a  he source table.
e660: 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
e670: 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65  ry rather the re
e680: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
e690: 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61  subquery..*/.sta
e6a0: 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
e6b0: 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 2a  prList(ExprList*
e6c0: 2c 69 6e 74 2c 45 78 70 72 4c 69 73 74 2a 29 3b  ,int,ExprList*);
e6d0: 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63    /* Forward Dec
e6e0: 6c 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  l */.static void
e6f0: 20 73 75 62 73 74 53 65 6c 65 63 74 28 53 65 6c   substSelect(Sel
e700: 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72  ect *, int, Expr
e710: 4c 69 73 74 20 2a 29 3b 20 20 2f 2a 20 46 6f 72  List *);  /* For
e720: 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61  ward Decl */.sta
e730: 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
e740: 70 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  pr(Expr *pExpr, 
e750: 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72  int iTable, Expr
e760: 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20  List *pEList){. 
e770: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
e780: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45  return;.  if( pE
e790: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
e7a0: 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
e7b0: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20  ble==iTable ){. 
e7c0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
e7d0: 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
e7e0: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
e7f0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NULL;.    }else{
e800: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
e810: 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  w;.      assert(
e820: 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45   pEList!=0 && pE
e830: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c  xpr->iColumn<pEL
e840: 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
e850: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
e860: 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70  r->pLeft==0 && p
e870: 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
e880: 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d  && pExpr->pList=
e890: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
e8a0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78   = pEList->a[pEx
e8b0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
e8c0: 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
e8d0: 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20  ( pNew!=0 );.   
e8e0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70     pExpr->op = p
e8f0: 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 61  New->op;.      a
e900: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
e910: 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  eft==0 );.      
e920: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73  pExpr->pLeft = s
e930: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4e  qlite3ExprDup(pN
e940: 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  ew->pLeft);.    
e950: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
e960: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
e970: 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
e980: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
e990: 75 70 28 70 4e 65 77 2d 3e 70 52 69 67 68 74 29  up(pNew->pRight)
e9a0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e9b0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20  pExpr->pList==0 
e9c0: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
e9d0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
e9e0: 78 70 72 4c 69 73 74 44 75 70 28 70 4e 65 77 2d  xprListDup(pNew-
e9f0: 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70  >pList);.      p
ea00: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
ea10: 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  New->iTable;.   
ea20: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
ea30: 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d  n = pNew->iColum
ea40: 6e 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  n;.      pExpr->
ea50: 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67  iAgg = pNew->iAg
ea60: 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  g;.      sqlite3
ea70: 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70 72  TokenCopy(&pExpr
ea80: 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e  ->token, &pNew->
ea90: 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71  token);.      sq
eaa0: 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26  lite3TokenCopy(&
eab0: 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e  pExpr->span, &pN
eac0: 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20  ew->span);.     
ead0: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
eae0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
eaf0: 75 70 28 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74  up(pNew->pSelect
eb00: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
eb10: 66 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 66 6c  flags = pNew->fl
eb20: 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ags;.    }.  }el
eb30: 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70  se{.    substExp
eb40: 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  r(pExpr->pLeft, 
eb50: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
eb60: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
eb70: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54  Expr->pRight, iT
eb80: 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
eb90: 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 70     substSelect(p
eba0: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69  Expr->pSelect, i
ebb0: 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
ebc0: 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
ebd0: 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20  t(pExpr->pList, 
ebe0: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
ebf0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
ec00: 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
ec10: 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74  (ExprList *pList
ec20: 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78  , int iTable, Ex
ec30: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b  prList *pEList){
ec40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
ec50: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
ec60: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
ec70: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
ec80: 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70  +){.    substExp
ec90: 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  r(pList->a[i].pE
eca0: 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  xpr, iTable, pEL
ecb0: 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  ist);.  }.}.stat
ecc0: 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
ecd0: 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69  ect(Select *p, i
ece0: 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c  nt iTable, ExprL
ecf0: 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20  ist *pEList){.  
ed00: 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b  if( !p ) return;
ed10: 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
ed20: 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62  (p->pEList, iTab
ed30: 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
ed40: 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
ed50: 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c 65  pGroupBy, iTable
ed60: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
ed70: 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f  stExprList(p->pO
ed80: 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20  rderBy, iTable, 
ed90: 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
eda0: 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c  Expr(p->pHaving,
edb0: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
edc0: 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 70 2d  ;.  substExpr(p-
edd0: 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c  >pWhere, iTable,
ede0: 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 23 65 6e 64   pEList);.}.#end
edf0: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
ee00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
ee10: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
ee20: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
ee30: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ee40: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
ee50: 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20  tten subqueries 
ee60: 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65 65  in order to spee
ee70: 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20  d.** execution. 
ee80: 20 49 74 20 72 65 74 75 72 6e 73 20 31 20 69 66   It returns 1 if
ee90: 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65   it makes change
eea0: 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c  s and 0 if no fl
eeb0: 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75  attening.** occu
eec0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64  rs..**.** To und
eed0: 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63  erstand the conc
eee0: 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e  ept of flattenin
eef0: 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20  g, consider the 
ef00: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65  following.** que
ef10: 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ry:.**.**     SE
ef20: 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c  LECT a FROM (SEL
ef30: 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
ef40: 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
ef50: 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a  ) WHERE a>5.**.*
ef60: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61  * The default wa
ef70: 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  y of implementin
ef80: 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20  g this query is 
ef90: 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a  to execute the.*
efa0: 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74  * subquery first
efb0: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
efc0: 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70  esults in a temp
efd0: 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65  orary table, the
efe0: 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74  n.** run the out
eff0: 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74  er query on that
f000: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
f010: 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73  .  This requires
f020: 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f   two.** passes o
f030: 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46  ver the data.  F
f040: 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61  urthermore, beca
f050: 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  use the temporar
f060: 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e  y table.** has n
f070: 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57  o indices, the W
f080: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74  HERE clause on t
f090: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63  he outer query c
f0a0: 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69  annot be.** opti
f0b0: 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mized..**.** Thi
f0c0: 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
f0d0: 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75  ts to rewrite qu
f0e0: 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68  eries such as th
f0f0: 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20  e above into.** 
f100: 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65  a single flat se
f110: 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a  lect, like this:
f120: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
f130: 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
f140: 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41  t1 WHERE z<100 A
f150: 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  ND a>5.**.** The
f160: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
f170: 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66 69  for this simpifi
f180: 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65  cation gives the
f190: 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20   same result.** 
f1a0: 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20  but only has to 
f1b0: 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e  scan the data on
f1c0: 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65  ce.  And because
f1d0: 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a   indices might .
f1e0: 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20  ** exist on the 
f1f0: 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70  table t1, a comp
f200: 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65  lete scan of the
f210: 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a   data might be.*
f220: 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a  * avoided..**.**
f230: 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f   Flattening is o
f240: 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66  nly attempted if
f250: 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
f260: 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
f270: 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65  **.**   (1)  The
f280: 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
f290: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
f2a0: 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67   not both use ag
f2b0: 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
f2c0: 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75    (2)  The subqu
f2d0: 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
f2e0: 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f  gregate or the o
f2f0: 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
f300: 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
f310: 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75    (3)  The subqu
f320: 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72  ery is not the r
f330: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
f340: 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69  a left outer joi
f350: 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  n, or.**        
f360: 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
f370: 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a 6f 69  not itself a joi
f380: 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33 30 36  n.  (Ticket #306
f390: 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54  ).**.**   (4)  T
f3a0: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
f3b0: 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74  ot DISTINCT or t
f3c0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
f3d0: 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
f3e0: 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20 73  .**   (5)  The s
f3f0: 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
f400: 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f  ISTINCT or the o
f410: 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
f420: 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
f430: 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
f440: 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73  .**   (6)  The s
f450: 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
f460: 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
f470: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
f480: 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
f490: 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a      DISTINCT..**
f4a0: 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73  .**   (7)  The s
f4b0: 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52  ubquery has a FR
f4c0: 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
f4d0: 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62 71     (8)  The subq
f4e0: 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
f4f0: 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
f500: 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
f510: 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
f520: 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71 75    (9)  The subqu
f530: 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
f540: 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
f550: 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
f560: 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
f570: 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
f580: 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73 75  **  (10)  The su
f590: 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
f5a0: 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f  use aggregates o
f5b0: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
f5c0: 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20  y does not.**   
f5d0: 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a       use LIMIT..
f5e0: 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65  **.**  (11)  The
f5f0: 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
f600: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
f610: 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f   not both have O
f620: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e  RDER BY clauses.
f630: 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20 54 68  .**.**  (12)  Th
f640: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
f650: 74 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  t the right term
f660: 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
f670: 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a 2a 20   JOIN or the.** 
f680: 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20         subquery 
f690: 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  has no WHERE cla
f6a0: 75 73 65 2e 20 20 28 61 64 64 65 64 20 62 79 20  use.  (added by 
f6b0: 74 69 63 6b 65 74 20 23 33 35 30 29 0a 2a 2a 0a  ticket #350).**.
f6c0: 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
f6d0: 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
f6e0: 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
f6f0: 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
f700: 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
f710: 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
f720: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
f730: 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
f740: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
f750: 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
f760: 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73  s and subqueryIs
f770: 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
f780: 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
f790: 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
f7a0: 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
f7b0: 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
f7c0: 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
f7d0: 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
f7e0: 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20  eturns 0..** If 
f7f0: 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74  flattening is at
f800: 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75  tempted this rou
f810: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a  tine returns 1..
f820: 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
f830: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
f840: 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20  ysis must occur 
f850: 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65  on both the oute
f860: 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74  r query and.** t
f870: 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f  he subquery befo
f880: 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
f890: 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  runs..*/.static 
f8a0: 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75  int flattenSubqu
f8b0: 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
f8c0: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54  arse,       /* T
f8d0: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
f8e0: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
f8f0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
f900: 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75  The parent or ou
f910: 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  ter SELECT state
f920: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  ment */.  int iF
f930: 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rom,           /
f940: 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53  * Index in p->pS
f950: 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69  rc->a[] of the i
f960: 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f  nner subquery */
f970: 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20  .  int isAgg,   
f980: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
f990: 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  if outer SELECT 
f9a0: 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
f9b0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  unctions */.  in
f9c0: 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  t subqueryIsAgg 
f9d0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
f9e0: 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
f9f0: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
fa00: 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  ons */.){.  Sele
fa10: 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20  ct *pSub;       
fa20: 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  /* The inner que
fa30: 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22  ry or "subquery"
fa40: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
fa50: 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
fa60: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
fa70: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
fa80: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
fa90: 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  ubSrc;   /* The 
faa0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
fab0: 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
fac0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
fad0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  ;    /* The resu
fae0: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75  lt set of the ou
faf0: 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
fb00: 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  nt iParent;     
fb10: 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
fb20: 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
fb30: 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20  pSub result set 
fb40: 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
fb50: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
fb60: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
fb70: 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ter */.  Expr *p
fb80: 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
fb90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
fba0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
fbb0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
fbc0: 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d  t_item *pSubitem
fbd0: 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75  ;   /* The subqu
fbe0: 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  ery */..  /* Che
fbf0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61  ck to see if fla
fc00: 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
fc10: 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20  tted.  Return 0 
fc20: 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69  if not..  */.  i
fc30: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
fc40: 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
fc50: 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
fc60: 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30  pSrc && iFrom>=0
fc70: 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e   && iFrom<pSrc->
fc80: 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74  nSrc );.  pSubit
fc90: 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46  em = &pSrc->a[iF
fca0: 72 6f 6d 5d 3b 0a 20 20 70 53 75 62 20 3d 20 70  rom];.  pSub = p
fcb0: 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
fcc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
fcd0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41  !=0 );.  if( isA
fce0: 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49 73  gg && subqueryIs
fcf0: 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Agg ) return 0;.
fd00: 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
fd10: 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72  Agg && pSrc->nSr
fd20: 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  c>1 ) return 0;.
fd30: 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
fd40: 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
fd50: 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 69  ( pSubSrc );.  i
fd60: 66 28 20 28 70 53 75 62 2d 3e 70 4c 69 6d 69 74  f( (pSub->pLimit
fd70: 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 29 20 7c   && p->pLimit) |
fd80: 7c 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20  | pSub->pOffset 
fd90: 7c 7c 20 0a 20 20 20 20 20 20 28 70 53 75 62 2d  || .      (pSub-
fda0: 3e 70 4c 69 6d 69 74 20 26 26 20 69 73 41 67 67  >pLimit && isAgg
fdb0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
fdc0: 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
fdd0: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
fde0: 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 69 73 44  .  if( pSub->isD
fdf0: 69 73 74 69 6e 63 74 20 26 26 20 28 70 53 72 63  istinct && (pSrc
fe00: 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67  ->nSrc>1 || isAg
fe10: 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  g) ){.     retur
fe20: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
fe30: 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26 20  ->isDistinct && 
fe40: 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20  subqueryIsAgg ) 
fe50: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
fe60: 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70  p->pOrderBy && p
fe70: 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20  Sub->pOrderBy ) 
fe80: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
fe90: 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20  Restriction 3:  
fea0: 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
feb0: 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20  is a join, make 
fec0: 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
fed0: 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75  y is .  ** not u
fee0: 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74  sed as the right
fef0: 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f   operand of an o
ff00: 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d  uter join.  Exam
ff10: 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
ff20: 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c  .  ** is not all
ff30: 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owed:.  **.  ** 
ff40: 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20          t1 LEFT 
ff50: 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a  OUTER JOIN (t2 J
ff60: 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a  OIN t3).  **.  *
ff70: 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20  * If we flatten 
ff80: 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f  the above, we wo
ff90: 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a  uld get.  **.  *
ffa0: 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45  *         (t1 LE
ffb0: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32  FT OUTER JOIN t2
ffc0: 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20  ) JOIN t3.  **. 
ffd0: 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74   ** which is not
ffe0: 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65   at all the same
fff0: 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69   thing..  */.  i
10000 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
10010 3e 31 20 26 26 20 69 46 72 6f 6d 3e 30 20 26 26  >1 && iFrom>0 &&
10020 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d   (pSrc->a[iFrom-
10030 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  1].jointype & JT
10040 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20  _OUTER)!=0 ){.  
10050 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
10060 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  .  /* Restrictio
10070 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75  n 12:  If the su
10080 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69  bquery is the ri
10090 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
100a0 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a   left outer.  **
100b0 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
100c0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
100d0 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
100e0 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70  e..  ** An examp
100f0 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20  les of why this 
10100 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
10110 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
10120 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
10130 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  JOIN (SELECT * F
10140 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e  ROM t2 WHERE t2.
10150 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  x>0).  **.  ** I
10160 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
10170 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
10180 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
10190 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
101a0 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57  OUTER JOIN t2) W
101b0 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a  HERE t2.x>0.  **
101c0 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32  .  ** But the t2
101d0 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61  .x>0 test will a
101e0 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20  lways fail on a 
101f0 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20  NULL row of t2, 
10200 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63  which.  ** effec
10210 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20  tively converts 
10220 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69  the OUTER JOIN i
10230 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49  nto an INNER JOI
10240 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 46  N..  */.  if( iF
10250 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d 3e  rom>0 && (pSrc->
10260 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74  a[iFrom-1].joint
10270 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
10280 3d 30 20 0a 20 20 20 20 20 20 26 26 20 70 53 75  =0 .      && pSu
10290 62 2d 3e 70 57 68 65 72 65 21 3d 30 20 29 7b 0a  b->pWhere!=0 ){.
102a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
102b0 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  }..  /* If we re
102c0 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
102d0 69 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e  it means flatten
102e0 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
102f0 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 46   for the.  ** iF
10300 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20  rom-th entry of 
10310 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
10320 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
10330 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d  ry..  */..  /* M
10340 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 46  ove all of the F
10350 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  ROM elements of 
10360 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
10370 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46  o the.  ** the F
10380 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
10390 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20  e outer query.  
103a0 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69  Before doing thi
103b0 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a  s, remember.  **
103c0 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
103d0 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69  er for the origi
103e0 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20  nal outer query 
103f0 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a  FROM element in.
10400 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54    ** iParent.  T
10410 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f  he iParent curso
10420 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  r will never be 
10430 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e  used.  Subsequen
10440 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c  t code.  ** will
10450 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e   scan expression
10460 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50  s looking for iP
10470 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73  arent references
10480 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a   and replace.  *
10490 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63  * those referenc
104a0 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69  es with expressi
104b0 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65  ons that resolve
104c0 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79   to the subquery
104d0 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65   FROM.  ** eleme
104e0 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63  nts we are now c
104f0 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a  opying in..  */.
10500 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62    iParent = pSub
10510 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  item->iCursor;. 
10520 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53   {.    int nSubS
10530 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
10540 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69 6e  rc;.    int join
10550 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
10560 3e 6a 6f 69 6e 74 79 70 65 3b 0a 0a 20 20 20 20  >jointype;..    
10570 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
10580 6c 65 28 30 2c 20 70 53 75 62 69 74 65 6d 2d 3e  le(0, pSubitem->
10590 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
105a0 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e  eFree(pSubitem->
105b0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
105c0 73 71 6c 69 74 65 46 72 65 65 28 70 53 75 62 69  sqliteFree(pSubi
105d0 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
105e0 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 75 62   sqliteFree(pSub
105f0 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  item->zAlias);. 
10600 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
10610 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78   ){.      int ex
10620 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d 20  tra = nSubSrc - 
10630 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  1;.      for(i=1
10640 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
10650 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 20  ){.        pSrc 
10660 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
10670 41 70 70 65 6e 64 28 70 53 72 63 2c 20 30 2c 20  Append(pSrc, 0, 
10680 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
10690 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63    p->pSrc = pSrc
106a0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53  ;.      for(i=pS
106b0 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65 78  rc->nSrc-1; i-ex
106c0 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29  tra>=iFrom; i--)
106d0 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e  {.        pSrc->
106e0 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69  a[i] = pSrc->a[i
106f0 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20 20 7d  -extra];.      }
10700 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
10710 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69  =0; i<nSubSrc; i
10720 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d  ++){.      pSrc-
10730 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53  >a[i+iFrom] = pS
10740 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  ubSrc->a[i];.   
10750 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53     memset(&pSubS
10760 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a  rc->a[i], 0, siz
10770 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69  eof(pSubSrc->a[i
10780 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ]));.    }.    p
10790 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2b 6e 53 75  Src->a[iFrom+nSu
107a0 62 53 72 63 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  bSrc-1].jointype
107b0 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 7d   = jointype;.  }
107c0 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e  ..  /* Now begin
107d0 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75   substituting su
107e0 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65  bquery result se
107f0 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  t expressions fo
10800 72 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  r .  ** referenc
10810 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e  es to the iParen
10820 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  t in the outer q
10830 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a  uery..  ** .  **
10840 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
10850 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35   **   SELECT a+5
10860 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c  , b*10 FROM (SEL
10870 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b  ECT x*3 AS a, y+
10880 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29  10 AS b FROM t1)
10890 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a 2a   WHERE a>b;.  **
108a0 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
108b0 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
108c0 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
108d0 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
108e0 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20 20        /.  **    
108f0 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
10900 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65  ______ outer que
10910 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ry _____________
10920 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10930 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  _/.  **.  ** We 
10940 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78  look at every ex
10950 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
10960 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20  outer query and 
10970 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
10980 65 65 0a 20 20 2a 2a 20 22 61 22 20 77 65 20 73  ee.  ** "a" we s
10990 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20  ubstitute "x*3" 
109a0 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
109b0 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75  we see "b" we su
109c0 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e  bstitute "y+10".
109d0 0a 20 20 2a 2f 0a 20 20 73 75 62 73 74 45 78 70  .  */.  substExp
109e0 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
109f0 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
10a00 70 45 4c 69 73 74 29 3b 0a 20 20 70 4c 69 73 74  pEList);.  pList
10a10 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
10a20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
10a30 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
10a40 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a     Expr *pExpr;.
10a50 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
10a60 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20  [i].zName==0 && 
10a70 28 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e  (pExpr = pList->
10a80 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61  a[i].pExpr)->spa
10a90 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  n.z!=0 ){.      
10aa0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
10ab0 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  e = sqliteStrNDu
10ac0 70 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c  p(pExpr->span.z,
10ad0 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b   pExpr->span.n);
10ae0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
10af0 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73 75   isAgg ){.    su
10b00 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
10b10 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74  GroupBy, iParent
10b20 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
10b30 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
10b40 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
10b50 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
10b60 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  );.  }.  if( pSu
10b70 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
10b80 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
10b90 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
10ba0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
10bb0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
10bc0 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42     pSub->pOrderB
10bd0 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  y = 0;.  }else i
10be0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
10bf0 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  {.    substExprL
10c00 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
10c10 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
10c20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69  pEList);.  }.  i
10c30 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20  f( pSub->pWhere 
10c40 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  ){.    pWhere = 
10c50 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
10c60 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  Sub->pWhere);.  
10c70 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 68 65 72  }else{.    pWher
10c80 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
10c90 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
10ca0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
10cb0 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20  >pHaving==0 );. 
10cc0 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
10cd0 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 70  p->pWhere;.    p
10ce0 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
10cf0 65 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  e;.    substExpr
10d00 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  (p->pHaving, iPa
10d10 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
10d20 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76  st);.    p->pHav
10d30 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
10d40 72 41 6e 64 28 70 2d 3e 70 48 61 76 69 6e 67 2c  rAnd(p->pHaving,
10d50 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
10d60 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 29 29 3b  pSub->pHaving));
10d70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
10d80 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
10d90 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d     p->pGroupBy =
10da0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
10db0 44 75 70 28 70 53 75 62 2d 3e 70 47 72 6f 75 70  Dup(pSub->pGroup
10dc0 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  By);.  }else{.  
10dd0 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
10de0 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20  Where, iParent, 
10df0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
10e00 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
10e10 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 2d  qlite3ExprAnd(p-
10e20 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29  >pWhere, pWhere)
10e30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
10e40 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20  flattened query 
10e50 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65  is distinct if e
10e60 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20  ither the inner 
10e70 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f 75 74 65  or the.  ** oute
10e80 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  r query is disti
10e90 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e  nct. .  */.  p->
10ea0 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
10eb0 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53  isDistinct || pS
10ec0 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a  ub->isDistinct;.
10ed0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 45 4c 45 43  .  /*.  ** SELEC
10ee0 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45  T ... FROM (SELE
10ef0 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f  CT ... LIMIT a O
10f00 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78  FFSET b) LIMIT x
10f10 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 2a 2f 0a   OFFSET y;.  */.
10f20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
10f30 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 69  it ){.    p->pLi
10f40 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d  mit = pSub->pLim
10f50 69 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4c  it;.    pSub->pL
10f60 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  imit = 0;.  }.. 
10f70 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65   /* Finially, de
10f80 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66  lete what is lef
10f90 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
10fa0 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a  y and return.  *
10fb0 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a  * success..  */.
10fc0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
10fd0 65 6c 65 74 65 28 70 53 75 62 29 3b 0a 20 20 72  elete(pSub);.  r
10fe0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
10ff0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
11000 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VIEW */../*.** 
11010 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45  Analyze the SELE
11020 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  CT statement pas
11030 73 65 64 20 69 6e 20 61 73 20 61 6e 20 61 72 67  sed in as an arg
11040 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20  ument to see if 
11050 69 74 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c  it.** is a simpl
11060 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
11070 20 71 75 65 72 79 2e 20 20 49 66 20 69 74 20 69   query.  If it i
11080 73 20 61 6e 64 20 74 68 69 73 20 71 75 65 72 79  s and this query
11090 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73   can be.** satis
110a0 66 69 65 64 20 75 73 69 6e 67 20 61 20 73 69 6e  fied using a sin
110b0 67 6c 65 20 73 65 65 6b 20 74 6f 20 74 68 65 20  gle seek to the 
110c0 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64  beginning or end
110d0 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a   of an index,.**
110e0 20 74 68 65 6e 20 67 65 6e 65 72 61 74 65 20 74   then generate t
110f0 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73  he code for this
11100 20 53 45 4c 45 43 54 20 61 6e 64 20 72 65 74 75   SELECT and retu
11110 72 6e 20 31 2e 20 20 49 66 20 74 68 69 73 20 69  rn 1.  If this i
11120 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70  s not a .** simp
11130 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  le min() or max(
11140 29 20 71 75 65 72 79 2c 20 74 68 65 6e 20 72 65  ) query, then re
11150 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20  turn 0;.**.** A 
11160 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20  simply min() or 
11170 6d 61 78 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b  max() query look
11180 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
11190 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 69 6e  **    SELECT min
111a0 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a  (a) FROM table;.
111b0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78  **    SELECT max
111c0 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a  (a) FROM table;.
111d0 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20  **.** The query 
111e0 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79 20 61 20  may have only a 
111f0 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
11200 69 74 73 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e  its FROM argumen
11210 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e  t.  There.** can
11220 20 62 65 20 6e 6f 20 47 52 4f 55 50 20 42 59 20   be no GROUP BY 
11230 6f 72 20 48 41 56 49 4e 47 20 6f 72 20 57 48 45  or HAVING or WHE
11240 52 45 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65  RE clauses.  The
11250 20 72 65 73 75 6c 74 20 73 65 74 20 6d 75 73 74   result set must
11260 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69 6e 28 29  .** be the min()
11270 20 6f 72 20 6d 61 78 28 29 20 6f 66 20 61 20 73   or max() of a s
11280 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
11290 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  the table.  The 
112a0 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65  column.** in the
112b0 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
112c0 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
112d0 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20   indexed..**.** 
112e0 54 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 74  The parameters t
112f0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  o this routine a
11300 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 66  re the same as f
11310 6f 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  or sqlite3Select
11320 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68  ()..** See the h
11330 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e  eader comment on
11340 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f   that routine fo
11350 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
11360 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
11370 74 69 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69  tic int simpleMi
11380 6e 4d 61 78 51 75 65 72 79 28 50 61 72 73 65 20  nMaxQuery(Parse 
11390 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
113a0 2a 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  *p, int eDest, i
113b0 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 45 78 70  nt iParm){.  Exp
113c0 72 20 2a 70 45 78 70 72 3b 0a 20 20 69 6e 74 20  r *pExpr;.  int 
113d0 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70  iCol;.  Table *p
113e0 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
113f0 64 78 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a  dx;.  int base;.
11400 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
11410 20 73 65 65 6b 4f 70 3b 0a 20 20 69 6e 74 20 63   seekOp;.  int c
11420 6f 6e 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ont;.  ExprList 
11430 2a 70 45 4c 69 73 74 2c 20 2a 70 4c 69 73 74 2c  *pEList, *pList,
11440 20 65 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74   eList;.  struct
11450 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 65   ExprList_item e
11460 4c 69 73 74 49 74 65 6d 3b 0a 20 20 53 72 63 4c  ListItem;.  SrcL
11470 69 73 74 20 2a 70 53 72 63 3b 0a 0a 20 20 2f 2a  ist *pSrc;..  /*
11480 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
11490 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20 61   this query is a
114a0 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72   simple min() or
114b0 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 52   max() query.  R
114c0 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20  eturn.  ** zero 
114d0 69 66 20 69 74 20 69 73 20 20 6e 6f 74 2e 0a 20  if it is  not.. 
114e0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47 72   */.  if( p->pGr
114f0 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48 61 76  oupBy || p->pHav
11500 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65 72 65  ing || p->pWhere
11510 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
11520 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
11530 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21   if( pSrc->nSrc!
11540 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
11550 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
11560 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  ist;.  if( pELis
11570 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65  t->nExpr!=1 ) re
11580 74 75 72 6e 20 30 3b 0a 20 20 70 45 78 70 72 20  turn 0;.  pExpr 
11590 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  = pEList->a[0].p
115a0 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70  Expr;.  if( pExp
115b0 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55  r->op!=TK_AGG_FU
115c0 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20  NCTION ) return 
115d0 30 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78  0;.  pList = pEx
115e0 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28  pr->pList;.  if(
115f0 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69   pList==0 || pLi
11600 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
11610 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
11620 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33  Expr->token.n!=3
11630 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
11640 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
11650 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  mp(pExpr->token.
11660 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b  z,"min",3)==0 ){
11670 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50  .    seekOp = OP
11680 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73 65  _Rewind;.  }else
11690 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
116a0 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65  ICmp(pExpr->toke
116b0 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20  n.z,"max",3)==0 
116c0 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20  ){.    seekOp = 
116d0 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65  OP_Last;.  }else
116e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
116f0 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 70 4c    }.  pExpr = pL
11700 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
11710 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
11720 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
11730 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c 20 3d  turn 0;.  iCol =
11740 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
11750 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  .  pTab = pSrc->
11760 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a  a[0].pTab;..  /*
11770 20 49 66 20 77 65 20 67 65 74 20 74 6f 20 68 65   If we get to he
11780 72 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  re, it means the
11790 20 71 75 65 72 79 20 69 73 20 6f 66 20 74 68 65   query is of the
117a0 20 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a 20   correct form.. 
117b0 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b   ** Check to mak
117c0 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
117d0 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b 65  n index and make
117e0 20 70 49 64 78 20 70 6f 69 6e 74 20 74 6f 20 74   pIdx point to t
117f0 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72 69  he.  ** appropri
11800 61 74 65 20 69 6e 64 65 78 2e 20 20 49 66 20 74  ate index.  If t
11810 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  he min() or max(
11820 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45 47  ) is on an INTEG
11830 45 52 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a 20  ER PRIMARY.  ** 
11840 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69  key column, no i
11850 6e 64 65 78 20 69 73 20 6e 65 63 65 73 73 61 72  ndex is necessar
11860 79 20 73 6f 20 73 65 74 20 70 49 64 78 20 74 6f  y so set pIdx to
11870 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20 20   NULL.  If no.  
11880 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64 65 78 20  ** usable index 
11890 69 73 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  is found, return
118a0 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69   0..  */.  if( i
118b0 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49 64  Col<0 ){.    pId
118c0 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  x = 0;.  }else{.
118d0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
118e0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
118f0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
11900 70 45 78 70 72 29 3b 0a 20 20 20 20 66 6f 72 28  pExpr);.    for(
11910 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
11920 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
11930 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
11940 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
11950 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20  nColumn>=1 );.  
11960 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
11970 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20  Column[0]==iCol 
11980 26 26 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f  && pIdx->keyInfo
11990 2e 61 43 6f 6c 6c 5b 30 5d 3d 3d 70 43 6f 6c 6c  .aColl[0]==pColl
119a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
119b0 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20      if( pIdx==0 
119c0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
119d0 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
119e0 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69 66 20 77  olumn types if w
119f0 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
11a00 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54  the callback.  T
11a10 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73  his.  ** step is
11a20 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
11a30 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20  output is going 
11a40 74 6f 20 61 20 74 61 62 6c 65 20 6f 72 20 61 20  to a table or a 
11a50 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a  memory cell..  *
11a60 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  * The column nam
11a70 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
11a80 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20 69  been generated i
11a90 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  n the calling fu
11aa0 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76  nction..  */.  v
11ab0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
11ac0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
11ad0 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   v==0 ) return 0
11ae0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  ;..  /* If the o
11af0 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65  utput is destine
11b00 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72  d for a temporar
11b10 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68  y table, open th
11b20 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  at table..  */. 
11b30 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
11b40 56 69 72 74 75 61 6c 54 61 62 20 29 7b 0a 20 20  VirtualTab ){.  
11b50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11b60 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72  Op(v, OP_OpenVir
11b70 74 75 61 6c 2c 20 69 50 61 72 6d 2c 20 31 29 3b  tual, iParm, 1);
11b80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
11b90 61 74 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69  ating code to fi
11ba0 6e 64 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68  nd the min or th
11bb0 65 20 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c  e max.  Basicall
11bc0 79 20 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20  y all we have.  
11bd0 2a 2a 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64  ** to do is find
11be0 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 74 68   the first or th
11bf0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
11c00 74 68 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78  the chosen index
11c10 2e 20 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d  .  If.  ** the m
11c20 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73  in() or max() is
11c30 20 6f 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20   on the INTEGER 
11c40 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
11c50 6e 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74  n find the first
11c60 0a 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e  .  ** or last en
11c70 74 72 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  try in the main 
11c80 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  table..  */.  sq
11c90 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
11ca0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 54  chema(pParse, pT
11cb0 61 62 2d 3e 69 44 62 29 3b 0a 20 20 62 61 73 65  ab->iDb);.  base
11cc0 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43   = pSrc->a[0].iC
11cd0 75 72 73 6f 72 3b 0a 20 20 63 6f 6d 70 75 74 65  ursor;.  compute
11ce0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
11cf0 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28  Parse, p);.  if(
11d00 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c   pSrc->a[0].pSel
11d10 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
11d20 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 46 6f  lite3OpenTableFo
11d30 72 52 65 61 64 69 6e 67 28 76 2c 20 62 61 73 65  rReading(v, base
11d40 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 63  , pTab);.  }.  c
11d50 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
11d60 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
11d70 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a   if( pIdx==0 ){.
11d80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11d90 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20  ddOp(v, seekOp, 
11da0 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  base, 0);.  }els
11db0 65 7b 0a 20 20 20 20 2f 2a 20 45 76 65 6e 20 74  e{.    /* Even t
11dc0 68 6f 75 67 68 20 74 68 65 20 63 75 72 73 6f 72  hough the cursor
11dd0 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68   used to open th
11de0 65 20 69 6e 64 65 78 20 68 65 72 65 20 69 73 20  e index here is 
11df0 63 6c 6f 73 65 64 0a 20 20 20 20 2a 2a 20 61 73  closed.    ** as
11e00 20 73 6f 6f 6e 20 61 73 20 61 20 73 69 6e 67 6c   soon as a singl
11e10 65 20 76 61 6c 75 65 20 68 61 73 20 62 65 65 6e  e value has been
11e20 20 72 65 61 64 20 66 72 6f 6d 20 69 74 2c 20 61   read from it, a
11e30 6c 6c 6f 63 61 74 65 20 69 74 0a 20 20 20 20 2a  llocate it.    *
11e40 2a 20 75 73 69 6e 67 20 28 70 50 61 72 73 65 2d  * using (pParse-
11e50 3e 6e 54 61 62 2b 2b 29 20 74 6f 20 70 72 65 76  >nTab++) to prev
11e60 65 6e 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  ent the cursor i
11e70 64 20 66 72 6f 6d 20 62 65 69 6e 67 20 0a 20 20  d from being .  
11e80 20 20 2a 2a 20 72 65 75 73 65 64 2e 20 54 68 69    ** reused. Thi
11e90 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 66  s is important f
11ea0 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 66  or statements of
11eb0 20 74 68 65 20 66 6f 72 6d 20 0a 20 20 20 20 2a   the form .    *
11ec0 2a 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  * "INSERT INTO x
11ed0 20 53 45 4c 45 43 54 20 6d 61 78 28 29 20 46 52   SELECT max() FR
11ee0 4f 4d 20 78 22 2e 0a 20 20 20 20 2a 2f 0a 20 20  OM x"..    */.  
11ef0 20 20 69 6e 74 20 69 49 64 78 3b 0a 20 20 20 20    int iIdx;.    
11f00 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iIdx = pParse->n
11f10 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Tab++;.    sqlit
11f20 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11f30 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d  P_Integer, pIdx-
11f40 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71  >iDb, 0);.    sq
11f50 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
11f60 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64  OP_OpenRead, iId
11f70 78 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 0a 20  x, pIdx->tnum,. 
11f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f90 20 20 28 63 68 61 72 2a 29 26 70 49 64 78 2d 3e    (char*)&pIdx->
11fa0 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49  keyInfo, P3_KEYI
11fb0 4e 46 4f 29 3b 0a 20 20 20 20 69 66 28 20 73 65  NFO);.    if( se
11fc0 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20  ekOp==OP_Rewind 
11fd0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11fe0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11ff0 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Null, 0, 0);.   
12000 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12010 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
12020 63 6f 72 64 2c 20 31 2c 20 30 29 3b 0a 20 20 20  cord, 1, 0);.   
12030 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d     seekOp = OP_M
12040 6f 76 65 47 74 3b 0a 20 20 20 20 7d 0a 20 20 20  oveGt;.    }.   
12050 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12060 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 69 49 64  p(v, seekOp, iId
12070 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  x, 0);.    sqlit
12080 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
12090 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78  P_IdxRowid, iIdx
120a0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
120b0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
120c0 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30 29  _Close, iIdx, 0)
120d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
120e0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76  eAddOp(v, OP_Mov
120f0 65 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20  eGe, base, 0);. 
12100 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70 72   }.  eList.nExpr
12110 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 1;.  memset(&
12120 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73 69  eListItem, 0, si
12130 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29 29  zeof(eListItem))
12140 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26 65  ;.  eList.a = &e
12150 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73  ListItem;.  eLis
12160 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70  t.a[0].pExpr = p
12170 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e  Expr;.  selectIn
12180 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
12190 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c  p, &eList, 0, 0,
121a0 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69   0, -1, eDest, i
121b0 50 61 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e 74  Parm, cont, cont
121c0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
121d0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
121e0 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69  v, cont);.  sqli
121f0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12200 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20  OP_Close, base, 
12210 30 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20  0);.  .  return 
12220 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  1;.}../*.** Anal
12230 79 7a 65 20 61 6e 64 20 4f 52 44 45 52 20 42 59  yze and ORDER BY
12240 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
12250 75 73 65 20 69 6e 20 61 20 53 45 4c 45 43 54 20  use in a SELECT 
12260 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75  statement.  Retu
12270 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
12280 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 2e   of errors seen.
12290 0a 2a 2a 0a 2a 2a 20 41 6e 20 4f 52 44 45 52 20  .**.** An ORDER 
122a0 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 69  BY or GROUP BY i
122b0 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72  s a list of expr
122c0 65 73 73 69 6f 6e 73 2e 20 20 49 66 20 61 6e 79  essions.  If any
122d0 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
122e0 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  s an integer con
122f0 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 61 74  stant, then that
12300 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72   expression is r
12310 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 0a 2a  eplaced by the.*
12320 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
12330 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 65 73  entry in the res
12340 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
12350 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 4f 72  ic int processOr
12360 64 65 72 47 72 6f 75 70 42 79 28 0a 20 20 4e 61  derGroupBy(.  Na
12370 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
12380 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
12390 65 78 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ext of the SELEC
123a0 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a  T statement. */.
123b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
123c0 65 72 42 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f  erBy,   /* The O
123d0 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
123e0 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65   BY clause to be
123f0 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
12400 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
12410 65 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  e     /* Either 
12420 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55  "ORDER" or "GROU
12430 50 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61  P", as appropria
12440 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  te */.){.  int i
12450 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
12460 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69  List = pNC->pELi
12470 73 74 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 72  st;     /* The r
12480 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
12490 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 50 61 72   SELECT */.  Par
124a0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43  se *pParse = pNC
124b0 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 2f 2a  ->pParse;     /*
124c0 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
124d0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 2a 2f  of the SELECT */
124e0 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73  .  assert( pELis
124f0 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64  t );..  if( pOrd
12500 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  erBy==0 ) return
12510 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
12520 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
12530 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
12540 69 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a  iCol;.    Expr *
12550 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
12560 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
12570 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
12580 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
12590 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l) ){.      if( 
125a0 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d  iCol>0 && iCol<=
125b0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
125c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
125d0 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a  ExprDelete(pE);.
125e0 20 20 20 20 20 20 20 20 70 45 20 3d 20 70 4f 72          pE = pOr
125f0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
12600 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
12610 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  up(pEList->a[iCo
12620 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  l-1].pExpr);.   
12630 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12640 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12650 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
12660 20 20 20 20 20 20 22 25 73 20 42 59 20 63 6f 6c        "%s BY col
12670 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f 75  umn number %d ou
12680 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f  t of range - sho
12690 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20  uld be ".       
126a0 20 20 20 20 22 62 65 74 77 65 65 6e 20 31 20 61      "between 1 a
126b0 6e 64 20 25 64 22 2c 20 7a 54 79 70 65 2c 20 69  nd %d", zType, i
126c0 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  Col, pEList->nEx
126d0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  pr);.        ret
126e0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
126f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
12700 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
12710 61 6d 65 73 28 70 4e 43 2c 20 70 45 29 20 29 7b  ames(pNC, pE) ){
12720 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
12730 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
12740 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
12750 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20  tant(pE) ){.    
12760 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12770 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
12780 20 20 20 20 22 25 73 20 42 59 20 74 65 72 6d 73      "%s BY terms
12790 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e   must not be non
127a0 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e  -integer constan
127b0 74 73 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20 20  ts", zType);.   
127c0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
127d0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
127e0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
127f0 20 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76 65   routine resolve
12800 73 20 61 6e 79 20 6e 61 6d 65 73 20 75 73 65 64  s any names used
12810 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
12820 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 73 75 70  et of the.** sup
12830 70 6c 69 65 64 20 53 45 4c 45 43 54 20 73 74 61  plied SELECT sta
12840 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 53  tement. If the S
12850 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
12860 62 65 69 6e 67 20 72 65 73 6f 6c 76 65 64 0a 2a  being resolved.*
12870 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  * is a sub-selec
12880 74 2c 20 74 68 65 6e 20 70 4f 75 74 65 72 4e 43  t, then pOuterNC
12890 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
128a0 20 74 68 65 20 4e 61 6d 65 43 6f 6e 74 65 78 74   the NameContext
128b0 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65   .** of the pare
128c0 6e 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 69 6e  nt SELECT..*/.in
128d0 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52  t sqlite3SelectR
128e0 65 73 6f 6c 76 65 28 0a 20 20 50 61 72 73 65 20  esolve(.  Parse 
128f0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
12900 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
12910 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
12920 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
12930 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
12940 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
12950 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d   coded. */.  Nam
12960 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72  eContext *pOuter
12970 4e 43 20 20 2f 2a 20 54 68 65 20 6f 75 74 65 72  NC  /* The outer
12980 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 4d   name context. M
12990 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 29  ay be NULL. */.)
129a0 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  {.  ExprList *pE
129b0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f  List;          /
129c0 2a 20 52 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f  * Result set. */
129d0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
129e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
129f0 20 46 6f 72 2d 6c 6f 6f 70 20 76 61 72 69 61 62   For-loop variab
12a00 6c 65 20 75 73 65 64 20 69 6e 20 6d 75 6c 74 69  le used in multi
12a10 70 6c 65 20 70 6c 61 63 65 73 20 2a 2f 0a 20 20  ple places */.  
12a20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
12a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
12a40 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  cal name-context
12a50 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
12a60 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20 20 20  pGroupBy;       
12a70 20 2f 2a 20 54 68 65 20 67 72 6f 75 70 20 62 79   /* The group by
12a80 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a   clause */..  /*
12a90 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
12aa0 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72 65 2c   has run before,
12ab0 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
12ac0 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ely. */.  if( p-
12ad0 3e 69 73 52 65 73 6f 6c 76 65 64 20 29 7b 0a 20  >isResolved ){. 
12ae0 20 20 20 61 73 73 65 72 74 28 20 21 70 4f 75 74     assert( !pOut
12af0 65 72 4e 43 20 29 3b 0a 20 20 20 20 72 65 74 75  erNC );.    retu
12b00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12b10 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65  }.  p->isResolve
12b20 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20  d = 1;..  /* If 
12b30 74 68 65 72 65 20 68 61 76 65 20 61 6c 72 65 61  there have alrea
12b40 64 79 20 62 65 65 6e 20 65 72 72 6f 72 73 2c 20  dy been errors, 
12b50 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20  do nothing. */. 
12b60 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
12b70 72 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  r>0 ){.    retur
12b80 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
12b90 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72    }..  /* Prepar
12ba0 65 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61  e the select sta
12bb0 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 63 61 6c  tement. This cal
12bc0 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74 65 20  l will allocate 
12bd0 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  all cursors.  **
12be0 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e   required to han
12bf0 64 6c 65 20 74 68 65 20 74 61 62 6c 65 73 20 61  dle the tables a
12c00 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  nd subqueries in
12c10 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
12c20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65  ..  */.  if( pre
12c30 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72  pSelectStmt(pPar
12c40 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65  se, p) ){.    re
12c50 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
12c60 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  R;.  }..  /* Res
12c70 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73 73  olve the express
12c80 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d 49  ions in the LIMI
12c90 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
12ca0 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20 2a 2a  uses. These.  **
12cb0 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
12cc0 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61 6e 79   to refer to any
12cd0 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73 73 20   names, so pass 
12ce0 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43 6f 6e  an empty NameCon
12cf0 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43  text..  */.  sNC
12d00 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
12d10 3b 0a 20 20 73 4e 43 2e 68 61 73 41 67 67 20 3d  ;.  sNC.hasAgg =
12d20 20 30 3b 0a 20 20 73 4e 43 2e 6e 45 72 72 20 3d   0;.  sNC.nErr =
12d30 20 30 3b 0a 20 20 73 4e 43 2e 6e 52 65 66 20 3d   0;.  sNC.nRef =
12d40 20 30 3b 0a 20 20 73 4e 43 2e 70 45 4c 69 73 74   0;.  sNC.pEList
12d50 20 3d 20 30 3b 0a 20 20 73 4e 43 2e 61 6c 6c 6f   = 0;.  sNC.allo
12d60 77 41 67 67 20 3d 20 30 3b 0a 20 20 73 4e 43 2e  wAgg = 0;.  sNC.
12d70 70 53 72 63 4c 69 73 74 20 3d 20 30 3b 0a 20 20  pSrcList = 0;.  
12d80 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  sNC.pNext = 0;. 
12d90 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
12da0 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
12db0 43 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c  C, p->pLimit) ||
12dc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
12dd0 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
12de0 73 4e 43 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29  sNC, p->pOffset)
12df0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
12e00 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
12e10 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68  ..  /* Set up th
12e20 65 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e  e local name-con
12e30 74 65 78 74 20 74 6f 20 70 61 73 73 20 74 6f 20  text to pass to 
12e40 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
12e50 28 29 20 74 6f 0a 20 20 2a 2a 20 72 65 73 6f 6c  () to.  ** resol
12e60 76 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ve the expressio
12e70 6e 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 73  n-list..  */.  s
12e80 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b  NC.allowAgg = 1;
12e90 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
12ea0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 73 4e 43  = p->pSrc;.  sNC
12eb0 2e 70 4e 65 78 74 20 3d 20 70 4f 75 74 65 72 4e  .pNext = pOuterN
12ec0 43 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  C;..  /* Resolve
12ed0 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 72 65   names in the re
12ee0 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 70  sult set. */.  p
12ef0 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
12f00 74 3b 0a 20 20 69 66 28 20 21 70 45 4c 69 73 74  t;.  if( !pEList
12f10 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
12f20 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28 69 3d  _ERROR;.  for(i=
12f30 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
12f40 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
12f50 70 72 20 2a 70 58 20 3d 20 70 45 4c 69 73 74 2d  pr *pX = pEList-
12f60 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
12f70 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
12f80 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
12f90 43 2c 20 70 58 29 20 29 7b 0a 20 20 20 20 20 20  C, pX) ){.      
12fa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
12fb0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ROR;.    }.  }..
12fc0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
12fd0 65 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66  e no aggregate f
12fe0 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20  unctions in the 
12ff0 72 65 73 75 6c 74 2d 73 65 74 2c 20 61 6e 64 20  result-set, and 
13000 6e 6f 20 47 52 4f 55 50 20 42 59 20 0a 20 20 2a  no GROUP BY .  *
13010 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 64 6f  * expression, do
13020 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72 65   not allow aggre
13030 67 61 74 65 73 20 69 6e 20 61 6e 79 20 6f 66 20  gates in any of 
13040 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
13050 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73  sions..  */.  as
13060 73 65 72 74 28 20 21 70 2d 3e 69 73 41 67 67 20  sert( !p->isAgg 
13070 29 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20  );.  pGroupBy = 
13080 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 69  p->pGroupBy;.  i
13090 66 28 20 70 47 72 6f 75 70 42 79 20 7c 7c 20 73  f( pGroupBy || s
130a0 4e 43 2e 68 61 73 41 67 67 20 29 7b 0a 20 20 20  NC.hasAgg ){.   
130b0 20 70 2d 3e 69 73 41 67 67 20 3d 20 31 3b 0a 20   p->isAgg = 1;. 
130c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 4e 43 2e   }else{.    sNC.
130d0 61 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20  allowAgg = 0;.  
130e0 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 48 41 56  }..  /* If a HAV
130f0 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70 72  ING clause is pr
13100 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 72  esent, then ther
13110 65 20 6d 75 73 74 20 62 65 20 61 20 47 52 4f 55  e must be a GROU
13120 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a  P BY clause..  *
13130 2f 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69  /.  if( p->pHavi
13140 6e 67 20 26 26 20 21 70 47 72 6f 75 70 42 79 20  ng && !pGroupBy 
13150 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
13160 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
13170 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
13180 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  e is required be
13190 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20  fore HAVING");. 
131a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
131b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
131c0 2a 20 41 64 64 20 74 68 65 20 65 78 70 72 65 73  * Add the expres
131d0 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 74 68 65  sion list to the
131e0 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 62 65   name-context be
131f0 66 6f 72 65 20 70 61 72 73 69 6e 67 20 74 68 65  fore parsing the
13200 0a 20 20 2a 2a 20 6f 74 68 65 72 20 65 78 70 72  .  ** other expr
13210 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 53  essions in the S
13220 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
13230 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74   This is so that
13240 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
13250 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
13260 6c 61 75 73 65 20 28 65 74 63 2e 29 20 63 61 6e  lause (etc.) can
13270 20 72 65 66 65 72 20 74 6f 20 65 78 70 72 65 73   refer to expres
13280 73 69 6f 6e 73 20 62 79 0a 20 20 2a 2a 20 61 6c  sions by.  ** al
13290 69 61 73 65 73 20 69 6e 20 74 68 65 20 72 65 73  iases in the res
132a0 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20  ult set..  **.  
132b0 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e 74 3a 20  ** Minor point: 
132c0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
132d0 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 65 78  ase, then the ex
132e0 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65  pression will be
132f0 0a 20 20 2a 2a 20 72 65 2d 65 76 61 6c 75 61 74  .  ** re-evaluat
13300 65 64 20 66 6f 72 20 65 61 63 68 20 72 65 66 65  ed for each refe
13310 72 65 6e 63 65 20 74 6f 20 69 74 2e 0a 20 20 2a  rence to it..  *
13320 2f 0a 20 20 73 4e 43 2e 70 45 4c 69 73 74 20 3d  /.  sNC.pEList =
13330 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
13340 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
13350 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20  olveNames(&sNC, 
13360 70 2d 3e 70 57 68 65 72 65 29 20 7c 7c 0a 20 20  p->pWhere) ||.  
13370 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 52      sqlite3ExprR
13380 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43  esolveNames(&sNC
13390 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 20 7c 7c  , p->pHaving) ||
133a0 0a 20 20 20 20 20 20 70 72 6f 63 65 73 73 4f 72  .      processOr
133b0 64 65 72 47 72 6f 75 70 42 79 28 26 73 4e 43 2c  derGroupBy(&sNC,
133c0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f   p->pOrderBy, "O
133d0 52 44 45 52 22 29 20 7c 7c 0a 20 20 20 20 20 20  RDER") ||.      
133e0 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75  processOrderGrou
133f0 70 42 79 28 26 73 4e 43 2c 20 70 47 72 6f 75 70  pBy(&sNC, pGroup
13400 42 79 2c 20 22 47 52 4f 55 50 22 29 0a 20 20 29  By, "GROUP").  )
13410 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
13420 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
13430 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
13440 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
13450 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  se does not cont
13460 61 69 6e 20 61 67 67 72 65 67 61 74 65 20 66 75  ain aggregate fu
13470 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nctions..  */.  
13480 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
13490 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
134a0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
134b0 0a 20 20 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  .  .    for(i=0,
134c0 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d   pItem=pGroupBy-
134d0 3e 61 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e  >a; i<pGroupBy->
134e0 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
134f0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
13500 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
13510 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pItem->pExpr, EP
13520 5f 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 20  _Agg) ){.       
13530 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
13540 28 70 50 61 72 73 65 2c 20 22 61 67 67 72 65 67  (pParse, "aggreg
13550 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  ate functions ar
13560 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e  e not allowed in
13570 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
13580 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  the GROUP BY cla
13590 75 73 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72  use");.        r
135a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
135b0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
135c0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
135d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
135e0 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67  .** Reset the ag
135f0 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
13600 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  tor..**.** The a
13610 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
13620 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66  ator is a set of
13630 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68   memory cells th
13640 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72  at hold.** inter
13650 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20  mediate results 
13660 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e  while calculatin
13670 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20  g an aggregate. 
13680 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
13690 20 73 69 6d 70 6c 79 20 73 74 6f 72 65 73 20 4e   simply stores N
136a0 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74  ULLs in all of t
136b0 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  hose memory cell
136c0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
136d0 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74  d resetAccumulat
136e0 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
136f0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
13700 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
13710 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
13720 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
13730 61 64 64 72 3b 0a 20 20 69 66 28 20 70 41 67 67  addr;.  if( pAgg
13740 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67  Info->nFunc+pAgg
13750 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30  Info->nColumn==0
13760 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
13770 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
13780 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
13790 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 66 6f 72 28  l, 0, 0);.  for(
137a0 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
137b0 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
137c0 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
137d0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
137e0 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 41 67 67  P_MemStore, pAgg
137f0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
13800 65 6d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f  em, 0);.  }.  fo
13810 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
13820 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a  o->nFunc; i++){.
13830 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
13840 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
13850 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 41 67 67  P_MemStore, pAgg
13860 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69  Info->aFunc[i].i
13870 4d 65 6d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  Mem, 0);.  }.  s
13880 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
13890 50 32 28 76 2c 20 61 64 64 72 2c 20 31 29 3b 0a  P2(v, addr, 1);.
138a0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
138b0 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69  the OP_AggFinali
138c0 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76  ze opcode for ev
138d0 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75  ery aggregate fu
138e0 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65  nction.** in the
138f0 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75   AggInfo structu
13900 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
13910 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75  id finalizeAggFu
13920 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70  nctions(Parse *p
13930 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
13940 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
13950 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
13960 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
13970 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
13980 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28  func *pF;.  for(
13990 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
139a0 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
139b0 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
139c0 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72   pF++){.    Expr
139d0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
139e0 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  ->pExpr->pList;.
139f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
13a00 70 33 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p3(v, OP_AggFina
13a10 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
13a20 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
13a30 72 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20  r : 0,.         
13a40 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
13a50 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50  id*)pF->pFunc, P
13a60 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a  3_FUNCDEF);.  }.
13a70 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  }../*.** Update 
13a80 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
13a90 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
13aa0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61   an aggregate ba
13ab0 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75  sed on.** the cu
13ac0 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
13ad0 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ition..*/.static
13ae0 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75   void updateAccu
13af0 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
13b00 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
13b10 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
13b20 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
13b30 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
13b40 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
13b50 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75  func *pF;.  stru
13b60 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
13b70 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d  pC;..  pAggInfo-
13b80 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  >directMode = 1;
13b90 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
13ba0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
13bb0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
13bc0 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
13bd0 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20     int nArg;.   
13be0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
13bf0 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c   = pF->pExpr->pL
13c00 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ist;.    if( pLi
13c10 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67  st ){.      nArg
13c20 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
13c30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
13c40 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
13c50 50 61 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20  Parse, pList);. 
13c60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13c70 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  nArg = 0;.    }.
13c80 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e      if( pF->pFun
13c90 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29  c->needCollSeq )
13ca0 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
13cb0 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
13cc0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
13cd0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
13ce0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
13cf0 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
13d00 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c  =pList->a; !pCol
13d10 6c 20 26 26 20 6a 3c 70 4c 69 73 74 2d 3e 6e 45  l && j<pList->nE
13d20 78 70 72 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; j++, pItem+
13d30 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  +){.        pCol
13d40 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
13d50 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
13d60 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
13d70 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
13d80 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
13d90 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
13da0 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
13db0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
13dc0 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
13dd0 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20   OP_CollSeq, 0, 
13de0 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
13df0 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P3_COLLSEQ);. 
13e00 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
13e10 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67  VdbeOp3(v, OP_Ag
13e20 67 53 74 65 70 2c 20 70 46 2d 3e 69 4d 65 6d 2c  gStep, pF->iMem,
13e30 20 6e 41 72 67 2c 20 28 76 6f 69 64 2a 29 70 46   nArg, (void*)pF
13e40 2d 3e 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43  ->pFunc, P3_FUNC
13e50 44 45 46 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  DEF);.  }.  for(
13e60 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f  i=0, pC=pAggInfo
13e70 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e  ->aCol; i<pAggIn
13e80 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
13e90 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20  ; i++, pC++){.  
13ea0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
13eb0 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45  e(pParse, pC->pE
13ec0 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
13ed0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13ee0 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 43 2d 3e 69  _MemStore, pC->i
13ef0 4d 65 6d 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 70  Mem, 1);.  }.  p
13f00 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
13f10 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  ode = 0;.}.../*.
13f20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
13f30 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
13f40 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
13f50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
13f60 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74  ts are distribut
13f70 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61  ed in various wa
13f80 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ys depending on 
13f90 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
13fa0 65 44 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e  eDest and iParm.
13fb0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74  .**.**     eDest
13fc0 20 56 61 6c 75 65 20 20 20 20 20 20 20 52 65 73   Value       Res
13fd0 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d  ult.**     -----
13fe0 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
13ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14010 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52  ------.**     SR
14020 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e  T_Callback    In
14030 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63  voke the callbac
14040 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  k for each row o
14050 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  f the result..**
14060 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20  .**     SRT_Mem 
14070 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 66 69          Store fi
14080 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65  rst result in me
14090 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a  mory cell iParm.
140a0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65  **.**     SRT_Se
140b0 74 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20  t         Store 
140c0 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20  results as keys 
140d0 6f 66 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  of table iParm..
140e0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e  **.**     SRT_Un
140f0 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20  ion       Store 
14100 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79  results as a key
14110 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
14120 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a  table iParm.**.*
14130 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74  *     SRT_Except
14140 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73        Remove res
14150 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65  ults from the te
14160 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
14170 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  arm..**.**     S
14180 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53  RT_Table       S
14190 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20  tore results in 
141a0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
141b0 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iParm.**.** The 
141c0 74 61 62 6c 65 20 61 62 6f 76 65 20 69 73 20 69  table above is i
141d0 6e 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64 69  ncomplete.  Addi
141e0 74 69 6f 6e 61 6c 20 65 44 69 73 74 20 76 61 6c  tional eDist val
141f0 75 65 20 68 61 76 65 20 62 65 20 61 64 64 65 64  ue have be added
14200 0a 2a 2a 20 73 69 6e 63 65 20 74 68 69 73 20 63  .** since this c
14210 6f 6d 6d 65 6e 74 20 77 61 73 20 77 72 69 74 74  omment was writt
14220 65 6e 2e 20 20 53 65 65 20 74 68 65 20 73 65 6c  en.  See the sel
14230 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66  ectInnerLoop() f
14240 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61  unction for.** a
14250 20 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e   complete listin
14260 67 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65 64  g of the allowed
14270 20 76 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74   values of eDest
14280 20 61 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69   and their meani
14290 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ngs..**.** This 
142a0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
142b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
142c0 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72  rors.  If any er
142d0 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f  rors are.** enco
142e0 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e  untered, then an
142f0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
14300 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
14310 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  ft in.** pParse-
14320 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
14330 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
14340 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53  s NOT free the S
14350 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
14360 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a  passed in.  The.
14370 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  ** calling funct
14380 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20  ion needs to do 
14390 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  that..**.** The 
143a0 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54  pParent, parentT
143b0 61 62 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74  ab, and *pParent
143c0 41 67 67 20 66 69 65 6c 64 73 20 61 72 65 20 66  Agg fields are f
143d0 69 6c 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73  illed in if this
143e0 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20  .** SELECT is a 
143f0 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20  subquery.  This 
14400 72 6f 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20  routine may try 
14410 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20  to combine this 
14420 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69  SELECT.** with i
14430 74 73 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72  ts parent to for
14440 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  m a single flat 
14450 71 75 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f  query.  In so do
14460 69 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a  ing, it might.**
14470 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 72 65   change the pare
14480 6e 74 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20  nt query from a 
14490 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f  non-aggregate to
144a0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75   an aggregate qu
144b0 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74  ery..** For that
144c0 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61   reason, the pPa
144d0 72 65 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20  rentAgg flag is 
144e0 70 61 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e  passed as a poin
144f0 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61  ter, so it.** ca
14500 6e 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  n be changed..**
14510 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
14520 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   The meaning of 
14530 74 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61  the pParent para
14540 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  meter..**.**    
14550 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
14560 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c   JOIN (SELECT x,
14570 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
14580 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20  2) JOIN t3;.**  
14590 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
145a0 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
145b0 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
145c0 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20  __/        /.** 
145d0 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20      \           
145e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14600 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20             /.** 
14610 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
14620 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
14630 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
14640 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a  __________/.**.*
14650 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
14660 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  s called for the
14670 20 6f 75 74 65 72 20 71 75 65 72 79 20 66 69 72   outer query fir
14680 73 74 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63  st.   For that c
14690 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20  all,.** pParent 
146a0 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44  will be NULL.  D
146b0 75 72 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73  uring the proces
146c0 73 69 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65  sing of the oute
146d0 72 20 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a  r query, this .*
146e0 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
146f0 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20  led recursively 
14700 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75  to handle the su
14710 62 71 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65  bquery.  For the
14720 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61   recursive.** ca
14730 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c  ll, pParent will
14740 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75   point to the ou
14750 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 63 61  ter query.  Beca
14760 75 73 65 20 74 68 65 20 73 75 62 71 75 65 72 79  use the subquery
14770 20 69 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e   is.** the secon
14780 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74  d element in a t
14790 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74  hree-way join, t
147a0 68 65 20 70 61 72 65 6e 74 54 61 62 20 70 61 72  he parentTab par
147b0 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62  ameter will.** b
147c0 65 20 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c  e 1 (the 2nd val
147d0 75 65 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65  ue of a 0-indexe
147e0 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74  d array.).*/.int
147f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a   sqlite3Select(.
14800 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
14810 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
14820 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
14830 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
14840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14850 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
14860 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
14870 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  */.  int eDest, 
14880 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
14890 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
148a0 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
148b0 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20    int iParm,    
148c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 61           /* A pa
148d0 72 61 6d 65 74 65 72 20 75 73 65 64 20 62 79 20  rameter used by 
148e0 74 68 65 20 65 44 65 73 74 20 64 69 73 70 6f 73  the eDest dispos
148f0 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53  al method */.  S
14900 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20  elect *pParent, 
14910 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
14920 20 53 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63   SELECT for whic
14930 68 20 74 68 69 73 20 69 73 20 61 20 73 75 62 2d  h this is a sub-
14940 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70  query */.  int p
14950 61 72 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20  arentTab,       
14960 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50    /* Index in pP
14970 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74  arent->pSrc of t
14980 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  his query */.  i
14990 6e 74 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20  nt *pParentAgg, 
149a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
149b0 20 70 50 61 72 65 6e 74 20 75 73 65 73 20 61 67   pParent uses ag
149c0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
149d0 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66  s */.  char *aff
149e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
149f0 20 49 66 20 65 44 65 73 74 20 69 73 20 53 52 54   If eDest is SRT
14a00 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69  _Union, the affi
14a10 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29  nity string */.)
14a20 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
14a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
14a40 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
14a50 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
14a60 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72  fo;     /* Retur
14a70 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68  n from sqlite3Wh
14a80 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20  ereBegin() */.  
14a90 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
14aa0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
14ab0 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e  rtual machine un
14ac0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
14ad0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b   */.  int isAgg;
14ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14af0 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
14b00 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
14b10 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
14b20 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
14b30 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
14b40 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
14b50 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
14b60 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
14b70 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
14b80 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
14b90 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
14ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14bb0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
14bc0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
14bd0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
14be0 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rBy;    /* The O
14bf0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
14c00 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
14c10 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
14c20 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  upBy;    /* The 
14c30 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
14c40 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
14c50 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
14c60 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
14c70 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20   HAVING clause. 
14c80 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
14c90 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74    int isDistinct
14ca0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
14cb0 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
14cc0 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
14cd0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  ent */.  int dis
14ce0 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20  tinct;          
14cf0 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20  /* Table to use 
14d00 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
14d10 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63   set */.  int rc
14d20 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
14d30 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
14d40 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75  urn from this fu
14d50 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  nction */.  int 
14d60 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20  addrSortIndex;  
14d70 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
14d80 20 61 6e 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75   an OP_OpenVirtu
14d90 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a  al instruction *
14da0 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67  /.  AggInfo sAgg
14db0 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e  Info;      /* In
14dc0 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62  formation used b
14dd0 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  y aggregate quer
14de0 69 65 73 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71  ies */..  if( sq
14df0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
14e00 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
14e10 45 72 72 20 7c 7c 20 70 3d 3d 30 20 29 20 72 65  Err || p==0 ) re
14e20 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
14e30 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
14e40 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
14e50 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29  LECT, 0, 0, 0) )
14e60 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d   return 1;.  mem
14e70 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30  set(&sAggInfo, 0
14e80 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66  , sizeof(sAggInf
14e90 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  o));..#ifndef SQ
14ea0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
14eb0 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49  ND_SELECT.  /* I
14ec0 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61  f there is are a
14ed0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65   sequence of que
14ee0 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72  ries, do the ear
14ef0 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e  lier ones first.
14f00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
14f10 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
14f20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d   p->pRightmost==
14f30 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63  0 ){.      Selec
14f40 74 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  t *pLoop;.      
14f50 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f  for(pLoop=p; pLo
14f60 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
14f70 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
14f80 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d    pLoop->pRightm
14f90 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 7d  ost = p;.      }
14fa0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
14fb0 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50  n multiSelect(pP
14fc0 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20  arse, p, eDest, 
14fd0 69 50 61 72 6d 2c 20 61 66 66 29 3b 0a 20 20 7d  iParm, aff);.  }
14fe0 0a 23 65 6e 64 69 66 0a 0a 20 20 70 4f 72 64 65  .#endif..  pOrde
14ff0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
15000 79 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62  y;.  if( Ignorab
15010 6c 65 4f 72 64 65 72 62 79 28 65 44 65 73 74 29  leOrderby(eDest)
15020 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65   ){.    p->pOrde
15030 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  rBy = 0;.  }.  i
15040 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
15050 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20  Resolve(pParse, 
15060 70 2c 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74  p, 0) ){.    got
15070 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
15080 7d 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  }.  p->pOrderBy 
15090 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f  = pOrderBy;..  /
150a0 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70  * Make local cop
150b0 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d  ies of the param
150c0 65 74 65 72 73 20 66 6f 72 20 74 68 69 73 20 71  eters for this q
150d0 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61  uery..  */.  pTa
150e0 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
150f0 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
15100 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42  Where;.  pGroupB
15110 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
15120 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  .  pHaving = p->
15130 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 41 67 67  pHaving;.  isAgg
15140 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 69   = p->isAgg;.  i
15150 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
15160 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 45 4c  sDistinct;.  pEL
15170 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
15180 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
15190 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
151a0 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  nd;..  /* .  ** 
151b0 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65  Do not even atte
151c0 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20  mpt to generate 
151d0 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20 68  any code if we h
151e0 61 76 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e  ave already seen
151f0 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66  .  ** errors bef
15200 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
15210 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20   starts..  */.  
15220 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
15230 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  >0 ) goto select
15240 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  _end;..  /* If w
15250 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79  riting to memory
15260 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61   or generating a
15270 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61   set.  ** only a
15280 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d   single column m
15290 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  ay be output..  
152a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 44 65  */.  assert( eDe
152b0 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 7c  st!=SRT_Exists |
152c0 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  | pEList->nExpr=
152d0 3d 31 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =1 );.#ifndef SQ
152e0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
152f0 52 59 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d  RY.  if( (eDest=
15300 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73  =SRT_Mem || eDes
15310 74 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70  t==SRT_Set) && p
15320 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29  EList->nExpr>1 )
15330 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
15340 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
15350 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73  nly a single res
15360 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20  ult allowed for 
15370 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45  ".       "a SELE
15380 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20  CT that is part 
15390 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
153a0 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c  ");.    goto sel
153b0 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e  ect_end;.  }.#en
153c0 64 69 66 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20  dif..  /* ORDER 
153d0 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f  BY is ignored fo
153e0 72 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69  r some destinati
153f0 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
15400 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
15410 28 65 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70  (eDest) ){.    p
15420 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
15430 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
15440 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20  erating code..  
15450 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
15460 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
15470 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f  .  if( v==0 ) go
15480 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
15490 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f    /* Identify co
154a0 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77 65  lumn names if we
154b0 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74   will be using t
154c0 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61 63  hem in a callbac
154d0 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74  k.  This.  ** st
154e0 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ep is skipped if
154f0 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67   the output is g
15500 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74 68  oing to some oth
15510 65 72 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a  er destination..
15520 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
15530 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
15540 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  {.    generateCo
15550 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
15560 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
15570 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  st);.  }..  /* G
15580 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
15590 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73   all sub-queries
155a0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
155b0 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65  use.  */.#if !de
155c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
155d0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
155e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
155f0 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28  MIT_VIEW).  for(
15600 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
15610 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
15620 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
15630 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
15640 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64   0;.    int need
15650 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 3b 0a  RestoreContext;.
15660 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
15670 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
15680 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
15690 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  ;..    if( pItem
156a0 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 63  ->pSelect==0 ) c
156b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
156c0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30   pItem->zName!=0
156d0 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65 64   ){.      zSaved
156e0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50  AuthContext = pP
156f0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
15700 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  xt;.      pParse
15710 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
15720 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20   pItem->zName;. 
15730 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65       needRestore
15740 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20 20  Context = 1;.   
15750 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 65   }else{.      ne
15760 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74  edRestoreContext
15770 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
15780 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
15790 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65  arse, pItem->pSe
157a0 6c 65 63 74 2c 20 53 52 54 5f 56 69 72 74 75 61  lect, SRT_Virtua
157b0 6c 54 61 62 2c 20 0a 20 20 20 20 20 20 20 20 20  lTab, .         
157c0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
157d0 43 75 72 73 6f 72 2c 20 70 2c 20 69 2c 20 26 69  Cursor, p, i, &i
157e0 73 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 69 66  sAgg, 0);.    if
157f0 28 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e  ( needRestoreCon
15800 74 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50  text ){.      pP
15810 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
15820 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
15830 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  ontext;.    }.  
15840 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
15850 70 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65  pSrc;.    pWhere
15860 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
15870 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65    if( !Ignorable
15880 4f 72 64 65 72 62 79 28 65 44 65 73 74 29 20 29  Orderby(eDest) )
15890 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  {.      pOrderBy
158a0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
158b0 20 20 20 20 7d 0a 20 20 20 20 70 47 72 6f 75 70      }.    pGroup
158c0 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
158d0 3b 0a 20 20 20 20 70 48 61 76 69 6e 67 20 3d 20  ;.    pHaving = 
158e0 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20  p->pHaving;.    
158f0 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
15900 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  isDistinct;.  }.
15910 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65  #endif..  /* Che
15920 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ck for the speci
15930 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69 6e  al case of a min
15940 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63  () or max() func
15950 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a 20  tion by itself. 
15960 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
15970 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
15980 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75  ( simpleMinMaxQu
15990 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 65  ery(pParse, p, e
159a0 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b 0a  Dest, iParm) ){.
159b0 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
159c0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
159d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
159e0 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
159f0 69 73 20 61 20 73 75 62 71 75 65 72 79 20 74 68  is a subquery th
15a00 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74 74  at can be "flatt
15a10 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20 70  ened" into its p
15a20 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66  arent..  ** If f
15a30 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20 70  lattening is a p
15a40 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f  ossiblity, do so
15a50 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65   and return imme
15a60 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a  diately.  .  */.
15a70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15a80 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70  MIT_VIEW.  if( p
15a90 50 61 72 65 6e 74 20 26 26 20 70 50 61 72 65 6e  Parent && pParen
15aa0 74 41 67 67 20 26 26 0a 20 20 20 20 20 20 66 6c  tAgg &&.      fl
15ab0 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50  attenSubquery(pP
15ac0 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20 70  arse, pParent, p
15ad0 61 72 65 6e 74 54 61 62 2c 20 2a 70 50 61 72 65  arentTab, *pPare
15ae0 6e 74 41 67 67 2c 20 69 73 41 67 67 29 20 29 7b  ntAgg, isAgg) ){
15af0 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29  .    if( isAgg )
15b00 20 2a 70 50 61 72 65 6e 74 41 67 67 20 3d 20 31   *pParentAgg = 1
15b10 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  ;.    goto selec
15b20 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69  t_end;.  }.#endi
15b30 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  f..  /* If there
15b40 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
15b50 63 6c 61 75 73 65 2c 20 72 65 73 6f 6c 76 65 20  clause, resolve 
15b60 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  any collation se
15b70 71 75 65 6e 63 65 73 0a 20 20 2a 2a 20 6e 61 6d  quences.  ** nam
15b80 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65  es that have bee
15b90 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  n explicitly spe
15ba0 63 69 66 69 65 64 20 61 6e 64 20 63 72 65 61 74  cified and creat
15bb0 65 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  e a sorting inde
15bc0 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  x..  **.  ** Thi
15bd0 73 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  s sorting index 
15be0 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69  might end up bei
15bf0 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65  ng unused if the
15c00 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20   data can be .  
15c10 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e 20  ** extracted in 
15c20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72  pre-sorted order
15c30 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
15c40 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
15c50 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 56 69 72  .  ** OP_OpenVir
15c60 74 75 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  tual instruction
15c70 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
15c80 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f   to an OP_Noop o
15c90 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75  nce.  ** we figu
15ca0 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20  re out that the 
15cb0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73  sorting index is
15cc0 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68   not needed.  Th
15cd0 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a  e addrSortIndex.
15ce0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73    ** variable is
15cf0 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74   used to facilit
15d00 61 74 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e  ate that change.
15d10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
15d20 65 72 42 79 20 29 7b 0a 20 20 20 20 73 74 72 75  erBy ){.    stru
15d30 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
15d40 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 4b 65 79   *pTerm;.    Key
15d50 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
15d60 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65      for(i=0, pTe
15d70 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  rm=pOrderBy->a; 
15d80 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
15d90 72 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  r; i++, pTerm++)
15da0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
15db0 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  m->zName ){.    
15dc0 20 20 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72      pTerm->pExpr
15dd0 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  ->pColl = sqlite
15de0 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
15df0 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 7a 4e  Parse, pTerm->zN
15e00 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  ame, -1);.      
15e10 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
15e20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
15e30 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
15e40 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
15e50 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
15e60 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
15e70 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
15e80 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d  );.    pOrderBy-
15e90 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72  >iECursor = pPar
15ea0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
15eb0 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b  p->addrOpenVirt[
15ec0 32 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e 64  2] = addrSortInd
15ed0 65 78 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69  ex =.       sqli
15ee0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
15ef0 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 70 4f  _OpenVirtual, pO
15f00 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
15f10 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
15f20 72 2b 32 2c 20 0a 20 20 20 20 20 20 20 20 20 20  r+2, .          
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
15f40 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
15f50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
15f60 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  F);.  }else{.   
15f70 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d   addrSortIndex =
15f80 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   -1;.  }..  /* S
15f90 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
15fa0 20 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69    */.  computeLi
15fb0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
15fc0 72 73 65 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 49  rse, p);..  /* I
15fd0 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
15fe0 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
15ff0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
16000 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
16010 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
16020 74 3d 3d 53 52 54 5f 56 69 72 74 75 61 6c 54 61  t==SRT_VirtualTa
16030 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
16040 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
16050 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 69 50 61  OpenVirtual, iPa
16060 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rm, pEList->nExp
16070 72 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49  r);.  }...  /* I
16080 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
16090 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 4e 55 4c  mory cell to NUL
160a0 4c 20 66 6f 72 20 53 52 54 5f 4d 65 6d 20 6f 72  L for SRT_Mem or
160b0 20 30 20 66 6f 72 20 53 52 54 5f 45 78 69 73 74   0 for SRT_Exist
160c0 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  s.  */.  if( eDe
160d0 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
160e0 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73  Dest==SRT_Exists
160f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
16100 64 62 65 41 64 64 4f 70 28 76 2c 20 65 44 65 73  dbeAddOp(v, eDes
16110 74 3d 3d 53 52 54 5f 4d 65 6d 20 3f 20 4f 50 5f  t==SRT_Mem ? OP_
16120 4e 75 6c 6c 20 3a 20 4f 50 5f 49 6e 74 65 67 65  Null : OP_Intege
16130 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  r, 0, 0);.    sq
16140 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
16150 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
16160 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20  Parm, 1);.  }.. 
16170 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75   /* Open a virtu
16180 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  al index to use 
16190 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
161a0 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   set..  */.  if(
161b0 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20   isDistinct ){. 
161c0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
161d0 49 6e 66 6f 3b 0a 20 20 20 20 64 69 73 74 69 6e  Info;.    distin
161e0 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
161f0 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  b++;.    pKeyInf
16200 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
16210 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
16220 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
16230 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
16240 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c  , OP_OpenVirtual
16250 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 2c 20 0a  , distinct, 0, .
16260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16270 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
16280 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49  KeyInfo, P3_KEYI
16290 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
162a0 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69  }else{.    disti
162b0 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  nct = -1;.  }.. 
162c0 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 61 6e   /* Aggregate an
162d0 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  d non-aggregate 
162e0 71 75 65 72 69 65 73 20 61 72 65 20 68 61 6e 64  queries are hand
162f0 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
16300 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67 20  */.  if( !isAgg 
16310 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  && pGroupBy==0 )
16320 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
16330 73 65 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61 67  se is for non-ag
16340 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 0a  gregate queries.
16350 20 20 20 20 2a 2a 20 42 65 67 69 6e 20 74 68 65      ** Begin the
16360 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20   database scan. 
16370 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f     */.    pWInfo
16380 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
16390 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
163a0 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26  bList, pWhere, &
163b0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69  pOrderBy);.    i
163c0 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
163d0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
163e0 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69  .    /* If sorti
163f0 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61  ng index that wa
16400 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
16410 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 56 69 72 74  rior OP_OpenVirt
16420 75 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74  ual .    ** inst
16430 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70  ruction ended up
16440 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65   not being neede
16450 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74  d, then change t
16460 68 65 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61  he OP_OpenVirtua
16470 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e  l.    ** into an
16480 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f   OP_Noop..    */
16490 0a 20 20 20 20 69 66 28 20 61 64 64 72 53 6f 72  .    if( addrSor
164a0 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f 72  tIndex>=0 && pOr
164b0 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
164c0 20 20 75 6e 63 72 65 61 74 65 53 6f 72 74 69 6e    uncreateSortin
164d0 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 61  gIndex(pParse, a
164e0 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20  ddrSortIndex);. 
164f0 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
16500 56 69 72 74 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20  Virt[2] = -1;.  
16510 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20    }..    /* Use 
16520 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e  the standard inn
16530 65 72 20 6c 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20  er loop.    */. 
16540 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e     if( selectInn
16550 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
16560 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  , pEList, 0, 0, 
16570 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e  pOrderBy, distin
16580 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20  ct, eDest,.     
16590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
165a0 50 61 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69 43  Parm, pWInfo->iC
165b0 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d  ontinue, pWInfo-
165c0 3e 69 42 72 65 61 6b 2c 20 61 66 66 29 20 29 7b  >iBreak, aff) ){
165d0 0a 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  .       goto sel
165e0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a  ect_end;.    }..
165f0 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64      /* End the d
16600 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f  atabase scan loo
16610 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  p..    */.    sq
16620 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
16630 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Info);.  }else{.
16640 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
16650 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  he processing fo
16660 72 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  r aggregate quer
16670 69 65 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43  ies */.    NameC
16680 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f  ontext sNC;    /
16690 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
166a0 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67  or processing ag
166b0 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74  gregate informat
166c0 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ion */.    int i
166d0 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  AMem;          /
166e0 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72  * First Mem addr
166f0 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ess for storing 
16700 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
16710 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65   */.    int iBMe
16720 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
16730 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
16740 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52   for previous GR
16750 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
16760 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20  t iUseFlag;     
16770 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
16780 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e   holding flag in
16790 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74  dicating that at
167a0 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20   least.         
167b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
167c0 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65  * one row of the
167d0 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67   input to the ag
167e0 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65  gregator has bee
167f0 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
16800 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
16810 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e  cessed */.    in
16820 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20  t iAbortFlag;   
16830 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
16840 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75   which causes qu
16850 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73  ery abort if pos
16860 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74  itive */.    int
16870 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20   groupBySort;   
16880 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72   /* Rows come fr
16890 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f  om source in GRO
168a0 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 0a  UP BY order */..
168b0 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
168c0 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 20  owing variables 
168d0 68 6f 6c 64 20 61 64 64 72 65 73 73 65 73 20 6f  hold addresses o
168e0 72 20 6c 61 62 65 6c 73 20 66 6f 72 20 70 61 72  r labels for par
168f0 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ts of the.    **
16900 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
16910 20 70 72 6f 67 72 61 6d 20 77 65 20 61 72 65 20   program we are 
16920 70 75 74 74 69 6e 67 20 74 6f 67 65 74 68 65 72  putting together
16930 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
16940 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 20 20 20  OutputRow;      
16950 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72  /* Start of subr
16960 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
16970 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77  uts a result row
16980 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
16990 53 65 74 41 62 6f 72 74 3b 20 20 20 20 20 20 20  SetAbort;       
169a0 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74  /* Set the abort
169b0 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e   flag and return
169c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
169d0 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 3b 20  InitializeLoop; 
169e0 2f 2a 20 53 74 61 72 74 20 6f 66 20 63 6f 64 65  /* Start of code
169f0 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65   that initialize
16a00 73 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70  s the input loop
16a10 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
16a20 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 20 20 20 20  TopOfLoop;      
16a30 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
16a40 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  put loop */.    
16a50 69 6e 74 20 61 64 64 72 47 72 6f 75 70 42 79 43  int addrGroupByC
16a60 68 61 6e 67 65 3b 20 20 2f 2a 20 43 6f 64 65 20  hange;  /* Code 
16a70 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 20 61  that runs when a
16a80 6e 79 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  ny GROUP BY term
16a90 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20   changes */.    
16aa0 69 6e 74 20 61 64 64 72 50 72 6f 63 65 73 73 52  int addrProcessR
16ab0 6f 77 3b 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ow;     /* Code 
16ac0 74 6f 20 70 72 6f 63 65 73 73 20 61 20 73 69 6e  to process a sin
16ad0 67 6c 65 20 69 6e 70 75 74 20 72 6f 77 20 2a 2f  gle input row */
16ae0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64  .    int addrEnd
16af0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16b00 45 6e 64 20 6f 66 20 61 6c 6c 20 70 72 6f 63 65  End of all proce
16b10 73 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  ssing */.    int
16b20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b   addrSortingIdx;
16b30 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f 4f       /* The OP_O
16b40 70 65 6e 56 69 72 74 75 61 6c 20 66 6f 72 20 74  penVirtual for t
16b50 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
16b60 20 2a 2f 0a 0a 20 20 20 20 61 64 64 72 45 6e 64   */..    addrEnd
16b70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
16b80 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20  keLabel(v);..   
16b90 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43   /* Convert TK_C
16ba0 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f  OLUMN nodes into
16bb0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61   TK_AGG_COLUMN a
16bc0 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20  nd make entries 
16bd0 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e  in.    ** sAggIn
16be0 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47  fo for all TK_AG
16bf0 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73  G_FUNCTION nodes
16c00 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20   in expressions 
16c10 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45  of the.    ** SE
16c20 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
16c30 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65      */.    memse
16c40 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
16c50 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43  f(sNC));.    sNC
16c60 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
16c70 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69  ;.    sNC.pSrcLi
16c80 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
16c90 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20     sNC.pAggInfo 
16ca0 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20  = &sAggInfo;.   
16cb0 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
16cc0 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75  ngColumn = pGrou
16cd0 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e  pBy ? pGroupBy->
16ce0 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20  nExpr+1 : 0;.   
16cf0 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70   sAggInfo.pGroup
16d00 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20  By = pGroupBy;. 
16d10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
16d20 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
16d30 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 20 29  (&sNC, pEList) )
16d40 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
16d50 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
16d60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
16d70 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
16d80 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79 29  (&sNC, pOrderBy)
16d90 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
16da0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
16db0 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67  .    if( pHaving
16dc0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 41   && sqlite3ExprA
16dd0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
16de0 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 20  (&sNC, pHaving) 
16df0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
16e00 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
16e10 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63      sAggInfo.nAc
16e20 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67  cumulator = sAgg
16e30 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Info.nColumn;.  
16e40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
16e50 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b  gInfo.nFunc; i++
16e60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
16e70 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
16e80 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67  ggList(&sNC, sAg
16e90 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70  gInfo.aFunc[i].p
16ea0 45 78 70 72 2d 3e 70 4c 69 73 74 29 20 29 7b 0a  Expr->pList) ){.
16eb0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
16ec0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
16ed0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
16ee0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
16ef0 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
16f00 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20  ct_end;..    /* 
16f10 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  Processing for a
16f20 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47  ggregates with G
16f30 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20  ROUP BY is very 
16f40 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20  different and.  
16f50 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63    ** much more c
16f60 6f 6d 70 6c 65 78 20 74 68 61 20 61 67 67 72 65  omplex tha aggre
16f70 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20  gates without a 
16f80 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f  GROUP BY..    */
16f90 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
16fa0 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e  y ){.      KeyIn
16fb0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f  fo *pKeyInfo;  /
16fc0 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61  * Keying informa
16fd0 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f  tion for the gro
16fe0 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  up by clause */.
16ff0 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  .      /* Create
17000 20 6c 61 62 65 6c 73 20 74 68 61 74 20 77 65 20   labels that we 
17010 77 69 6c 6c 20 62 65 20 6e 65 65 64 69 6e 67 0a  will be needing.
17020 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 0a 20        */.     . 
17030 20 20 20 20 20 61 64 64 72 49 6e 69 74 69 61 6c       addrInitial
17040 69 7a 65 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65  izeLoop = sqlite
17050 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
17060 29 3b 0a 20 20 20 20 20 20 61 64 64 72 47 72 6f  );.      addrGro
17070 75 70 42 79 43 68 61 6e 67 65 20 3d 20 73 71 6c  upByChange = sql
17080 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
17090 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 64 64 72  l(v);.      addr
170a0 50 72 6f 63 65 73 73 52 6f 77 20 3d 20 73 71 6c  ProcessRow = sql
170b0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
170c0 6c 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  l(v);..      /* 
170d0 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52  If there is a GR
170e0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65  OUP BY clause we
170f0 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f   might need a so
17100 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20  rting index to. 
17110 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e       ** implemen
17120 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20  t it.  Allocate 
17130 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64  that sorting ind
17140 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74  ex now.  If it t
17150 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a  urns out.      *
17160 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
17170 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61   need it after a
17180 6c 6c 2c 20 74 68 65 20 4f 70 65 6e 56 69 72 74  ll, the OpenVirt
17190 75 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  ual instruction.
171a0 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
171b0 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
171c0 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20  a Noop.  .      
171d0 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66  */.      sAggInf
171e0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70  o.sortingIdx = p
171f0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
17200 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
17210 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
17220 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ist(pParse, pGro
17230 75 70 42 79 29 3b 0a 20 20 20 20 20 20 61 64 64  upBy);.      add
17240 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 0a 20 20  rSortingIdx =.  
17250 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17260 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  dbeOp3(v, OP_Ope
17270 6e 56 69 72 74 75 61 6c 2c 20 73 41 67 67 49 6e  nVirtual, sAggIn
17280 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20  fo.sortingIdx,. 
17290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172a0 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
172b0 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c  .nSortingColumn,
172c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
172d0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
172e0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  )pKeyInfo, P3_KE
172f0 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
17300 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  .      /* Initia
17310 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  lize memory loca
17320 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52  tions used by GR
17330 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65  OUP BY aggregate
17340 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20   processing.    
17350 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46    */.      iUseF
17360 6c 61 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  lag = pParse->nM
17370 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69 41 62 6f  em++;.      iAbo
17380 72 74 46 6c 61 67 20 3d 20 70 50 61 72 73 65 2d  rtFlag = pParse-
17390 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69  >nMem++;.      i
173a0 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  AMem = pParse->n
173b0 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73  Mem;.      pPars
173c0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
173d0 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
173e0 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65    iBMem = pParse
173f0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50  ->nMem;.      pP
17400 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
17410 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
17420 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17430 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
17440 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
17450 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17460 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
17470 65 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 30  e, iAbortFlag, 0
17480 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17490 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
174a0 4d 65 6d 53 74 6f 72 65 2c 20 69 55 73 65 46 6c  MemStore, iUseFl
174b0 61 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ag, 1);.      sq
174c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
174d0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29  , OP_Null, 0, 0)
174e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
174f0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
17500 65 6d 53 74 6f 72 65 2c 20 69 41 4d 65 6d 2c 20  emStore, iAMem, 
17510 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
17520 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
17530 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 49 6e  _Goto, 0, addrIn
17540 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 0a  itializeLoop);..
17550 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
17560 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
17570 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69  hat outputs a si
17580 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
17590 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
175a0 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f  set.  This subro
175b0 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b  utine first look
175c0 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61  s at the iUseFla
175d0 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a  g.  If iUseFlag.
175e0 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73        ** is less
175f0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
17600 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72  o zero, the subr
17610 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
17620 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20  p.  If.      ** 
17630 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63  the processing c
17640 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65  alls for the que
17650 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69  ry to abort, thi
17660 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  s subroutine.   
17670 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73     ** increments
17680 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20   the iAbortFlag 
17690 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
176a0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
176b0 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64   in.      ** ord
176c0 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65  er to signal the
176d0 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74   caller to abort
176e0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
176f0 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20   addrSetAbort = 
17700 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
17710 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
17720 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17730 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c  p(v, OP_MemIncr,
17740 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 30 29 3b   iAbortFlag, 0);
17750 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17760 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
17770 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  turn, 0, 0);.   
17780 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
17790 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
177a0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
177b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
177c0 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d  ddOp(v, OP_IfMem
177d0 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61  Pos, iUseFlag, a
177e0 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b  ddrOutputRow+2);
177f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17800 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
17810 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  turn, 0, 0);.   
17820 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
17830 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
17840 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
17850 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b    if( pHaving ){
17860 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17870 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
17880 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
17890 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 31 29  rOutputRow+1, 1)
178a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
178b0 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72  rc = selectInner
178c0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
178d0 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p->pEList, 0, 0,
178e0 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   pOrderBy,.     
178f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17900 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 2c 20        distinct, 
17910 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20  eDest, iParm, . 
17920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17930 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75            addrOu
17940 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53  tputRow+1, addrS
17950 65 74 41 62 6f 72 74 2c 20 61 66 66 29 3b 0a 20  etAbort, aff);. 
17960 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
17970 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
17980 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
17990 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
179a0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74  eAddOp(v, OP_Ret
179b0 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  urn, 0, 0);..   
179c0 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f     /* Begin a lo
179d0 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  op that will ext
179e0 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20  ract all source 
179f0 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59  rows in GROUP BY
17a00 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a   order..      **
17a10 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f   This might invo
17a20 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65  lve two separate
17a30 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f   loops with an O
17a40 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65  P_Sort in betwee
17a50 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  n, or.      ** i
17a60 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e  t might be a sin
17a70 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73  gle loop that us
17a80 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65  es an index to e
17a90 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69  xtract informati
17aa0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  on.      ** in t
17ab0 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74  he right order t
17ac0 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20  o begin with..  
17ad0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
17ae0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
17af0 61 62 65 6c 28 76 2c 20 61 64 64 72 49 6e 69 74  abel(v, addrInit
17b00 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20 20  ializeLoop);.   
17b10 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
17b20 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
17b30 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
17b40 70 57 68 65 72 65 2c 20 26 70 47 72 6f 75 70 42  pWhere, &pGroupB
17b50 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  y);.      if( pW
17b60 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
17b70 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
17b80 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30   if( pGroupBy==0
17b90 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
17ba0 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20  he optimizer is 
17bb0 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20  able to deliver 
17bc0 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79  rows in group by
17bd0 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20   order so.      
17be0 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68    ** we do not h
17bf0 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68  ave to sort.  Th
17c00 65 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c  e OP_OpenVirtual
17c10 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20   table will be. 
17c20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c         ** cancel
17c30 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73  led later becaus
17c40 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  e we still need 
17c50 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49  to use the pKeyI
17c60 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  nfo.        */. 
17c70 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79 20         pGroupBy 
17c80 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
17c90 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
17ca0 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rt = 0;.      }e
17cb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
17cc0 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20  Rows are coming 
17cd0 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69  out in undetermi
17ce0 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68  ned order.  We h
17cf0 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20  ave to push.    
17d00 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20      ** each row 
17d10 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69  into a sorting i
17d20 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20  ndex, terminate 
17d30 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a  the first loop,.
17d40 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
17d50 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f  loop over the so
17d60 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f  rting index in o
17d70 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20  rder to get the 
17d80 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a  output.        *
17d90 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  * in sorted orde
17da0 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  r.        */.   
17db0 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
17dc0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71   = 1;.        sq
17dd0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
17de0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47  rList(pParse, pG
17df0 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20  roupBy);.       
17e00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17e10 70 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  p(v, OP_Sequence
17e20 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
17e30 6e 67 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 20  ngIdx, 0);.     
17e40 20 20 20 6a 20 3d 20 70 47 72 6f 75 70 42 79 2d     j = pGroupBy-
17e50 3e 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 20 20  >nExpr+1;.      
17e60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
17e70 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
17e80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
17e90 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
17ea0 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49  l *pCol = &sAggI
17eb0 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20  nfo.aCol[i];.   
17ec0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
17ed0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 6a  >iSorterColumn<j
17ee0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
17ef0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
17f00 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
17f10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17f20 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
17f30 5f 52 6f 77 69 64 2c 20 70 43 6f 6c 2d 3e 69 54  _Rowid, pCol->iT
17f40 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
17f50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17f60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17f70 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
17f80 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62  lumn, pCol->iTab
17f90 6c 65 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d  le, pCol->iColum
17fa0 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  n);.          }.
17fb0 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
17fc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17fd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17fe0 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
17ff0 72 64 2c 20 6a 2c 20 30 29 3b 0a 20 20 20 20 20  rd, j, 0);.     
18000 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18010 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  dOp(v, OP_IdxIns
18020 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ert, sAggInfo.so
18030 72 74 69 6e 67 49 64 78 2c 20 30 29 3b 0a 20 20  rtingIdx, 0);.  
18040 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
18050 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
18060 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18070 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f  beAddOp(v, OP_So
18080 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
18090 74 69 6e 67 49 64 78 2c 20 30 29 3b 0a 20 20 20  tingIdx, 0);.   
180a0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73       sAggInfo.us
180b0 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b  eSortingIdx = 1;
180c0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
180d0 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
180e0 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
180f0 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65   terms and store
18100 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e   in b0, b1, b2..
18110 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69  ..      ** (b0 i
18120 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  s memory locatio
18130 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73  n iBMem+0, b1 is
18140 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f   iBMem+1, and so
18150 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a   forth).      **
18160 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68   Then compare th
18170 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
18180 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74  BY terms against
18190 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65   the GROUP BY te
181a0 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  rms.      ** fro
181b0 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  m the previous r
181c0 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ow currently sto
181d0 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61  red in a0, a1, a
181e0 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  2....      */.  
181f0 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f      addrTopOfLoo
18200 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
18210 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
18220 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
18230 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
18240 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
18250 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
18260 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
18270 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
18280 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 41 67 67 49  OP_Column, sAggI
18290 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
182a0 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  j);.        }els
182b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  e{.          sAg
182c0 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65  gInfo.directMode
182d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
182e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
182f0 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
18300 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[j].pExpr);. 
18310 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18320 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18330 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
18340 2c 20 69 42 4d 65 6d 2b 6a 2c 20 6a 3c 70 47 72  , iBMem+j, j<pGr
18350 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b  oupBy->nExpr-1);
18360 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
18370 6f 72 28 6a 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  or(j=pGroupBy->n
18380 45 78 70 72 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d  Expr-1; j>=0; j-
18390 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  -){.        if( 
183a0 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  j<pGroupBy->nExp
183b0 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r-1 ){.         
183c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
183d0 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
183e0 20 69 42 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20   iBMem+j, 0);.  
183f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18400 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18410 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
18420 69 41 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20 20  iAMem+j, 0);.   
18430 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 7b       if( j==0 ){
18440 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
18450 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
18460 50 5f 45 71 2c 20 30 2c 20 61 64 64 72 50 72 6f  P_Eq, 0, addrPro
18470 63 65 73 73 52 6f 77 29 3b 0a 20 20 20 20 20 20  cessRow);.      
18480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18490 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
184a0 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c 20 30 78  dOp(v, OP_Ne, 0x
184b0 31 30 30 2c 20 61 64 64 72 47 72 6f 75 70 42 79  100, addrGroupBy
184c0 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 20  Change);.       
184d0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
184e0 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
184f0 2c 20 2d 31 2c 20 28 76 6f 69 64 2a 29 70 4b 65  , -1, (void*)pKe
18500 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 2c  yInfo->aColl[j],
18510 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P3_COLLSEQ);.  
18520 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
18530 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
18540 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72  at runs whenever
18550 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 68   the GROUP BY ch
18560 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20  anges..      ** 
18570 43 68 61 6e 67 65 20 69 6e 20 74 68 65 20 47 52  Change in the GR
18580 4f 55 50 20 42 59 20 61 72 65 20 64 65 74 65 63  OUP BY are detec
18590 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69  ted by the previ
185a0 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a  ous code.      *
185b0 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65  * block.  If the
185c0 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67  re were no chang
185d0 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69  es, this block i
185e0 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20  s skipped..     
185f0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69   **.      ** Thi
18600 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75  s code copies cu
18610 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74  rrent group by t
18620 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32  erms in b0,b1,b2
18630 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76  ,....      ** ov
18640 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20  er to a0,a1,a2. 
18650 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74   It then calls t
18660 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  he output subrou
18670 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e  tine.      ** an
18680 64 20 72 65 73 65 74 73 20 74 68 65 20 61 67 67  d resets the agg
18690 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
186a0 6f 72 20 72 65 67 69 73 74 65 72 73 20 69 6e 20  or registers in 
186b0 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20  preparation.    
186c0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78    ** for the nex
186d0 74 20 47 52 4f 55 50 20 42 59 20 62 61 74 63 68  t GROUP BY batch
186e0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
186f0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
18700 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
18710 47 72 6f 75 70 42 79 43 68 61 6e 67 65 29 3b 0a  GroupByChange);.
18720 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
18730 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
18740 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
18750 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18760 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
18770 69 42 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20 20  iBMem+j, 0);.   
18780 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18790 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
187a0 74 6f 72 65 2c 20 69 41 4d 65 6d 2b 6a 2c 20 31  tore, iAMem+j, 1
187b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
187c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
187d0 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  p(v, OP_Gosub, 0
187e0 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
187f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
18800 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
18810 66 4d 65 6d 50 6f 73 2c 20 69 41 62 6f 72 74 46  fMemPos, iAbortF
18820 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  lag, addrEnd);. 
18830 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
18840 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
18850 41 67 67 49 6e 66 6f 29 3b 0a 0a 20 20 20 20 20  AggInfo);..     
18860 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
18870 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
18880 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74  ators based on t
18890 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20  he content of.  
188a0 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
188b0 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a  nt row.      */.
188c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
188d0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
188e0 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77 29   addrProcessRow)
188f0 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63  ;.      updateAc
18900 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
18910 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
18920 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18930 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
18940 63 72 2c 20 69 55 73 65 46 6c 61 67 2c 20 30 29  cr, iUseFlag, 0)
18950 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;..      /* End 
18960 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20  of the loop.    
18970 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67    */.      if( g
18980 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
18990 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
189a0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
189b0 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
189c0 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f  ingIdx, addrTopO
189d0 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d 65  fLoop);.      }e
189e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
189f0 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
18a00 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 75 6e  nfo);.        un
18a10 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64  createSortingInd
18a20 65 78 28 70 50 61 72 73 65 2c 20 61 64 64 72 53  ex(pParse, addrS
18a30 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20 20  ortingIdx);.    
18a40 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75    }..      /* Ou
18a50 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72  tput the final r
18a60 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20  ow of result.   
18a70 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
18a80 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
18a90 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64  OP_Gosub, 0, add
18aa0 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
18ab0 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64     .    } /* end
18ac0 69 66 20 70 47 72 6f 75 70 42 79 20 2a 2f 0a 20  if pGroupBy */. 
18ad0 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20     else {.      
18ae0 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e  /* This case run
18af0 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61  s if the aggrega
18b00 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20  te has no GROUP 
18b10 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a  BY clause.  The.
18b20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
18b30 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70  ing is much simp
18b40 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20  ler since there 
18b50 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  is only a single
18b60 20 72 6f 77 0a 20 20 20 20 20 20 2a 2a 20 6f 66   row.      ** of
18b70 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a   output..      *
18b80 2f 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63  /.      resetAcc
18b90 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
18ba0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
18bb0 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
18bc0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
18bd0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
18be0 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  pWhere, 0);.    
18bf0 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
18c00 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
18c10 64 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41  d;.      updateA
18c20 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
18c30 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
18c40 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
18c50 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
18c60 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
18c70 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
18c80 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
18c90 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
18ca0 0a 20 20 20 20 20 20 69 66 28 20 70 48 61 76 69  .      if( pHavi
18cb0 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ng ){.        sq
18cc0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
18cd0 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
18ce0 2c 20 61 64 64 72 45 6e 64 2c 20 31 29 3b 0a 20  , addrEnd, 1);. 
18cf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c       }.      sel
18d00 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
18d10 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
18d20 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20  t, 0, 0, 0, -1, 
18d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18d40 20 20 20 20 20 20 20 65 44 65 73 74 2c 20 69 50         eDest, iP
18d50 61 72 6d 2c 20 61 64 64 72 45 6e 64 2c 20 61 64  arm, addrEnd, ad
18d60 64 72 45 6e 64 2c 20 61 66 66 29 3b 0a 20 20 20  drEnd, aff);.   
18d70 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
18d80 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
18d90 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
18da0 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67  .  } /* endif ag
18db0 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
18dc0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
18dd0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
18de0 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e  lause, then we n
18df0 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20  eed to sort the 
18e00 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64  results.  ** and
18e10 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68   send them to th
18e20 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62  e callback one b
18e30 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  y one..  */.  if
18e40 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
18e50 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
18e60 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c  il(pParse, p, v,
18e70 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
18e80 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20  eDest, iParm);. 
18e90 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
18ea0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
18eb0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61  .  /* If this wa
18ec0 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 77 65  s a subquery, we
18ed0 20 68 61 76 65 20 6e 6f 77 20 63 6f 6e 76 65 72   have now conver
18ee0 74 65 64 20 74 68 65 20 73 75 62 71 75 65 72 79  ted the subquery
18ef0 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 65 6d   into a.  ** tem
18f00 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 53  porary table.  S
18f10 6f 20 64 65 6c 65 74 65 20 74 68 65 20 73 75 62  o delete the sub
18f20 71 75 65 72 79 20 73 74 72 75 63 74 75 72 65 20  query structure 
18f30 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 0a  from the parent.
18f40 20 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20    ** to prevent 
18f50 74 68 69 73 20 73 75 62 71 75 65 72 79 20 66 72  this subquery fr
18f60 6f 6d 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74  om being evaluat
18f70 65 64 20 61 67 61 69 6e 20 61 6e 64 20 74 6f 20  ed again and to 
18f80 66 6f 72 63 65 20 74 68 65 0a 20 20 2a 2a 20 74  force the.  ** t
18f90 68 65 20 75 73 65 20 6f 66 20 74 68 65 20 74 65  he use of the te
18fa0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a 20  mporary table.. 
18fb0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e   */.  if( pParen
18fc0 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
18fd0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e   pParent->pSrc->
18fe0 6e 53 72 63 3e 70 61 72 65 6e 74 54 61 62 20 29  nSrc>parentTab )
18ff0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
19000 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70  arent->pSrc->a[p
19010 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63  arentTab].pSelec
19020 74 3d 3d 70 20 29 3b 0a 20 20 20 20 73 71 6c 69  t==p );.    sqli
19030 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
19040 70 29 3b 0a 20 20 20 20 70 50 61 72 65 6e 74 2d  p);.    pParent-
19050 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54  >pSrc->a[parentT
19060 61 62 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b  ab].pSelect = 0;
19070 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
19080 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73  * The SELECT was
19090 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
190a0 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72  ded.   Set the r
190b0 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a  eturn code to 0.
190c0 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65    ** to indicate
190d0 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f   no errors..  */
190e0 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a  .  rc = 0;..  /*
190f0 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74   Control jumps t
19100 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72  o here if an err
19110 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
19120 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e  d above, or upon
19130 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  .  ** successful
19140 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53   coding of the S
19150 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65  ELECT..  */.sele
19160 63 74 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  ct_end:.  sqlite
19170 46 72 65 65 28 73 41 67 67 49 6e 66 6f 2e 61 43  Free(sAggInfo.aC
19180 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ol);.  sqliteFre
19190 65 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  e(sAggInfo.aFunc
191a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
191b0 7d 0a                                            }.