/ Hex Artifact Content
Login

Artifact e80ac3438d64bfdb1116660309f578eb1efed6e1:


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 39 35  select.c,v 1.295
0200: 20 32 30 30 36 2f 30 31 2f 31 38 20 31 36 3a 35   2006/01/18 16:5
0210: 31 3a 33 35 20 64 61 6e 69 65 6c 6b 31 39 37 37  1:35 danielk1977
0220: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
0230: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0240: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
0250: 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73  e a new Select s
0260: 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74  tructure and ret
0270: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
0280: 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75   that.** structu
0290: 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73  re..*/.Select *s
02a0: 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28  qlite3SelectNew(
02b0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
02c0: 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63  ist,     /* whic
02d0: 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63  h columns to inc
02e0: 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73 75  lude in the resu
02f0: 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  lt */.  SrcList 
0300: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a  *pSrc,        /*
0310: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
0320: 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73   -- which tables
0330: 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78   to scan */.  Ex
0340: 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
0350: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
0360: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
0370: 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c  rList *pGroupBy,
0380: 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20     /* the GROUP 
0390: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
03a0: 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20  xpr *pHaving,   
03b0: 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49       /* the HAVI
03c0: 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  NG clause */.  E
03d0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
03e0: 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45  y,   /* the ORDE
03f0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
0400: 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 2c   int isDistinct,
0410: 20 20 20 20 20 20 20 2f 2a 20 74 72 75 65 20 69         /* true i
0420: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
0430: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
0440: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69  t */.  Expr *pLi
0450: 6d 69 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  mit,         /* 
0460: 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55  LIMIT value.  NU
0470: 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65  LL means not use
0480: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66  d */.  Expr *pOf
0490: 66 73 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20  fset         /* 
04a0: 4f 46 46 53 45 54 20 76 61 6c 75 65 2e 20 20 4e  OFFSET value.  N
04b0: 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66  ULL means no off
04c0: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  set */.){.  Sele
04d0: 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  ct *pNew;.  pNew
04e0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
04f0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
0500: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4f 66  ;.  assert( !pOf
0510: 66 73 65 74 20 7c 7c 20 70 4c 69 6d 69 74 20 29  fset || pLimit )
0520: 3b 20 20 20 2f 2a 20 43 61 6e 27 74 20 68 61 76  ;   /* Can't hav
0530: 65 20 4f 46 46 53 45 54 20 77 69 74 68 6f 75 74  e OFFSET without
0540: 20 4c 49 4d 49 54 2e 20 2a 2f 0a 20 20 69 66 28   LIMIT. */.  if(
0550: 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
0560: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0570: 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20  elete(pEList);. 
0580: 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
0590: 74 44 65 6c 65 74 65 28 70 53 72 63 29 3b 0a 20  tDelete(pSrc);. 
05a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
05b0: 6c 65 74 65 28 70 57 68 65 72 65 29 3b 0a 20 20  lete(pWhere);.  
05c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
05d0: 74 44 65 6c 65 74 65 28 70 47 72 6f 75 70 42 79  tDelete(pGroupBy
05e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
05f0: 70 72 44 65 6c 65 74 65 28 70 48 61 76 69 6e 67  prDelete(pHaving
0600: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
0610: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4f 72  prListDelete(pOr
0620: 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  derBy);.    sqli
0630: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 4c  te3ExprDelete(pL
0640: 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  imit);.    sqlit
0650: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 4f 66  e3ExprDelete(pOf
0660: 66 73 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  fset);.  }else{.
0670: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d      if( pEList==
0680: 30 20 29 7b 0a 20 20 20 20 20 20 70 45 4c 69 73  0 ){.      pELis
0690: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
06a0: 69 73 74 41 70 70 65 6e 64 28 30 2c 20 73 71 6c  istAppend(0, sql
06b0: 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4c 4c 2c  ite3Expr(TK_ALL,
06c0: 30 2c 30 2c 30 29 2c 20 30 29 3b 0a 20 20 20 20  0,0,0), 0);.    
06d0: 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45 4c 69  }.    pNew->pELi
06e0: 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20  st = pEList;.   
06f0: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53   pNew->pSrc = pS
0700: 72 63 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57  rc;.    pNew->pW
0710: 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
0720: 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42     pNew->pGroupB
0730: 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
0740: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
0750: 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 70  = pHaving;.    p
0760: 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
0770: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 4e  pOrderBy;.    pN
0780: 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d  ew->isDistinct =
0790: 20 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 20   isDistinct;.   
07a0: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53   pNew->op = TK_S
07b0: 45 4c 45 43 54 3b 0a 20 20 20 20 70 4e 65 77 2d  ELECT;.    pNew-
07c0: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
07d0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 66 66  ;.    pNew->pOff
07e0: 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
07f0: 20 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20     pNew->iLimit 
0800: 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  = -1;.    pNew->
0810: 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20  iOffset = -1;.  
0820: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
0830: 56 69 72 74 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Virt[0] = -1;.  
0840: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
0850: 56 69 72 74 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  Virt[1] = -1;.  
0860: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
0870: 56 69 72 74 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20  Virt[2] = -1;.  
0880: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
0890: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
08a0: 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65  1 to 3 identifie
08b0: 72 73 20 70 72 65 63 65 65 64 69 6e 67 20 74 68  rs preceeding th
08c0: 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20  e JOIN keyword, 
08d0: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a  determine the.**
08e0: 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20   type of join.  
08f0: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
0900: 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  r constant that 
0910: 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74  expresses that t
0920: 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20  ype.** in terms 
0930: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
0940: 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a   bit values:.**.
0950: 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a  **     JT_INNER.
0960: 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a  **     JT_CROSS.
0970: 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a  **     JT_OUTER.
0980: 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41  **     JT_NATURA
0990: 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54  L.**     JT_LEFT
09a0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54  .**     JT_RIGHT
09b0: 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75  .**.** A full ou
09c0: 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20  ter join is the 
09d0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a  combination of J
09e0: 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49  T_LEFT and JT_RI
09f0: 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  GHT..**.** If an
0a00: 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75   illegal or unsu
0a10: 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70  pported join typ
0a20: 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20  e is seen, then 
0a30: 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20  still return.** 
0a40: 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74  a join type, but
0a50: 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e   put an error in
0a60: 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
0a70: 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cture..*/.int sq
0a80: 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61  lite3JoinType(Pa
0a90: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
0aa0: 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70  en *pA, Token *p
0ab0: 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20  B, Token *pC){. 
0ac0: 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
0ad0: 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c  0;.  Token *apAl
0ae0: 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70  l[3];.  Token *p
0af0: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0b00: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f   struct {.    co
0b10: 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 77 6f 72  nst char zKeywor
0b20: 64 5b 38 5d 3b 0a 20 20 20 20 75 38 20 6e 43 68  d[8];.    u8 nCh
0b30: 61 72 3b 0a 20 20 20 20 75 38 20 63 6f 64 65 3b  ar;.    u8 code;
0b40: 0a 20 20 7d 20 6b 65 79 77 6f 72 64 73 5b 5d 20  .  } keywords[] 
0b50: 3d 20 7b 0a 20 20 20 20 7b 20 22 6e 61 74 75 72  = {.    { "natur
0b60: 61 6c 22 2c 20 37 2c 20 4a 54 5f 4e 41 54 55 52  al", 7, JT_NATUR
0b70: 41 4c 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 65 66  AL },.    { "lef
0b80: 74 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46  t",    4, JT_LEF
0b90: 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20  T|JT_OUTER },.  
0ba0: 20 20 7b 20 22 72 69 67 68 74 22 2c 20 20 20 35    { "right",   5
0bb0: 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  , JT_RIGHT|JT_OU
0bc0: 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 66 75  TER },.    { "fu
0bd0: 6c 6c 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45  ll",    4, JT_LE
0be0: 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  FT|JT_RIGHT|JT_O
0bf0: 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 6f  UTER },.    { "o
0c00: 75 74 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 4f  uter",   5, JT_O
0c10: 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 69  UTER },.    { "i
0c20: 6e 6e 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 49  nner",   5, JT_I
0c30: 4e 4e 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 63  NNER },.    { "c
0c40: 72 6f 73 73 22 2c 20 20 20 35 2c 20 4a 54 5f 49  ross",   5, JT_I
0c50: 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 7d 2c  NNER|JT_CROSS },
0c60: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  .  };.  int i, j
0c70: 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70  ;.  apAll[0] = p
0c80: 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20  A;.  apAll[1] = 
0c90: 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d  pB;.  apAll[2] =
0ca0: 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   pC;.  for(i=0; 
0cb0: 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b  i<3 && apAll[i];
0cc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61   i++){.    p = a
0cd0: 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  pAll[i];.    for
0ce0: 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b  (j=0; j<sizeof(k
0cf0: 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28  eywords)/sizeof(
0d00: 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b  keywords[0]); j+
0d10: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
0d20: 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e  >n==keywords[j].
0d30: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
0d40: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
0d50: 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c  Cmp((char*)p->z,
0d60: 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 7a 4b 65   keywords[j].zKe
0d70: 79 77 6f 72 64 2c 20 70 2d 3e 6e 29 3d 3d 30 20  yword, p->n)==0 
0d80: 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e 74  ){.        joint
0d90: 79 70 65 20 7c 3d 20 6b 65 79 77 6f 72 64 73 5b  ype |= keywords[
0da0: 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20 20  j].code;.       
0db0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
0dc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e      }.    if( j>
0dd0: 3d 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73  =sizeof(keywords
0de0: 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64  )/sizeof(keyword
0df0: 73 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 6a  s[0]) ){.      j
0e00: 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52  ointype |= JT_ER
0e10: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
0e20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
0e30: 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65  (.     (jointype
0e40: 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   & (JT_INNER|JT_
0e50: 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e  OUTER))==(JT_INN
0e60: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a  ER|JT_OUTER) ||.
0e70: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
0e80: 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20   JT_ERROR)!=0.  
0e90: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
0ea0: 72 20 2a 7a 53 70 31 20 3d 20 22 20 22 3b 0a 20  r *zSp1 = " ";. 
0eb0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
0ec0: 53 70 32 20 3d 20 22 20 22 3b 0a 20 20 20 20 69  Sp2 = " ";.    i
0ed0: 66 28 20 70 42 3d 3d 30 20 29 7b 20 7a 53 70 31  f( pB==0 ){ zSp1
0ee0: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 43  ++; }.    if( pC
0ef0: 3d 3d 30 20 29 7b 20 7a 53 70 32 2b 2b 3b 20 7d  ==0 ){ zSp2++; }
0f00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
0f10: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
0f20: 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f  known or unsuppo
0f30: 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20  rted join type: 
0f40: 22 0a 20 20 20 20 20 20 20 22 25 54 25 73 25 54  ".       "%T%s%T
0f50: 25 73 25 54 22 2c 20 70 41 2c 20 7a 53 70 31 2c  %s%T", pA, zSp1,
0f60: 20 70 42 2c 20 7a 53 70 32 2c 20 70 43 29 3b 0a   pB, zSp2, pC);.
0f70: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
0f80: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65  T_INNER;.  }else
0f90: 20 69 66 28 20 6a 6f 69 6e 74 79 70 65 20 26 20   if( jointype & 
0fa0: 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20 20 20 20  JT_RIGHT ){.    
0fb0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
0fc0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22  pParse, .      "
0fd0: 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f  RIGHT and FULL O
0fe0: 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e  UTER JOINs are n
0ff0: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70  ot currently sup
1000: 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f  ported");.    jo
1010: 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45  intype = JT_INNE
1020: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
1030: 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a  jointype;.}../*.
1040: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
1050: 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  dex of a column 
1060: 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74  in a table.  Ret
1070: 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f  urn -1 if the co
1080: 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63  lumn.** is not c
1090: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
10a0: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
10b0: 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78   int columnIndex
10c0: 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f  (Table *pTab, co
10d0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b  nst char *zCol){
10e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
10f0: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
1100: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
1110: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1120: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
1130: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20  ame, zCol)==0 ) 
1140: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
1150: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
1160: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
1170: 65 20 6f 66 20 61 20 74 6f 6b 65 6e 20 74 6f 20  e of a token to 
1180: 61 20 27 5c 30 30 30 27 2d 74 65 72 6d 69 6e 61  a '\000'-termina
1190: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  ted string..*/.s
11a0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 54 6f  tatic void setTo
11b0: 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f  ken(Token *p, co
11c0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
11d0: 70 2d 3e 7a 20 3d 20 28 75 38 2a 29 7a 3b 0a 20  p->z = (u8*)z;. 
11e0: 20 70 2d 3e 6e 20 3d 20 7a 20 3f 20 73 74 72 6c   p->n = z ? strl
11f0: 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 70 2d 3e  en(z) : 0;.  p->
1200: 64 79 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  dyn = 0;.}../*.*
1210: 2a 20 43 72 65 61 74 65 20 61 6e 20 65 78 70 72  * Create an expr
1220: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20  ession node for 
1230: 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 77 69  an identifier wi
1240: 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 7a  th the name of z
1250: 4e 61 6d 65 0a 2a 2f 0a 73 74 61 74 69 63 20 45  Name.*/.static E
1260: 78 70 72 20 2a 63 72 65 61 74 65 49 64 45 78 70  xpr *createIdExp
1270: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  r(const char *zN
1280: 61 6d 65 29 7b 0a 20 20 54 6f 6b 65 6e 20 64 75  ame){.  Token du
1290: 6d 6d 79 3b 0a 20 20 73 65 74 54 6f 6b 65 6e 28  mmy;.  setToken(
12a0: 26 64 75 6d 6d 79 2c 20 7a 4e 61 6d 65 29 3b 0a  &dummy, zName);.
12b0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
12c0: 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30  Expr(TK_ID, 0, 0
12d0: 2c 20 26 64 75 6d 6d 79 29 3b 0a 7d 0a 0a 0a 2f  , &dummy);.}.../
12e0: 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20  *.** Add a term 
12f0: 74 6f 20 74 68 65 20 57 48 45 52 45 20 65 78 70  to the WHERE exp
1300: 72 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78  ression in *ppEx
1310: 70 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73  pr that requires
1320: 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c   the.** zCol col
1330: 75 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c 20  umn to be equal 
1340: 69 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  in the two table
1350: 73 20 70 54 61 62 31 20 61 6e 64 20 70 54 61 62  s pTab1 and pTab
1360: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
1370: 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a  d addWhereTerm(.
1380: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
1390: 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ol,        /* Na
13a0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
13b0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c   */.  const Tabl
13c0: 65 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20 2f  e *pTab1,      /
13d0: 2a 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a 2f  * First table */
13e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
13f0: 41 6c 69 61 73 31 2c 20 20 20 20 20 2f 2a 20 41  Alias1,     /* A
1400: 6c 69 61 73 20 66 6f 72 20 66 69 72 73 74 20 74  lias for first t
1410: 61 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  able.  May be NU
1420: 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61  LL */.  const Ta
1430: 62 6c 65 20 2a 70 54 61 62 32 2c 20 20 20 20 20  ble *pTab2,     
1440: 20 2f 2a 20 53 65 63 6f 6e 64 20 74 61 62 6c 65   /* Second table
1450: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1460: 20 2a 7a 41 6c 69 61 73 32 2c 20 20 20 20 20 2f   *zAlias2,     /
1470: 2a 20 41 6c 69 61 73 20 66 6f 72 20 73 65 63 6f  * Alias for seco
1480: 6e 64 20 74 61 62 6c 65 2e 20 20 4d 61 79 20 62  nd table.  May b
1490: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
14a0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 2c  iRightJoinTable,
14b0: 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72       /* VDBE cur
14c0: 73 6f 72 20 66 6f 72 20 74 68 65 20 72 69 67 68  sor for the righ
14d0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  t table */.  Exp
14e0: 72 20 2a 2a 70 70 45 78 70 72 20 20 20 20 20 20  r **ppExpr      
14f0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
1500: 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 74   equality term t
1510: 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  o this expressio
1520: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  n */.){.  Expr *
1530: 70 45 31 61 2c 20 2a 70 45 31 62 2c 20 2a 70 45  pE1a, *pE1b, *pE
1540: 31 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 61  1c;.  Expr *pE2a
1550: 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32 63 3b 0a  , *pE2b, *pE2c;.
1560: 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a 20 20 70    Expr *pE;..  p
1570: 45 31 61 20 3d 20 63 72 65 61 74 65 49 64 45 78  E1a = createIdEx
1580: 70 72 28 7a 43 6f 6c 29 3b 0a 20 20 70 45 32 61  pr(zCol);.  pE2a
1590: 20 3d 20 63 72 65 61 74 65 49 64 45 78 70 72 28   = createIdExpr(
15a0: 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 41 6c  zCol);.  if( zAl
15b0: 69 61 73 31 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  ias1==0 ){.    z
15c0: 41 6c 69 61 73 31 20 3d 20 70 54 61 62 31 2d 3e  Alias1 = pTab1->
15d0: 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 45 31  zName;.  }.  pE1
15e0: 62 20 3d 20 63 72 65 61 74 65 49 64 45 78 70 72  b = createIdExpr
15f0: 28 7a 41 6c 69 61 73 31 29 3b 0a 20 20 69 66 28  (zAlias1);.  if(
1600: 20 7a 41 6c 69 61 73 32 3d 3d 30 20 29 7b 0a 20   zAlias2==0 ){. 
1610: 20 20 20 7a 41 6c 69 61 73 32 20 3d 20 70 54 61     zAlias2 = pTa
1620: 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  b2->zName;.  }. 
1630: 20 70 45 32 62 20 3d 20 63 72 65 61 74 65 49 64   pE2b = createId
1640: 45 78 70 72 28 7a 41 6c 69 61 73 32 29 3b 0a 20  Expr(zAlias2);. 
1650: 20 70 45 31 63 20 3d 20 73 71 6c 69 74 65 33 45   pE1c = sqlite3E
1660: 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45 31 62  xpr(TK_DOT, pE1b
1670: 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20 20 70 45  , pE1a, 0);.  pE
1680: 32 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  2c = sqlite3Expr
1690: 28 54 4b 5f 44 4f 54 2c 20 70 45 32 62 2c 20 70  (TK_DOT, pE2b, p
16a0: 45 32 61 2c 20 30 29 3b 0a 20 20 70 45 20 3d 20  E2a, 0);.  pE = 
16b0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 45  sqlite3Expr(TK_E
16c0: 51 2c 20 70 45 31 63 2c 20 70 45 32 63 2c 20 30  Q, pE1c, pE2c, 0
16d0: 29 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70  );.  ExprSetProp
16e0: 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d  erty(pE, EP_From
16f0: 4a 6f 69 6e 29 3b 0a 20 20 70 45 2d 3e 69 52 69  Join);.  pE->iRi
1700: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 69  ghtJoinTable = i
1710: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
1720: 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c 69    *ppExpr = sqli
1730: 74 65 33 45 78 70 72 41 6e 64 28 2a 70 70 45 78  te3ExprAnd(*ppEx
1740: 70 72 2c 20 70 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pr, pE);.}../*.*
1750: 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f  * Set the EP_Fro
1760: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f  mJoin property o
1770: 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
1780: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
1790: 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20  ion..** And set 
17a0: 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  the Expr.iRightJ
17b0: 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62  oinTable to iTab
17c0: 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65 72  le for every ter
17d0: 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72  m in the.** expr
17e0: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ession..**.** Th
17f0: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
1800: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f  operty is used o
1810: 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78  n terms of an ex
1820: 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c  pression to tell
1830: 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54  .** the LEFT OUT
1840: 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69  ER JOIN processi
1850: 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68  ng logic that th
1860: 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20  is term is part 
1870: 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72  of the.** join r
1880: 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69  estriction speci
1890: 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  fied in the ON o
18a0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61  r USING clause a
18b0: 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a  nd not a part.**
18c0: 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e   of the more gen
18d0: 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  eral WHERE claus
18e0: 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  e.  These terms 
18f0: 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74  are moved over t
1900: 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63  o the.** WHERE c
1910: 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69  lause during joi
1920: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74  n processing but
1930: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   we need to reme
1940: 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a  mber that they.*
1950: 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20  * originated in 
1960: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
1970: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  clause..**.** Th
1980: 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  e Expr.iRightJoi
1990: 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65  nTable tells the
19a0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
19b0: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74 68  ocessing that th
19c0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
19d0: 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65  depends on table
19e0: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
19f0: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74 61   even if that ta
1a00: 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78  ble is not.** ex
1a10: 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e  plicitly mention
1a20: 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  ed in the expres
1a30: 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f  sion.  That info
1a40: 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65  rmation is neede
1a50: 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c  d.** for cases l
1a60: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1a70: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1a80: 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
1a90: 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e   ON t1.a=t2.b AN
1aa0: 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54  D t1.x=5.**.** T
1ab0: 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
1ac0: 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20 74  needs to defer t
1ad0: 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74  he handling of t
1ae0: 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72  he t1.x=5.** ter
1af0: 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  m until after th
1b00: 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65  e t2 loop of the
1b10: 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20   join.  In that 
1b20: 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74  way, a.** NULL t
1b30: 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e  2 row will be in
1b40: 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72 20  serted whenever 
1b50: 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20  t1.x!=5.  If we 
1b60: 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20  do not.** defer 
1b70: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
1b80: 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20  t1.x=5, it will 
1b90: 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d  be processed imm
1ba0: 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65  ediately.** afte
1bb0: 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e  r the t1 loop an
1bc0: 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78  d rows with t1.x
1bd0: 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  !=5 will never a
1be0: 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20  ppear in.** the 
1bf0: 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69 73  output, which is
1c00: 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73   incorrect..*/.s
1c10: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f  tatic void setJo
1c20: 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20  inExpr(Expr *p, 
1c30: 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77  int iTable){.  w
1c40: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45  hile( p ){.    E
1c50: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
1c60: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a  , EP_FromJoin);.
1c70: 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69      p->iRightJoi
1c80: 6e 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b  nTable = iTable;
1c90: 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72  .    setJoinExpr
1ca0: 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  (p->pLeft, iTabl
1cb0: 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  e);.    p = p->p
1cc0: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
1cd0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1ce0: 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20  e processes the 
1cf0: 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  join information
1d00: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
1d10: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61  atement..** ON a
1d20: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
1d30: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
1d40: 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20  nto extra terms 
1d50: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1d60: 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20  use..** NATURAL 
1d70: 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74  joins also creat
1d80: 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c  e extra WHERE cl
1d90: 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a  ause terms..**.*
1da0: 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61  * The terms of a
1db0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65   FROM clause are
1dc0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
1dd0: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74  e Select.pSrc st
1de0: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20  ructure..** The 
1df0: 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20  left most table 
1e00: 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  is the first ent
1e10: 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72  ry in Select.pSr
1e20: 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  c.  The right-mo
1e30: 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74  st.** table is t
1e40: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20  he last entry.  
1e50: 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  The join operato
1e60: 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65  r is held in the
1e70: 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65   entry to.** the
1e80: 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74   left.  Thus ent
1e90: 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68  ry 0 contains th
1ea0: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
1eb0: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74  for the join bet
1ec0: 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ween.** entries 
1ed0: 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e  0 and 1.  Any ON
1ee0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
1ef0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1f00: 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a  h the join are.*
1f10: 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20  * also attached 
1f20: 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72  to the left entr
1f30: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
1f40: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1f50: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
1f60: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  rs encountered..
1f70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
1f80: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
1f90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1fa0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
1fb0: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fd0: 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  All tables in th
1fe0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
1ff0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2010: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2020: 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ers */.  struct 
2030: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
2040: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74  eft;     /* Left
2050: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
2060: 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
2070: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52  SrcList_item *pR
2080: 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68  ight;    /* Righ
2090: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
20a0: 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20  ined */..  pSrc 
20b0: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65  = p->pSrc;.  pLe
20c0: 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d  ft = &pSrc->a[0]
20d0: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c  ;.  pRight = &pL
20e0: 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d  eft[1];.  for(i=
20f0: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
2100: 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b  1; i++, pRight++
2110: 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20  , pLeft++){.    
2120: 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20  Table *pLeftTab 
2130: 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20  = pLeft->pTab;. 
2140: 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74     Table *pRight
2150: 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54  Tab = pRight->pT
2160: 61 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 65  ab;..    if( pLe
2170: 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67  ftTab==0 || pRig
2180: 68 74 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69  htTab==0 ) conti
2190: 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65  nue;..    /* Whe
21a0: 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  n the NATURAL ke
21b0: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
21c0: 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75  , add WHERE clau
21d0: 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20  se terms for.   
21e0: 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   ** every column
21f0: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61   that the two ta
2200: 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d  bles have in com
2210: 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mon..    */.    
2220: 69 66 28 20 70 4c 65 66 74 2d 3e 6a 6f 69 6e 74  if( pLeft->joint
2230: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
2240: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   ){.      if( pL
2250: 65 66 74 2d 3e 70 4f 6e 20 7c 7c 20 70 4c 65 66  eft->pOn || pLef
2260: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
2270: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2280: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
2290: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79  NATURAL join may
22a0: 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20   not have ".    
22b0: 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72         "an ON or
22c0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20   USING clause", 
22d0: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
22e0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
22f0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2300: 4c 65 66 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a  LeftTab->nCol; j
2310: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
2320: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 65 66 74  r *zName = pLeft
2330: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
2340: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
2350: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67  columnIndex(pRig
2360: 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30  htTab, zName)>=0
2370: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64   ){.          ad
2380: 64 57 68 65 72 65 54 65 72 6d 28 7a 4e 61 6d 65  dWhereTerm(zName
2390: 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66  , pLeftTab, pLef
23a0: 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20  t->zAlias, .    
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
23d0: 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c  Tab, pRight->zAl
23e0: 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ias,.           
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2400: 20 20 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73     pRight->iCurs
2410: 6f 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b  or, &p->pWhere);
2420: 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  .          .    
2430: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2440: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61    }..    /* Disa
2450: 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64  llow both ON and
2460: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69   USING clauses i
2470: 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a  n the same join.
2480: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2490: 4c 65 66 74 2d 3e 70 4f 6e 20 26 26 20 70 4c 65  Left->pOn && pLe
24a0: 66 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ft->pUsing ){.  
24b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
24c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
24d0: 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e  not have both ON
24e0: 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20   and USING ".   
24f0: 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e       "clauses in
2500: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29   the same join")
2510: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2520: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2530: 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  Add the ON claus
2540: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  e to the end of 
2550: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2560: 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  , connected by. 
2570: 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65     ** an AND ope
2580: 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  rator..    */.  
2590: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 70 4f 6e    if( pLeft->pOn
25a0: 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69   ){.      setJoi
25b0: 6e 45 78 70 72 28 70 4c 65 66 74 2d 3e 70 4f 6e  nExpr(pLeft->pOn
25c0: 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f  , pRight->iCurso
25d0: 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68  r);.      p->pWh
25e0: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
25f0: 72 41 6e 64 28 70 2d 3e 70 57 68 65 72 65 2c 20  rAnd(p->pWhere, 
2600: 70 4c 65 66 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20  pLeft->pOn);.   
2610: 20 20 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 3d 20     pLeft->pOn = 
2620: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
2630: 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74 65   Create extra te
2640: 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45  rms on the WHERE
2650: 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68   clause for each
2660: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20   column named.  
2670: 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e    ** in the USIN
2680: 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70  G clause.  Examp
2690: 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74  le: If the two t
26a0: 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e  ables to be join
26b0: 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41  ed are .    ** A
26c0: 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55   and B and the U
26d0: 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65  SING clause name
26e0: 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74  s X, Y, and Z, t
26f0: 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20  hen add this.   
2700: 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45   ** to the WHERE
2710: 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d   clause:    A.X=
2720: 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20  B.X AND A.Y=B.Y 
2730: 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20  AND A.Z=B.Z.    
2740: 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  ** Report an err
2750: 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e  or if any column
2760: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
2770: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69  e USING clause i
2780: 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e  s.    ** not con
2790: 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74  tained in both t
27a0: 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e  ables to be join
27b0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
27c0: 66 28 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67  f( pLeft->pUsing
27d0: 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74   ){.      IdList
27e0: 20 2a 70 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d   *pList = pLeft-
27f0: 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66  >pUsing;.      f
2800: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d  or(j=0; j<pList-
2810: 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nId; j++){.    
2820: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
2830: 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e  = pList->a[j].zN
2840: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
2850: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65   columnIndex(pLe
2860: 66 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20  ftTab, zName)<0 
2870: 7c 7c 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  || columnIndex(p
2880: 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29  RightTab, zName)
2890: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
28a0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
28b0: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
28c0: 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d  join using colum
28d0: 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a  n %s - column ".
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74              "not
28f0: 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68   present in both
2900: 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29   tables", zName)
2910: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
2920: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
2930: 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65          addWhere
2940: 54 65 72 6d 28 7a 4e 61 6d 65 2c 20 70 4c 65 66  Term(zName, pLef
2950: 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c  tTab, pLeft->zAl
2960: 69 61 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ias, .          
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2980: 20 20 70 52 69 67 68 74 54 61 62 2c 20 70 52 69    pRightTab, pRi
2990: 67 68 74 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20 20  ght->zAlias,.   
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d           pRight-
29c0: 3e 69 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57  >iCursor, &p->pW
29d0: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  here);.      }. 
29e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
29f0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  n 0;.}../*.** De
2a00: 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53  lete the given S
2a10: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
2a20: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
2a30: 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  ubstructures..*/
2a40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
2a50: 65 63 74 44 65 6c 65 74 65 28 53 65 6c 65 63 74  ectDelete(Select
2a60: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30   *p){.  if( p==0
2a70: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
2a80: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
2a90: 74 65 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  te(p->pEList);. 
2aa0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
2ab0: 65 6c 65 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a  elete(p->pSrc);.
2ac0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
2ad0: 65 74 65 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a  ete(p->pWhere);.
2ae0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
2af0: 74 44 65 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75  tDelete(p->pGrou
2b00: 70 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  pBy);.  sqlite3E
2b10: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 48 61  xprDelete(p->pHa
2b20: 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  ving);.  sqlite3
2b30: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
2b40: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73  ->pOrderBy);.  s
2b50: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
2b60: 74 65 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  te(p->pPrior);. 
2b70: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
2b80: 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  te(p->pLimit);. 
2b90: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
2ba0: 74 65 28 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a  te(p->pOffset);.
2bb0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
2bc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
2bd0: 20 63 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74   code into "v" t
2be0: 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68  hat will push th
2bf0: 65 20 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20  e record on the 
2c00: 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74  top of the.** st
2c10: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72  ack into the sor
2c20: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
2c30: 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74  oid pushOntoSort
2c40: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
2c50: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
2c60: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
2c70: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
2c80: 72 64 65 72 42 79 2c 20 20 20 20 2f 2a 20 54 68  rderBy,    /* Th
2c90: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2ca0: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
2cb0: 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 2f 2a  Select        /*
2cc0: 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43   The whole SELEC
2cd0: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29  T statement */.)
2ce0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
2cf0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73  arse->pVdbe;.  s
2d00: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
2d10: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2d20: 4f 72 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69  OrderBy);.  sqli
2d30: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2d40: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72  OP_Sequence, pOr
2d50: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
2d60: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
2d70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
2d80: 6c 6c 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ll, pOrderBy->nE
2d90: 78 70 72 20 2b 20 31 2c 20 30 29 3b 0a 20 20 73  xpr + 1, 0);.  s
2da0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2db0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
2dc0: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
2dd0: 72 20 2b 20 32 2c 20 30 29 3b 0a 20 20 73 71 6c  r + 2, 0);.  sql
2de0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
2df0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
2e00: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
2e10: 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65  r, 0);.  if( pSe
2e20: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20  lect->iLimit>=0 
2e30: 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31  ){.    int addr1
2e40: 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61 64 64  , addr2;.    add
2e50: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
2e60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65  AddOp(v, OP_IfMe
2e70: 6d 5a 65 72 6f 2c 20 70 53 65 6c 65 63 74 2d 3e  mZero, pSelect->
2e80: 69 4c 69 6d 69 74 2b 31 2c 20 30 29 3b 0a 20 20  iLimit+1, 0);.  
2e90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2ea0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72  Op(v, OP_MemIncr
2eb0: 2c 20 2d 31 2c 20 70 53 65 6c 65 63 74 2d 3e 69  , -1, pSelect->i
2ec0: 4c 69 6d 69 74 2b 31 29 3b 0a 20 20 20 20 61 64  Limit+1);.    ad
2ed0: 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
2ee0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
2ef0: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  o, 0, 0);.    sq
2f00: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2f10: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
2f20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f30: 70 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f  p(v, OP_Last, pO
2f40: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
2f50: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2f60: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
2f70: 5f 44 65 6c 65 74 65 2c 20 70 4f 72 64 65 72 42  _Delete, pOrderB
2f80: 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30 29 3b  y->iECursor, 0);
2f90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2fa0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
2fb0: 32 29 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 2d  2);.    pSelect-
2fc0: 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  >iLimit = -1;.  
2fd0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63  }.}../*.** Add c
2fe0: 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
2ff0: 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73   the OFFSET.*/.s
3000: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f  tatic void codeO
3010: 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76  ffset(.  Vdbe *v
3020: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ,          /* Ge
3030: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
3040: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65   this VM */.  Se
3050: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
3060: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
3070: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
3080: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ded */.  int iCo
3090: 6e 74 69 6e 75 65 2c 20 20 20 20 2f 2a 20 4a 75  ntinue,    /* Ju
30a0: 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20  mp here to skip 
30b0: 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f  the current reco
30c0: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 70  rd */.  int nPop
30d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
30e0: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 6f 20  ber of times to 
30f0: 70 6f 70 20 73 74 61 63 6b 20 77 68 65 6e 20 6a  pop stack when j
3100: 75 6d 70 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69  umping */.){.  i
3110: 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 3e 3d 30  f( p->iOffset>=0
3120: 20 26 26 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30   && iContinue!=0
3130: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
3140: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3150: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
3160: 49 6e 63 72 2c 20 2d 31 2c 20 70 2d 3e 69 4f 66  Incr, -1, p->iOf
3170: 66 73 65 74 29 3b 0a 20 20 20 20 61 64 64 72 20  fset);.    addr 
3180: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
3190: 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 4e 65  Op(v, OP_IfMemNe
31a0: 67 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 30  g, p->iOffset, 0
31b0: 29 3b 0a 20 20 20 20 69 66 28 20 6e 50 6f 70 3e  );.    if( nPop>
31c0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
31d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
31e0: 50 5f 50 6f 70 2c 20 6e 50 6f 70 2c 20 30 29 3b  P_Pop, nPop, 0);
31f0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
3200: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3210: 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74  P_Goto, 0, iCont
3220: 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43  inue);.    VdbeC
3230: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 6b  omment((v, "# sk
3240: 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64  ip OFFSET record
3250: 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  s"));.    sqlite
3260: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
3270: 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   addr);.  }.}../
3280: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68  *.** Add code th
3290: 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f  at will check to
32a0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 74   make sure the t
32b0: 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 6f 66  op N elements of
32c0: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 61 72   the.** stack ar
32d0: 65 20 64 69 73 74 69 6e 63 74 2e 20 20 69 54 61  e distinct.  iTa
32e0: 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69  b is a sorting i
32f0: 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20  ndex that holds 
3300: 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65  previously.** se
3310: 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  en combinations 
3320: 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e  of the N values.
3330: 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
3340: 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a   made in iTab.**
3350: 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
3360: 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77  N values are new
3370: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74  ..**.** A jump t
3380: 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73 20  o addrRepeat is 
3390: 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4b 20 76  made and the K v
33a0: 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65 64  alues are popped
33b0: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61   from the.** sta
33c0: 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20  ck if the top N 
33d0: 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74  elements are not
33e0: 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74   distinct..*/.st
33f0: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69  atic void codeDi
3400: 73 74 69 6e 63 74 28 0a 20 20 56 64 62 65 20 2a  stinct(.  Vdbe *
3410: 76 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v,           /* 
3420: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
3430: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
3440: 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20  int iTab,       
3450: 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20     /* A sorting 
3460: 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65  index used to te
3470: 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e  st for distinctn
3480: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ess */.  int add
3490: 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a  rRepeat,    /* J
34a0: 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e  ump to here if n
34b0: 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  ot distinct */. 
34c0: 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
34d0: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 70 20 4e      /* The top N
34e0: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
34f0: 20 73 74 61 63 6b 20 6d 75 73 74 20 62 65 20 64   stack must be d
3500: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
3510: 20 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   K              
3520: 2f 2a 20 50 6f 70 20 4b 20 65 6c 65 6d 65 6e 74  /* Pop K element
3530: 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  s from the stack
3540: 20 69 66 20 69 6e 64 69 73 74 69 6e 63 74 20 2a   if indistinct *
3550: 2f 0a 29 7b 0a 23 69 66 20 4e 55 4c 4c 5f 41 4c  /.){.#if NULL_AL
3560: 57 41 59 53 5f 44 49 53 54 49 4e 43 54 0a 20 20  WAYS_DISTINCT.  
3570: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3580: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d  (v, OP_IsNull, -
3590: 4e 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  N, sqlite3VdbeCu
35a0: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 36 29 3b  rrentAddr(v)+6);
35b0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
35c0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
35d0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 2d 4e 2c  _MakeRecord, -N,
35e0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
35f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69  beAddOp(v, OP_Di
3600: 73 74 69 6e 63 74 2c 20 69 54 61 62 2c 20 73 71  stinct, iTab, sq
3610: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
3620: 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 73 71  Addr(v)+3);.  sq
3630: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3640: 2c 20 4f 50 5f 50 6f 70 2c 20 4b 2c 20 30 29 3b  , OP_Pop, K, 0);
3650: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3660: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
3670: 30 2c 20 61 64 64 72 52 65 70 65 61 74 29 3b 0a  0, addrRepeat);.
3680: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
3690: 2c 20 22 23 20 73 6b 69 70 20 69 6e 64 69 73 74  , "# skip indist
36a0: 69 6e 63 74 20 72 65 63 6f 72 64 73 22 29 29 3b  inct records"));
36b0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
36c0: 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  dOp(v, OP_IdxIns
36d0: 65 72 74 2c 20 69 54 61 62 2c 20 30 29 3b 0a 7d  ert, iTab, 0);.}
36e0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
36f0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
3700: 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  the code for the
3710: 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69   inside of the i
3720: 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
3730: 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  a SELECT..**.** 
3740: 49 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e 43  If srcTab and nC
3750: 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a  olumn are both z
3760: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 45  ero, then the pE
3770: 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73  List expressions
3780: 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65  .** are evaluate
3790: 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  d in order to ge
37a0: 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  t the data for t
37b0: 68 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f  his row.  If nCo
37c0: 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64  lumn>0.** then d
37d0: 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72  ata is pulled fr
37e0: 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45  om srcTab and pE
37f0: 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c  List is used onl
3800: 79 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20  y to get the.** 
3810: 64 61 74 61 74 79 70 65 73 20 66 6f 72 20 65 61  datatypes for ea
3820: 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74  ch column..*/.st
3830: 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 49  atic int selectI
3840: 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73  nnerLoop(.  Pars
3850: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
3860: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
3870: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
3880: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
3890: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
38a0: 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74  mplete select st
38b0: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
38c0: 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ded */.  ExprLis
38d0: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
38e0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75   /* List of valu
38f0: 65 73 20 62 65 69 6e 67 20 65 78 74 72 61 63 74  es being extract
3900: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54  ed */.  int srcT
3910: 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
3920: 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f  /* Pull data fro
3930: 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  m this table */.
3940: 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20    int nColumn,  
3950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3960: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
3970: 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  n the source tab
3980: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
3990: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
39a0: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
39b0: 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75 73 69  sort results usi
39c0: 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20  ng this key */. 
39d0: 20 69 6e 74 20 64 69 73 74 69 6e 63 74 2c 20 20   int distinct,  
39e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e           /* If >
39f0: 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65  =0, make sure re
3a00: 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 69 6e  sults are distin
3a10: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ct */.  int eDes
3a20: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
3a30: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
3a40: 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73  e of the results
3a50: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c   */.  int iParm,
3a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3a70: 20 41 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20   An argument to 
3a80: 74 68 65 20 64 69 73 70 6f 73 61 6c 20 6d 65 74  the disposal met
3a90: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  hod */.  int iCo
3aa0: 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20  ntinue,         
3ab0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
3ac0: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
3ad0: 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74  ext row */.  int
3ae0: 20 69 42 72 65 61 6b 2c 20 20 20 20 20 20 20 20   iBreak,        
3af0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
3b00: 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
3b10: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
3b20: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20   */.  char *aff 
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b40: 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
3b50: 20 69 66 20 65 44 65 73 74 20 69 73 20 53 52 54   if eDest is SRT
3b60: 5f 55 6e 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56  _Union */.){.  V
3b70: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
3b80: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
3b90: 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e  .  int hasDistin
3ba0: 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ct;        /* Tr
3bb0: 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
3bc0: 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  CT keyword is pr
3bd0: 65 73 65 6e 74 20 2a 2f 0a 0a 20 20 69 66 28 20  esent */..  if( 
3be0: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  v==0 ) return 0;
3bf0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73  .  assert( pELis
3c00: 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  t!=0 );..  /* If
3c10: 20 74 68 65 72 65 20 77 61 73 20 61 20 4c 49 4d   there was a LIM
3c20: 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  IT clause on the
3c30: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3c40: 74 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 63  t, then do the c
3c50: 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65  heck.  ** to see
3c60: 20 69 66 20 74 68 69 73 20 72 6f 77 20 73 68 6f   if this row sho
3c70: 75 6c 64 20 62 65 20 6f 75 74 70 75 74 2e 0a 20  uld be output.. 
3c80: 20 2a 2f 0a 20 20 68 61 73 44 69 73 74 69 6e 63   */.  hasDistinc
3c90: 74 20 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30 20  t = distinct>=0 
3ca0: 26 26 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  && pEList && pEL
3cb0: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 3b 0a 20 20  ist->nExpr>0;.  
3cc0: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
3cd0: 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20  && !hasDistinct 
3ce0: 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  ){.    codeOffse
3cf0: 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75  t(v, p, iContinu
3d00: 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e, 0);.  }..  /*
3d10: 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73   Pull the reques
3d20: 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a  ted columns..  *
3d30: 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e  /.  if( nColumn>
3d40: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
3d50: 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ; i<nColumn; i++
3d60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3d70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3d80: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
3d90: 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  i);.    }.  }els
3da0: 65 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d  e{.    nColumn =
3db0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
3dc0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
3dd0: 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
3de0: 73 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  se, pEList);.  }
3df0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49  ..  /* If the DI
3e00: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77  STINCT keyword w
3e10: 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68  as present on th
3e20: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
3e30: 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73  nt.  ** and this
3e40: 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65   row has been se
3e50: 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20  en before, then 
3e60: 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73  do not make this
3e70: 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f   row.  ** part o
3e80: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  f the result..  
3e90: 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74  */.  if( hasDist
3ea0: 69 6e 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  inct ){.    int 
3eb0: 6e 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  n = pEList->nExp
3ec0: 72 3b 0a 20 20 20 20 63 6f 64 65 44 69 73 74 69  r;.    codeDisti
3ed0: 6e 63 74 28 76 2c 20 64 69 73 74 69 6e 63 74 2c  nct(v, distinct,
3ee0: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 2c 20 6e   iContinue, n, n
3ef0: 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72  +1);.    if( pOr
3f00: 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
3f10: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
3f20: 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43  p, iContinue, nC
3f30: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  olumn);.    }.  
3f40: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
3f50: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
3f60: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
3f70: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
3f80: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
3f90: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
3fa0: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
3fb0: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
3fc0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
3fd0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
3fe0: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
3ff0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4000: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4010: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f  _MakeRecord, nCo
4020: 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59  lumn, NULL_ALWAY
4030: 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a 20 20 20  S_DISTINCT);.   
4040: 20 20 20 69 66 28 20 61 66 66 20 29 7b 0a 20 20     if( aff ){.  
4050: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4060: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
4070: 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49 43 29   aff, P3_STATIC)
4080: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4090: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
40a0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
40b0: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
40c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
40d0: 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  .    /* Construc
40e0: 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  t a record from 
40f0: 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74  the query result
4100: 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66  , but instead of
4110: 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74  .    ** saving t
4120: 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20  hat record, use 
4130: 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64  it as a key to d
4140: 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66  elete elements f
4150: 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74  rom.    ** the t
4160: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
4170: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Parm..    */.   
4180: 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74   case SRT_Except
4190: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
41a0: 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  dr;.      addr =
41b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
41c0: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
41d0: 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c  rd, nColumn, NUL
41e0: 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43  L_ALWAYS_DISTINC
41f0: 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  T);.      sqlite
4200: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
4210: 20 2d 31 2c 20 61 66 66 2c 20 50 33 5f 53 54 41   -1, aff, P3_STA
4220: 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TIC);.      sqli
4230: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4240: 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 50 61  OP_NotFound, iPa
4250: 72 6d 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20  rm, addr+3);.   
4260: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4270: 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65  dOp(v, OP_Delete
4280: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
4290: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
42a0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53  #endif..    /* S
42b0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
42c0: 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
42d0: 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
42e0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
42f0: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
4300: 53 52 54 5f 56 69 72 74 75 61 6c 54 61 62 3a 20  SRT_VirtualTab: 
4310: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
4320: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
4330: 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75  akeRecord, nColu
4340: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  mn, 0);.      if
4350: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
4360: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
4370: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  rter(pParse, pOr
4380: 64 65 72 42 79 2c 20 70 29 3b 0a 20 20 20 20 20  derBy, p);.     
4390: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
43a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
43b0: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
43c0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
43d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
43e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c  ddOp(v, OP_Pull,
43f0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
4400: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4410: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
4420: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
4430: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4440: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
4450: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
4460: 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
4470: 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
4480: 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
4490: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
44a0: 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
44b0: 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
44c0: 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
44d0: 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
44e0: 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
44f0: 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
4500: 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
4510: 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
4520: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
4530: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
4540: 20 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71 6c   int addr1 = sql
4550: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
4560: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  ddr(v);.      in
4570: 74 20 61 64 64 72 32 3b 0a 0a 20 20 20 20 20 20  t addr2;..      
4580: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
4590: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
45a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
45b0: 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20  OP_NotNull, -1, 
45c0: 61 64 64 72 31 2b 33 29 3b 0a 20 20 20 20 20 20  addr1+3);.      
45d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
45e0: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
45f0: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 32 20 3d  );.      addr2 =
4600: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4610: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
4620: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
4630: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
4640: 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67     /* At first g
4650: 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20  lance you would 
4660: 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f  think we could o
4670: 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a  ptimize out the.
4680: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
4690: 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65   BY in this case
46a0: 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72   since the order
46b0: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
46c0: 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a  he set.        *
46d0: 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  * does not matte
46e0: 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69  r.  But there mi
46f0: 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63  ght be a LIMIT c
4700: 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a  lause, in which.
4710: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
4720: 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d  the order does m
4730: 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  atter */.       
4740: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
4750: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
4760: 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , p);.      }els
4770: 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  e{.        char 
4780: 61 66 66 20 3d 20 28 69 50 61 72 6d 3e 3e 31 36  aff = (iParm>>16
4790: 29 26 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20  )&0xFF;.        
47a0: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  aff = sqlite3Com
47b0: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c  pareAffinity(pEL
47c0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
47d0: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 73   aff);.        s
47e0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
47f0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4800: 31 2c 20 30 2c 20 26 61 66 66 2c 20 31 29 3b 0a  1, 0, &aff, 1);.
4810: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4820: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
4830: 64 78 49 6e 73 65 72 74 2c 20 28 69 50 61 72 6d  dxInsert, (iParm
4840: 26 30 78 30 30 30 30 46 46 46 46 29 2c 20 30 29  &0x0000FFFF), 0)
4850: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4860: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
4870: 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20  ere(v, addr2);. 
4880: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4890: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79  }..    /* If any
48a0: 20 72 6f 77 20 65 78 69 73 74 73 20 69 6e 20 74   row exists in t
48b0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72  he result set, r
48c0: 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20  ecord that fact 
48d0: 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a  and abort..    *
48e0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
48f0: 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73  xists: {.      s
4900: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4910: 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c  v, OP_MemInt, 1,
4920: 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 73   iParm);.      s
4930: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4940: 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75  v, OP_Pop, nColu
4950: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a  mn, 0);.      /*
4960: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
4970: 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
4980: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
4990: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
49a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
49b0: 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
49c0: 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
49d0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
49e0: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
49f0: 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
4a00: 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
4a10: 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
4a20: 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
4a30: 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
4a40: 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
4a50: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
4a60: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
4a70: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
4a80: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   );.      if( pO
4a90: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
4aa0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
4ab0: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
4ac0: 79 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c  y, p);.      }el
4ad0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
4ae0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4af0: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61  OP_MemStore, iPa
4b00: 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  rm, 1);.        
4b10: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
4b20: 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
4b30: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
4b40: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r us */.      }.
4b50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4b60: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
4b70: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4b80: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
4b90: 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61    /* Send the da
4ba0: 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ta to the callba
4bb0: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74  ck function or t
4bc0: 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  o a subroutine. 
4bd0: 20 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   In the.    ** c
4be0: 61 73 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ase of a subrout
4bf0: 69 6e 65 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ine, the subrout
4c00: 69 6e 65 20 69 74 73 65 6c 66 20 69 73 20 72 65  ine itself is re
4c10: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20  sponsible for.  
4c20: 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68 65    ** popping the
4c30: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73   data from the s
4c40: 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tack..    */.   
4c50: 20 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75   case SRT_Subrou
4c60: 74 69 6e 65 3a 0a 20 20 20 20 63 61 73 65 20 53  tine:.    case S
4c70: 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20  RT_Callback: {. 
4c80: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
4c90: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  y ){.        sql
4ca0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4cb0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4cc0: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
4cd0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
4ce0: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
4cf0: 65 72 42 79 2c 20 70 29 3b 0a 20 20 20 20 20 20  erBy, p);.      
4d00: 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d  }else if( eDest=
4d10: 3d 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20  =SRT_Subroutine 
4d20: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4d30: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4d40: 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72  P_Gosub, 0, iPar
4d50: 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
4d60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4d70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4d80: 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d  Callback, nColum
4d90: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n, 0);.      }. 
4da0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4db0: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
4dc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
4dd0: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
4de0: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
4df0: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
4e00: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
4e10: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
4e20: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
4e30: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
4e40: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
4e50: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
4e60: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
4e70: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
4e80: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
4e90: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
4ea0: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
4eb0: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
4ec0: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
4ed0: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
4ee0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
4ef0: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
4f00: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
4f10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4f20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
4f30: 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  p, nColumn, 0);.
4f40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4f50: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
4f60: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
4f70: 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
4f80: 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
4f90: 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20  reached..  */.  
4fa0: 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30  if( p->iLimit>=0
4fb0: 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   && pOrderBy==0 
4fc0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
4fd0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
4fe0: 6d 49 6e 63 72 2c 20 2d 31 2c 20 70 2d 3e 69 4c  mIncr, -1, p->iL
4ff0: 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  imit);.    sqlit
5000: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5010: 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 2d 3e  P_IfMemZero, p->
5020: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
5030: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
5040: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
5050: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
5060: 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b  st, generate a K
5070: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
5080: 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a   that records.**
5090: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
50a0: 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68  equence for each
50b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
50c0: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  hat expression l
50d0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ist..**.** If th
50e0: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e  e ExprList is an
50f0: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
5100: 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68 65  UP BY clause the
5110: 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a  n the resulting.
5120: 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  ** KeyInfo struc
5130: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
5140: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
5150: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69  zing a virtual i
5160: 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65  ndex to.** imple
5170: 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65  ment that clause
5180: 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  .  If the ExprLi
5190: 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  st is the result
51a0: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
51b0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79  .** then the Key
51c0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
51d0: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
51e0: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
51f0: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65   virtual.** inde
5200: 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  x to implement a
5210: 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a   DISTINCT test..
5220: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
5230: 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  old the KeyInfo 
5240: 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74  structure is obt
5250: 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ain from malloc.
5260: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a    The calling.**
5270: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
5280: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65  ponsible for see
5290: 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
52a0: 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
52b0: 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20  ually.** freed. 
52c0: 20 41 64 64 20 74 68 65 20 4b 65 79 49 6e 66 6f   Add the KeyInfo
52d0: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 68   structure to th
52e0: 65 20 50 33 20 66 69 65 6c 64 20 6f 66 20 61 6e  e P3 field of an
52f0: 20 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a   opcode using.**
5300: 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
5310: 4f 46 46 20 69 73 20 74 68 65 20 75 73 75 61 6c  OFF is the usual
5320: 20 77 61 79 20 6f 66 20 64 65 61 6c 69 6e 67 20   way of dealing 
5330: 77 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  with this..*/.st
5340: 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65  atic KeyInfo *ke
5350: 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
5360: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
5370: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
5380: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
5390: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
53a0: 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65   int nExpr;.  Ke
53b0: 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20  yInfo *pInfo;.  
53c0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
53d0: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
53e0: 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d  nt i;..  nExpr =
53f0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
5400: 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d   pInfo = sqliteM
5410: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
5420: 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28 73  Info) + nExpr*(s
5430: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
5440: 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 66  1) );.  if( pInf
5450: 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  o ){.    pInfo->
5460: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
5470: 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  *)&pInfo->aColl[
5480: 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e 66  nExpr];.    pInf
5490: 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 78 70  o->nField = nExp
54a0: 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65 6e  r;.    pInfo->en
54b0: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
54c0: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
54d0: 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70  pList->a; i<nExp
54e0: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
54f0: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
5500: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43  *pColl;.      pC
5510: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
5520: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
5530: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
5540: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
5550: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
5560: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
5570: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
5580: 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d   pInfo->aColl[i]
5590: 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
55a0: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
55b0: 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f  r[i] = pItem->so
55c0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
55d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66   }.  return pInf
55e0: 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  o;.}.../*.** If 
55f0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
5600: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
5610: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
5620: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
5630: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
5640: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
5650: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
5660: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
5670: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
5680: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
5690: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
56a0: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
56b0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
56c0: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
56d0: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
56e0: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
56f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5700: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
5710: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5720: 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73  e,   /* The pars
5730: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
5740: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
5750: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
5760: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56  statement */.  V
5770: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
5780: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
5790: 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20   into this VDBE 
57a0: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
57b0: 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
57c0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  of columns of da
57d0: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ta */.  int eDes
57e0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  t,       /* Writ
57f0: 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73  e the sorted res
5800: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69  ults here */.  i
5810: 6e 74 20 69 50 61 72 6d 20 20 20 20 20 20 20 20  nt iParm        
5820: 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61  /* Optional para
5830: 6d 65 74 65 72 20 61 73 73 6f 63 69 61 74 65 64  meter associated
5840: 20 77 69 74 68 20 65 44 65 73 74 20 2a 2f 0a 29   with eDest */.)
5850: 7b 0a 20 20 69 6e 74 20 62 72 6b 20 3d 20 73 71  {.  int brk = sq
5860: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
5870: 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 63 6f 6e  el(v);.  int con
5880: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
5890: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69  akeLabel(v);.  i
58a0: 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69  nt addr;.  int i
58b0: 54 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  Tab;.  ExprList 
58c0: 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  *pOrderBy = p->p
58d0: 4f 72 64 65 72 42 79 3b 0a 0a 20 20 69 54 61 62  OrderBy;..  iTab
58e0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43   = pOrderBy->iEC
58f0: 75 72 73 6f 72 3b 0a 20 20 61 64 64 72 20 3d 20  ursor;.  addr = 
5900: 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
5910: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c  ddOp(v, OP_Sort,
5920: 20 69 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20 63   iTab, brk);.  c
5930: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
5940: 63 6f 6e 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  cont, 0);.  sqli
5950: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5960: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  OP_Column, iTab,
5970: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
5980: 20 2b 20 31 29 3b 0a 20 20 73 77 69 74 63 68 28   + 1);.  switch(
5990: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61   eDest ){.    ca
59a0: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
59b0: 20 20 63 61 73 65 20 53 52 54 5f 56 69 72 74 75    case SRT_Virtu
59c0: 61 6c 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73  alTab: {.      s
59d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
59e0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
59f0: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
5a00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5a10: 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c  p(v, OP_Pull, 1,
5a20: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
5a30: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5a40: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
5a50: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
5a60: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
5a70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
5a80: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52  UERY.    case SR
5a90: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61  T_Set: {.      a
5aa0: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
5ab0: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
5ac0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5ad0: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 73  P_NotNull, -1, s
5ae0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
5af0: 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20  tAddr(v)+3);.   
5b00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5b10: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
5b20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
5b30: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5b40: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69  OP_Goto, 0, sqli
5b50: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
5b60: 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20  dr(v)+3);.      
5b70: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
5b80: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5b90: 20 31 2c 20 30 2c 20 22 63 22 2c 20 50 33 5f 53   1, 0, "c", P3_S
5ba0: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71  TATIC);.      sq
5bb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5bc0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
5bd0: 28 69 50 61 72 6d 26 30 78 30 30 30 30 46 46 46  (iParm&0x0000FFF
5be0: 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  F), 0);.      br
5bf0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
5c00: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
5c10: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
5c20: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
5c30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5c40: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
5c50: 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  , iParm, 1);.   
5c60: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
5c70: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
5c80: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
5c90: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
5ca0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
5cb0: 69 66 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  if.    case SRT_
5cc0: 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63 61  Callback:.    ca
5cd0: 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e  se SRT_Subroutin
5ce0: 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  e: {.      int i
5cf0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5d00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
5d10: 6e 74 65 67 65 72 2c 20 70 2d 3e 70 45 4c 69 73  nteger, p->pELis
5d20: 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20  t->nExpr, 0);.  
5d30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5d40: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c  ddOp(v, OP_Pull,
5d50: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f   1, 0);.      fo
5d60: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e  r(i=0; i<nColumn
5d70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
5d80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5d90: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 2d  (v, OP_Column, -
5da0: 31 2d 69 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d  1-i, i);.      }
5db0: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
5dc0: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
5dd0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5de0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5df0: 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75  _Callback, nColu
5e00: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  mn, 0);.      }e
5e10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5e20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5e30: 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50   OP_Gosub, 0, iP
5e40: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arm);.      }.  
5e50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5e60: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
5e70: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  2, 0);.      bre
5e80: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
5e90: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
5ea0: 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
5eb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5ec0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d   }.  }..  /* Jum
5ed0: 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
5ee0: 74 68 65 20 6c 6f 6f 70 20 77 68 65 6e 20 74 68  the loop when th
5ef0: 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
5f00: 65 64 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ed.  */.  if( p-
5f10: 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20  >iLimit>=0 ){.  
5f20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5f30: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72  Op(v, OP_MemIncr
5f40: 2c 20 2d 31 2c 20 70 2d 3e 69 4c 69 6d 69 74 29  , -1, p->iLimit)
5f50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5f60: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d  eAddOp(v, OP_IfM
5f70: 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  emZero, p->iLimi
5f80: 74 2c 20 62 72 6b 29 3b 0a 20 20 7d 0a 0a 20 20  t, brk);.  }..  
5f90: 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66  /* The bottom of
5fa0: 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20   the loop.  */. 
5fb0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
5fc0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74  lveLabel(v, cont
5fd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5fe0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74  AddOp(v, OP_Next
5ff0: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20  , iTab, addr);. 
6000: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
6010: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29  lveLabel(v, brk)
6020: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6030: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
6040: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
6050: 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74  ng the 'declarat
6060: 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65  ion type' of the
6070: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
6080: 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67  Expr. The string
6090: 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20   may be treated 
60a0: 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65  as static by the
60b0: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   caller..**.** I
60c0: 66 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  f the declaratio
60d0: 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78  n type is the ex
60e0: 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66  act datatype def
60f0: 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65  inition extracte
6100: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 6f 72  d from.** the or
6110: 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41  iginal CREATE TA
6120: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66  BLE statement if
6130: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6140: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20  is a column..** 
6150: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
6160: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 20  ion type for an 
6170: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 69  expression is ei
6180: 74 68 65 72 20 54 45 58 54 2c 20 4e 55 4d 45 52  ther TEXT, NUMER
6190: 49 43 20 6f 72 20 41 4e 59 2e 0a 2a 2a 20 54 68  IC or ANY..** Th
61a0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
61b0: 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66  pe for a ROWID f
61c0: 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e  ield is INTEGER.
61d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
61e0: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
61f0: 65 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  e(NameContext *p
6200: 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  NC, Expr *pExpr)
6210: 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
6220: 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 6a 3b 0a  zType;.  int j;.
6230: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c    if( pExpr==0 |
6240: 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d  | pNC->pSrcList=
6250: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
6260: 20 20 2f 2a 20 54 68 65 20 54 4b 5f 41 53 20 6f    /* The TK_AS o
6270: 70 65 72 61 74 6f 72 20 63 61 6e 20 6f 6e 6c 79  perator can only
6280: 20 6f 63 63 75 72 20 69 6e 20 4f 52 44 45 52 20   occur in ORDER 
6290: 42 59 2c 20 47 52 4f 55 50 20 42 59 2c 20 48 41  BY, GROUP BY, HA
62a0: 56 49 4e 47 2c 0a 20 20 2a 2a 20 61 6e 64 20 4c  VING,.  ** and L
62b0: 49 4d 49 54 20 63 6c 61 75 73 65 73 2e 20 20 42  IMIT clauses.  B
62c0: 75 74 20 70 45 78 70 72 20 6f 72 69 67 69 6e 61  ut pExpr origina
62d0: 74 65 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  tes in the resul
62e0: 74 20 73 65 74 20 6f 66 20 61 0a 20 20 2a 2a 20  t set of a.  ** 
62f0: 53 45 4c 45 43 54 2e 20 20 53 6f 20 70 45 78 70  SELECT.  So pExp
6300: 72 20 63 61 6e 20 6e 65 76 65 72 20 63 6f 6e 74  r can never cont
6310: 61 69 6e 20 61 6e 20 41 53 20 6f 70 65 72 61 74  ain an AS operat
6320: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  or..  */.  asser
6330: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
6340: 5f 41 53 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  _AS );..  switch
6350: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
6360: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
6370: 4e 3a 20 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  N: {.      Table
6380: 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20   *pTab = 0;.    
6390: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78    int iCol = pEx
63a0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
63b0: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26     while( pNC &&
63c0: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20   !pTab ){.      
63d0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
63e0: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
63f0: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
6400: 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d  (j=0;j<pTabList-
6410: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
6420: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
6430: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a  =pExpr->iTable;j
6440: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ++);.        if(
6450: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
6460: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
6470: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
6480: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
6490: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
64a0: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
64b0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
64c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
64d0: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
64e0: 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 0a       /* FIX ME:.
64f0: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
6500: 63 61 6e 20 6f 63 63 75 72 73 20 69 66 20 79 6f  can occurs if yo
6510: 75 20 68 61 76 65 20 73 6f 6d 65 74 68 69 6e 67  u have something
6520: 20 6c 69 6b 65 20 22 53 45 4c 45 43 54 20 6e 65   like "SELECT ne
6530: 77 2e 78 3b 22 20 69 6e 73 69 64 65 0a 20 20 20  w.x;" inside.   
6540: 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
6550: 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  r.  In other wor
6560: 64 73 2c 20 69 66 20 79 6f 75 20 72 65 66 65 72  ds, if you refer
6570: 65 6e 63 65 20 74 68 65 20 73 70 65 63 69 61 6c  ence the special
6580: 20 22 6e 65 77 22 0a 20 20 20 20 20 20 20 20 2a   "new".        *
6590: 2a 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 72  * table in the r
65a0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 73  esult set of a s
65b0: 65 6c 65 63 74 2e 20 20 57 65 20 64 6f 20 6e 6f  elect.  We do no
65c0: 74 20 68 61 76 65 20 61 20 67 6f 6f 64 20 77 61  t have a good wa
65d0: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  y.        ** to 
65e0: 66 69 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20  find the actual 
65f0: 74 61 62 6c 65 20 74 79 70 65 2c 20 73 6f 20 63  table type, so c
6600: 61 6c 6c 20 69 74 20 22 54 45 58 54 22 2e 20 20  all it "TEXT".  
6610: 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79 0a 20  This is really. 
6620: 20 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74 68         ** someth
6630: 69 6e 67 20 6f 66 20 61 20 62 75 67 2c 20 62 75  ing of a bug, bu
6640: 74 20 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20  t I do not know 
6650: 68 6f 77 20 74 6f 20 66 69 78 20 69 74 2e 0a 20  how to fix it.. 
6660: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
6670: 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64    ** This code d
6680: 6f 65 73 20 6e 6f 74 20 70 72 6f 64 75 63 65 20  oes not produce 
6690: 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
66a0: 65 72 20 2d 20 69 74 20 6a 75 73 74 20 70 72 65  er - it just pre
66b0: 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  vents.        **
66c0: 20 61 20 73 65 67 66 61 75 6c 74 2e 20 20 53 65   a segfault.  Se
66d0: 65 20 74 69 63 6b 65 74 20 23 31 32 32 39 2e 0a  e ticket #1229..
66e0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
66f0: 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58 54     zType = "TEXT
6700: 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
6710: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6720: 61 73 73 65 72 74 28 20 70 54 61 62 20 29 3b 0a  assert( pTab );.
6730: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
6740: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
6750: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73  iPKey;.      ass
6760: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
6770: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
6780: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
6790: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
67a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 54 79  0 ){.        zTy
67b0: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
67c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
67d0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61       zType = pTa
67e0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
67f0: 79 70 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ype;.      }.   
6800: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6810: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6820: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
6830: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
6840: 20 7b 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e   {.      NameCon
6850: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
6860: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78  Select *pS = pEx
6870: 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  pr->pSelect;.   
6880: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
6890: 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  = pExpr->pSelect
68a0: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e  ->pSrc;.      sN
68b0: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
68c0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
68d0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 53  umnType(&sNC, pS
68e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
68f0: 45 78 70 72 29 3b 20 0a 20 20 20 20 20 20 62 72  Expr); .      br
6900: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
6910: 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  f.    default:. 
6920: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 30 3b 0a       zType = 0;.
6930: 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20    }.  .  return 
6940: 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zType;.}../*.** 
6950: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
6960: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
6970: 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72   VDBE the declar
6980: 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63  ation types of c
6990: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
69a0: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a   result set..*/.
69b0: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
69c0: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
69d0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
69e0: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
69f0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
6a00: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
6a10: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
6a20: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
6a30: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
6a40: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
6a50: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
6a60: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  set */.){.  Vdbe
6a70: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
6a80: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
6a90: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
6aa0: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
6ab0: 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 66 6f  = pTabList;.  fo
6ac0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
6ad0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
6ae0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
6af0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
6b00: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
6b10: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
6b20: 70 65 28 26 73 4e 43 2c 20 70 29 3b 0a 20 20 20  pe(&sNC, p);.   
6b30: 20 69 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20   if( zType==0 ) 
6b40: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 2f 2a  continue;.    /*
6b50: 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d   The vdbe must m
6b60: 61 6b 65 20 69 74 27 73 20 6f 77 6e 20 63 6f 70  ake it's own cop
6b70: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d  y of the column-
6b80: 74 79 70 65 2c 20 69 6e 20 63 61 73 65 20 74 68  type, in case th
6b90: 65 20 0a 20 20 20 20 2a 2a 20 73 63 68 65 6d 61  e .    ** schema
6ba0: 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65   is reset before
6bb0: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61   this virtual ma
6bc0: 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64  chine is deleted
6bd0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
6be0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
6bf0: 6d 65 28 76 2c 20 69 2b 70 45 4c 69 73 74 2d 3e  me(v, i+pEList->
6c00: 6e 45 78 70 72 2c 20 7a 54 79 70 65 2c 20 73 74  nExpr, zType, st
6c10: 72 6c 65 6e 28 7a 54 79 70 65 29 29 3b 0a 20 20  rlen(zType));.  
6c20: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
6c30: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
6c40: 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45  ll tell the VDBE
6c50: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f   the names of co
6c60: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
6c70: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69  result set.  Thi
6c80: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
6c90: 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65   used to provide
6ca0: 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20   the.** azCol[] 
6cb0: 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61  values in the ca
6cc0: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  llback..*/.stati
6cd0: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
6ce0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61  olumnNames(.  Pa
6cf0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
6d00: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
6d10: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
6d20: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
6d30: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
6d40: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
6d50: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
6d60: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
6d70: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
6d80: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
6d90: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
6da0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71    int i, j;.  sq
6db0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
6dc0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75  se->db;.  int fu
6dd0: 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61  llNames, shortNa
6de0: 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  mes;..#ifndef SQ
6df0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
6e00: 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  N.  /* If this i
6e10: 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b  s an EXPLAIN, sk
6e20: 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a  ip this step */.
6e30: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
6e40: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74  plain ){.    ret
6e50: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
6e60: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
6e70: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
6e80: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20  >colNamesSet || 
6e90: 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 4d  v==0 || sqlite3M
6ea0: 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20  allocFailed() ) 
6eb0: 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65  return;.  pParse
6ec0: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
6ed0: 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d  1;.  fullNames =
6ee0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
6ef0: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
6f00: 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61  s)!=0;.  shortNa
6f10: 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mes = (db->flags
6f20: 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
6f30: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
6f40: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
6f50: 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e  Cols(v, pEList->
6f60: 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d  nExpr);.  for(i=
6f70: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
6f80: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
6f90: 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70  pr *p;.    p = p
6fa0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
6fb0: 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  r;.    if( p==0 
6fc0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
6fd0: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
6fe0: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
6ff0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
7000: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
7010: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7020: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
7030: 20 69 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   i, zName, strle
7040: 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  n(zName));.     
7050: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
7060: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
7070: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61  TK_COLUMN && pTa
7080: 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54  bList ){.      T
7090: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
70a0: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20    char *zCol;.  
70b0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
70c0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
70d0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
70e0: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
70f0: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
7100: 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b  rsor!=p->iTable;
7110: 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73   j++){}.      as
7120: 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74  sert( j<pTabList
7130: 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ->nSrc );.      
7140: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
7150: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
7160: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
7170: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
7180: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
7190: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
71a0: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
71b0: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
71c0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
71d0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
71e0: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d  "rowid";.      }
71f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
7200: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
7210: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
7220: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
7230: 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66  shortNames && !f
7240: 75 6c 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73  ullNames && p->s
7250: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
7260: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  .z[0] ){.       
7270: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
7280: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 28 63 68  olName(v, i, (ch
7290: 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70  ar*)p->span.z, p
72a0: 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20  ->span.n);.     
72b0: 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e   }else if( fullN
72c0: 61 6d 65 73 20 7c 7c 20 28 21 73 68 6f 72 74 4e  ames || (!shortN
72d0: 61 6d 65 73 20 26 26 20 70 54 61 62 4c 69 73 74  ames && pTabList
72e0: 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20  ->nSrc>1) ){.   
72f0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
7300: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68   = 0;.        ch
7310: 61 72 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20  ar *zTab;. .    
7320: 20 20 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c      zTab = pTabL
7330: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73  ist->a[j].zAlias
7340: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 75  ;.        if( fu
7350: 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d  llNames || zTab=
7360: 3d 30 20 29 20 7a 54 61 62 20 3d 20 70 54 61 62  =0 ) zTab = pTab
7370: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
7380: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
7390: 67 28 26 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20  g(&zName, zTab, 
73a0: 22 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72  ".", zCol, (char
73b0: 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  *)0);.        sq
73c0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
73d0: 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c  ame(v, i, zName,
73e0: 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P3_DYNAMIC);.  
73f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7400: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
7410: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a  tColName(v, i, z
7420: 43 6f 6c 2c 20 73 74 72 6c 65 6e 28 7a 43 6f 6c  Col, strlen(zCol
7430: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
7440: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61  }else if( p->spa
7450: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
7460: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  [0] ){.      sql
7470: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
7480: 6d 65 28 76 2c 20 69 2c 20 28 63 68 61 72 2a 29  me(v, i, (char*)
7490: 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70  p->span.z, p->sp
74a0: 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 2f 2a 20  an.n);.      /* 
74b0: 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 70 72  sqlite3VdbeCompr
74c0: 65 73 73 53 70 61 63 65 28 76 2c 20 61 64 64 72  essSpace(v, addr
74d0: 29 3b 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  ); */.    }else{
74e0: 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4e 61 6d  .      char zNam
74f0: 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20 61 73 73  e[30];.      ass
7500: 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43  ert( p->op!=TK_C
7510: 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73  OLUMN || pTabLis
7520: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 70  t==0 );.      sp
7530: 72 69 6e 74 66 28 7a 4e 61 6d 65 2c 20 22 63 6f  rintf(zName, "co
7540: 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20  lumn%d", i+1);. 
7550: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7560: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
7570: 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   zName, 0);.    
7580: 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65  }.  }.  generate
7590: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72  ColumnTypes(pPar
75a0: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
75b0: 4c 69 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  List);.}..#ifnde
75c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
75d0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
75e0: 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20  .** Name of the 
75f0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61  connection opera
7600: 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72  tor, used for er
7610: 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f  ror messages..*/
7620: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
7630: 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65  ar *selectOpName
7640: 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72  (int id){.  char
7650: 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69   *z;.  switch( i
7660: 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  d ){.    case TK
7670: 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20  _ALL:       z = 
7680: 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62  "UNION ALL";   b
7690: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
76a0: 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d  K_INTERSECT: z =
76b0: 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20   "INTERSECT";   
76c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
76d0: 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20  TK_EXCEPT:    z 
76e0: 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20  = "EXCEPT";     
76f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
7700: 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a  ult:           z
7710: 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20   = "UNION";     
7720: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
7730: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69  eturn z;.}.#endi
7740: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
7750: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
7760: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61   */../*.** Forwa
7770: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
7780: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 65  /.static int pre
7790: 70 53 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73  pSelectStmt(Pars
77a0: 65 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f  e*, Select*);../
77b0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c  *.** Given a SEL
77c0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67  ECT statement, g
77d0: 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20  enerate a Table 
77e0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
77f0: 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20  escribes.** the 
7800: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
7810: 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61  at SELECT..*/.Ta
7820: 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75  ble *sqlite3Resu
7830: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61  ltSetOfSelect(Pa
7840: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61  rse *pParse, cha
7850: 72 20 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65 6c  r *zTabName, Sel
7860: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
7870: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
7880: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72  int i, j;.  Expr
7890: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
78a0: 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70  Column *aCol, *p
78b0: 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 70 72 65 70  Col;..  if( prep
78c0: 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73  SelectStmt(pPars
78d0: 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20  e, pSelect) ){. 
78e0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
78f0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
7900: 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72  lectResolve(pPar
7910: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 20  se, pSelect, 0) 
7920: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
7930: 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71  .  }.  pTab = sq
7940: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
7950: 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69  of(Table) );.  i
7960: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
7970: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7980: 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
7990: 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20  ;.  pTab->zName 
79a0: 3d 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c  = zTabName ? sql
79b0: 69 74 65 53 74 72 44 75 70 28 7a 54 61 62 4e 61  iteStrDup(zTabNa
79c0: 6d 65 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73  me) : 0;.  pELis
79d0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
79e0: 69 73 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f  ist;.  pTab->nCo
79f0: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
7a00: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  r;.  assert( pTa
7a10: 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70  b->nCol>0 );.  p
7a20: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c  Tab->aCol = aCol
7a30: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
7a40: 20 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43   sizeof(pTab->aC
7a50: 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f  ol[0])*pTab->nCo
7a60: 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  l );.  for(i=0, 
7a70: 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 70 54 61  pCol=aCol; i<pTa
7a80: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  b->nCol; i++, pC
7a90: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  ol++){.    Expr 
7aa0: 2a 70 2c 20 2a 70 52 3b 0a 20 20 20 20 63 68 61  *p, *pR;.    cha
7ab0: 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 63 68  r *zType;.    ch
7ac0: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  ar *zName;.    c
7ad0: 68 61 72 20 2a 7a 42 61 73 65 6e 61 6d 65 3b 0a  har *zBasename;.
7ae0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
7af0: 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74 3b  ll;.    int cnt;
7b00: 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
7b10: 20 73 4e 43 3b 0a 20 20 20 20 0a 20 20 20 20 2f   sNC;.    .    /
7b20: 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72  * Get an appropr
7b30: 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  iate name for th
7b40: 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a  e column.    */.
7b50: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
7b60: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
7b70: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
7b80: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68  t==0 || p->pRigh
7b90: 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c  t->token.z==0 ||
7ba0: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
7bb0: 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  n.z[0]!=0 );.   
7bc0: 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45   if( (zName = pE
7bd0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
7be0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
7bf0: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   If the column c
7c00: 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c  ontains an "AS <
7c10: 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75  name>" phrase, u
7c20: 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65  se <name> as the
7c30: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a   name */.      z
7c40: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
7c50: 44 75 70 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Dup(zName);.    
7c60: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d  }else if( p->op=
7c70: 3d 54 4b 5f 44 4f 54 20 0a 20 20 20 20 20 20 20  =TK_DOT .       
7c80: 20 20 20 20 20 20 20 26 26 20 28 70 52 3d 70 2d         && (pR=p-
7c90: 3e 70 52 69 67 68 74 29 21 3d 30 20 26 26 20 70  >pRight)!=0 && p
7ca0: 52 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 52  R->token.z && pR
7cb0: 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a  ->token.z[0] ){.
7cc0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c        /* For col
7cd0: 75 6d 6e 73 20 6f 66 20 74 68 65 20 66 72 6f 6d  umns of the from
7ce0: 20 41 2e 42 20 75 73 65 20 42 20 61 73 20 74 68   A.B use B as th
7cf0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
7d00: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
7d10: 50 72 69 6e 74 66 28 22 25 54 22 2c 20 26 70 52  Printf("%T", &pR
7d20: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 65  ->token);.    }e
7d30: 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e  lse if( p->span.
7d40: 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30  z && p->span.z[0
7d50: 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 73  ] ){.      /* Us
7d60: 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  e the original t
7d70: 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ext of the colum
7d80: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20  n expression as 
7d90: 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  its name */.    
7da0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
7db0: 33 4d 50 72 69 6e 74 66 28 22 25 54 22 2c 20 26  3MPrintf("%T", &
7dc0: 70 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 65  p->span);.    }e
7dd0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  lse{.      /* If
7de0: 20 61 6c 6c 20 65 6c 73 65 20 66 61 69 6c 73 2c   all else fails,
7df0: 20 6d 61 6b 65 20 75 70 20 61 20 6e 61 6d 65 20   make up a name 
7e00: 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  */.      zName =
7e10: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
7e20: 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29  "column%d", i+1)
7e30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
7e40: 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65  te3Dequote(zName
7e50: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
7e60: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
7e70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7e80: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
7e90: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
7ea0: 54 61 62 6c 65 28 30 2c 20 70 54 61 62 29 3b 0a  Table(0, pTab);.
7eb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
7ec0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
7ed0: 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75  ke sure the colu
7ee0: 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  mn name is uniqu
7ef0: 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  e.  If the name 
7f00: 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20  is not unique,. 
7f10: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69     ** append a i
7f20: 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61  nteger to the na
7f30: 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65  me so that it be
7f40: 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20  comes unique..  
7f50: 20 20 2a 2f 0a 20 20 20 20 7a 42 61 73 65 6e 61    */.    zBasena
7f60: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
7f70: 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69  for(j=cnt=0; j<i
7f80: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
7f90: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
7fa0: 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  (aCol[j].zName, 
7fb0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
7fc0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
7fd0: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 73 3a  ite3MPrintf("%s:
7fe0: 25 64 22 2c 20 7a 42 61 73 65 6e 61 6d 65 2c 20  %d", zBasename, 
7ff0: 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ++cnt);.        
8000: 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  j = -1;.        
8010: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62  if( zName==0 ) b
8020: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
8030: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 42 61 73    }.    if( zBas
8040: 65 6e 61 6d 65 21 3d 7a 4e 61 6d 65 20 29 7b 0a  ename!=zName ){.
8050: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
8060: 28 7a 42 61 73 65 6e 61 6d 65 29 3b 0a 20 20 20  (zBasename);.   
8070: 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61   }.    pCol->zNa
8080: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20 20  me = zName;..   
8090: 20 2f 2a 20 47 65 74 20 74 68 65 20 74 79 70 65   /* Get the type
80a0: 6e 61 6d 65 2c 20 74 79 70 65 20 61 66 66 69 6e  name, type affin
80b0: 69 74 79 2c 20 61 6e 64 20 63 6f 6c 6c 61 74 69  ity, and collati
80c0: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
80d0: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  the.    ** colum
80e0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65  n..    */.    me
80f0: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
8100: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
8110: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
8120: 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
8130: 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65    zType = sqlite
8140: 53 74 72 44 75 70 28 63 6f 6c 75 6d 6e 54 79 70  StrDup(columnTyp
8150: 65 28 26 73 4e 43 2c 20 70 29 29 3b 0a 20 20 20  e(&sNC, p));.   
8160: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 7a   pCol->zType = z
8170: 54 79 70 65 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  Type;.    pCol->
8180: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
8190: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
81a0: 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  );.    pColl = s
81b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
81c0: 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
81d0: 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
81e0: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c       pCol->zColl
81f0: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
8200: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
8210: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d     }.  }.  pTab-
8220: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72  >iPKey = -1;.  r
8230: 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f  eturn pTab;.}../
8240: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 53  *.** Prepare a S
8250: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
8260: 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 62  for processing b
8270: 79 20 64 6f 69 6e 67 20 74 68 65 20 66 6f 6c 6c  y doing the foll
8280: 6f 77 69 6e 67 0a 2a 2a 20 74 68 69 6e 67 73 3a  owing.** things:
8290: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d  .**.**    (1)  M
82a0: 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75  ake sure VDBE cu
82b0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
82c0: 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
82d0: 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20  to every.**     
82e0: 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74      element of t
82f0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
8300: 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69  **.**    (2)  Fi
8310: 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  ll in the pTabLi
8320: 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65  st->a[].pTab fie
8330: 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69  lds in the SrcLi
8340: 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20  st that .**     
8350: 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d      defines FROM
8360: 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76   clause.  When v
8370: 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74  iews appear in t
8380: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a  he FROM clause,.
8390: 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20  **         fill 
83a0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53  pTabList->a[].pS
83b0: 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70  elect with a cop
83c0: 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
83d0: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
83e0: 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d       that implem
83f0: 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20  ents the view.  
8400: 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f  A copy is made o
8410: 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c  f the view's SEL
8420: 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  ECT.**         s
8430: 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74  tatement so that
8440: 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d   we can freely m
8450: 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20  odify or delete 
8460: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a  that statement.*
8470: 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75  *         withou
8480: 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74  t worrying about
8490: 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20   messing up the 
84a0: 70 72 65 73 69 73 74 65 6e 74 20 72 65 70 72 65  presistent repre
84b0: 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20  sentation.**    
84c0: 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77       of the view
84d0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20  ..**.**    (3)  
84e0: 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65  Add terms to the
84f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
8500: 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20   accomodate the 
8510: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a  NATURAL keyword.
8520: 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f  **         on jo
8530: 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61  ins and the ON a
8540: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  nd USING clause 
8550: 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20  of joins..**.** 
8560: 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65     (4)  Scan the
8570: 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
8580: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
8590: 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b  et (pEList) look
85a0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  ing.**         f
85b0: 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  or instances of 
85c0: 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  the "*" operator
85d0: 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20   or the TABLE.* 
85e0: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20  operator..**    
85f0: 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65       If found, e
8600: 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74  xpand each "*" t
8610: 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
8620: 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65  n in every table
8630: 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20  .**         and 
8640: 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76  TABLE.* to be ev
8650: 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41  ery column in TA
8660: 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  BLE..**.** Retur
8670: 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  n 0 on success. 
8680: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 70 72   If there are pr
8690: 6f 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e  oblems, leave an
86a0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
86b0: 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  * in pParse and 
86c0: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
86d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
86e0: 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 50 61  repSelectStmt(Pa
86f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
8700: 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ect *p){.  int i
8710: 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20 53 72  , j, k, rc;.  Sr
8720: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
8730: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
8740: 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ist;.  Table *pT
8750: 61 62 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  ab;.  struct Src
8760: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
8770: 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  ;..  if( p==0 ||
8780: 20 70 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c 20 73   p->pSrc==0 || s
8790: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
87a0: 65 64 28 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ed() ){.    retu
87b0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 1;.  }.  pTab
87c0: 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
87d0: 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
87e0: 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  List;..  /* Make
87f0: 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d   sure cursor num
8800: 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
8810: 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65  ssigned to all e
8820: 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74  ntries in.  ** t
8830: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
8840: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
8850: 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73  tement..  */.  s
8860: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
8870: 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
8880: 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 0a 20 20  e, p->pSrc);..  
8890: 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79  /* Look up every
88a0: 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20   table named in 
88b0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
88c0: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20  of the select.  
88d0: 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79  If.  ** an entry
88e0: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
88f0: 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65 72  use is a subquer
8900: 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74  y instead of a t
8910: 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20  able or view,.  
8920: 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  ** then create a
8930: 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
8940: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65   structure to de
8950: 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71 75  scribe the subqu
8960: 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
8970: 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
8980: 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
8990: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
89a0: 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  From++){.    if(
89b0: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20   pFrom->pTab!=0 
89c0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
89d0: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61   statement has a
89e0: 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72 65 70  lready been prep
89f0: 61 72 65 64 2e 20 20 54 68 65 72 65 20 69 73 20  ared.  There is 
8a00: 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a  no need.      **
8a10: 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20   to go further. 
8a20: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
8a30: 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72   i==0 );.      r
8a40: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
8a50: 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e     if( pFrom->zN
8a60: 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  ame==0 ){.#ifnde
8a70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
8a80: 42 51 55 45 52 59 0a 20 20 20 20 20 20 2f 2a 20  BQUERY.      /* 
8a90: 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
8aa0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
8ab0: 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
8ac0: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
8ad0: 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b  m->pSelect!=0 );
8ae0: 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d  .      if( pFrom
8af0: 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20  ->zAlias==0 ){. 
8b00: 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 7a 41         pFrom->zA
8b10: 6c 69 61 73 20 3d 0a 20 20 20 20 20 20 20 20 20  lias =.         
8b20: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
8b30: 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79  "sqlite_subquery
8b40: 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70 46  _%p_", (void*)pF
8b50: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  rom->pSelect);. 
8b60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
8b70: 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
8b80: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72  ==0 );.      pFr
8b90: 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
8ba0: 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  = .        sqlit
8bb0: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
8bc0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 46 72 6f  ect(pParse, pFro
8bd0: 6d 2d 3e 7a 41 6c 69 61 73 2c 20 70 46 72 6f 6d  m->zAlias, pFrom
8be0: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
8bf0: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
8c00: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8c10: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
8c20: 20 2f 2a 20 54 68 65 20 69 73 54 72 61 6e 73 69   /* The isTransi
8c30: 65 6e 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74  ent flag indicat
8c40: 65 73 20 74 68 61 74 20 74 68 65 20 54 61 62 6c  es that the Tabl
8c50: 65 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20  e structure has 
8c60: 62 65 65 6e 0a 20 20 20 20 20 20 2a 2a 20 64 79  been.      ** dy
8c70: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
8c80: 74 65 64 20 61 6e 64 20 6d 61 79 20 62 65 20 66  ted and may be f
8c90: 72 65 65 64 20 61 74 20 61 6e 79 20 74 69 6d 65  reed at any time
8ca0: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
8cb0: 73 2c 0a 20 20 20 20 20 20 2a 2a 20 70 54 61 62  s,.      ** pTab
8cc0: 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
8cd0: 20 74 6f 20 61 20 70 65 72 73 69 73 74 65 6e 74   to a persistent
8ce0: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
8cf0: 20 74 68 61 74 20 64 65 66 69 6e 65 73 0a 20 20   that defines.  
8d00: 20 20 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74      ** part of t
8d10: 68 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a 20 20  he schema. */.  
8d20: 20 20 20 20 70 54 61 62 2d 3e 69 73 54 72 61 6e      pTab->isTran
8d30: 73 69 65 6e 74 20 3d 20 31 3b 0a 23 65 6e 64 69  sient = 1;.#endi
8d40: 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
8d50: 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72     /* An ordinar
8d60: 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  y table or view 
8d70: 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  name in the FROM
8d80: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
8d90: 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
8da0: 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
8db0: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
8dc0: 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73  Tab = .        s
8dd0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
8de0: 65 28 70 50 61 72 73 65 2c 70 46 72 6f 6d 2d 3e  e(pParse,pFrom->
8df0: 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61  zName,pFrom->zDa
8e00: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69  tabase);.      i
8e10: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
8e20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
8e30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
8e40: 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 6e  ab->nRef++;.#ifn
8e50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8e60: 56 49 45 57 0a 20 20 20 20 20 20 69 66 28 20 70  VIEW.      if( p
8e70: 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
8e80: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65          /* We re
8e90: 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20  ach here if the 
8ea0: 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61  named table is a
8eb0: 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a   really a view *
8ec0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  /.        if( sq
8ed0: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
8ee0: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
8ef0: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
8f00: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
8f10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
8f20: 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  * If pFrom->pSel
8f30: 65 63 74 21 3d 30 20 69 74 20 6d 65 61 6e 73 20  ect!=0 it means 
8f40: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
8f50: 69 74 68 20 61 0a 20 20 20 20 20 20 20 20 2a 2a  ith a.        **
8f60: 20 76 69 65 77 20 77 69 74 68 69 6e 20 61 20 76   view within a v
8f70: 69 65 77 2e 20 20 54 68 65 20 53 45 4c 45 43 54  iew.  The SELECT
8f80: 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20 61   structure has a
8f90: 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20  lready been.    
8fa0: 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 62 79      ** copied by
8fb0: 20 74 68 65 20 6f 75 74 65 72 20 76 69 65 77 20   the outer view 
8fc0: 73 6f 20 77 65 20 63 61 6e 20 73 6b 69 70 20 74  so we can skip t
8fd0: 68 65 20 63 6f 70 79 20 73 74 65 70 20 68 65 72  he copy step her
8fe0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  e.        ** in 
8ff0: 74 68 65 20 69 6e 6e 65 72 20 76 69 65 77 2e 0a  the inner view..
9000: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
9010: 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 53     if( pFrom->pS
9020: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
9030: 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65        pFrom->pSe
9040: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
9050: 6c 65 63 74 44 75 70 28 70 54 61 62 2d 3e 70 53  lectDup(pTab->pS
9060: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
9070: 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
9080: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9090: 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c   Process NATURAL
90a0: 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f   keywords, and O
90b0: 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
90c0: 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20  ses of joins..  
90d0: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 50  */.  if( sqliteP
90e0: 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73  rocessJoin(pPars
90f0: 65 2c 20 70 29 20 29 20 72 65 74 75 72 6e 20 31  e, p) ) return 1
9100: 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72  ;..  /* For ever
9110: 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72  y "*" that occur
9120: 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  s in the column 
9130: 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65  list, insert the
9140: 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61   names of.  ** a
9150: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
9160: 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66  l tables.  And f
9170: 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a  or every TABLE.*
9180: 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
9190: 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f  s.  ** of all co
91a0: 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20  lumns in TABLE. 
91b0: 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65   The parser inse
91c0: 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65  rted a special e
91d0: 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77  xpression.  ** w
91e0: 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f  ith the TK_ALL o
91f0: 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68  perator for each
9200: 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75   "*" that it fou
9210: 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  nd in the column
9220: 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20   list..  ** The 
9230: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a  following code j
9240: 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74  ust has to locat
9250: 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70  e the TK_ALL exp
9260: 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70  ressions and exp
9270: 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e  and.  ** each on
9280: 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  e to the list of
9290: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
92a0: 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  all tables..  **
92b0: 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
92c0: 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73  loop just checks
92d0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
92e0: 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65   are any "*" ope
92f0: 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74  rators.  ** that
9300: 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e   need expanding.
9310: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b  .  */.  for(k=0;
9320: 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
9330: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; k++){.    Expr
9340: 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61   *pE = pEList->a
9350: 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [k].pExpr;.    i
9360: 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  f( pE->op==TK_AL
9370: 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  L ) break;.    i
9380: 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
9390: 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20  T && pE->pRight 
93a0: 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  && pE->pRight->o
93b0: 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20  p==TK_ALL.      
93c0: 20 20 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20     && pE->pLeft 
93d0: 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70  && pE->pLeft->op
93e0: 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b  ==TK_ID ) break;
93f0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20  .  }.  rc = 0;. 
9400: 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e   if( k<pEList->n
9410: 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  Expr ){.    /*. 
9420: 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20     ** If we get 
9430: 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68  here it means th
9440: 65 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e  e result set con
9450: 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
9460: 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65  e "*".    ** ope
9470: 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  rators that need
9480: 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
9490: 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65    Loop through e
94a0: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ach expression. 
94b0: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73     ** in the res
94c0: 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61  ult set and expa
94d0: 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f  nd them one by o
94e0: 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ne..    */.    s
94f0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
9500: 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d  tem *a = pEList-
9510: 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  >a;.    ExprList
9520: 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20   *pNew = 0;.    
9530: 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72  int flags = pPar
9540: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  se->db->flags;. 
9550: 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73     int longNames
9560: 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
9570: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
9580: 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20  !=0 &&.         
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c               (fl
95a0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
95b0: 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a  rtColNames)==0;.
95c0: 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  .    for(k=0; k<
95d0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
95e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
95f0: 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72  *pE = a[k].pExpr
9600: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
9610: 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20  op!=TK_ALL &&.  
9620: 20 20 20 20 20 20 20 20 20 28 70 45 2d 3e 6f 70           (pE->op
9630: 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
9640: 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d  pRight==0 || pE-
9650: 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f  >pRight->op!=TK_
9660: 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ALL) ){.        
9670: 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c  /* This particul
9680: 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f  ar expression do
9690: 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
96a0: 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20  e expanded..    
96b0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
96c0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
96d0: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77  rListAppend(pNew
96e0: 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29  , a[k].pExpr, 0)
96f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
9700: 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
9710: 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
9720: 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61  xpr-1].zName = a
9730: 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [k].zName;.     
9740: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9750: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
9760: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b      }.        a[
9770: 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  k].pExpr = 0;.  
9780: 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65        a[k].zName
9790: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
97a0: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
97b0: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
97c0: 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42   a "*" or a "TAB
97d0: 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20  LE.*" and needs 
97e0: 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  to be.        **
97f0: 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20   expanded. */.  
9800: 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53        int tableS
9810: 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  een = 0;      /*
9820: 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54   Set to 1 when T
9830: 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a  ABLE matches */.
9840: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
9850: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
9860: 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65   /* text of name
9870: 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20   of TABLE */.   
9880: 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d       if( pE->op=
9890: 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70  =TK_DOT && pE->p
98a0: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
98b0: 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71 6c 69 74    zTName = sqlit
98c0: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
98d0: 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  &pE->pLeft->toke
98e0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  n);.        }els
98f0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  e{.          zTN
9900: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
9910: 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69   }.        for(i
9920: 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
9930: 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
9940: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
9950: 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  rom++){.        
9960: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
9970: 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
9980: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
9990: 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a  bName = pFrom->z
99a0: 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
99b0: 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30   if( zTabName==0
99c0: 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d   || zTabName[0]=
99d0: 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  =0 ){ .         
99e0: 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54     zTabName = pT
99f0: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
9a00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9a10: 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 28   if( zTName && (
9a20: 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  zTabName==0 || z
9a30: 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c  TabName[0]==0 ||
9a40: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
9a50: 20 20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d     sqlite3StrICm
9a60: 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  p(zTName, zTabNa
9a70: 6d 65 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  me)!=0) ){.     
9a80: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
9a90: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
9aa0: 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e         tableSeen
9ab0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
9ac0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
9ad0: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
9ae0: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
9af0: 45 78 70 72 2c 20 2a 70 4c 65 66 74 2c 20 2a 70  Expr, *pLeft, *p
9b00: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
9b10: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
9b20: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
9b30: 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20 20  Name;..         
9b40: 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20     if( i>0 ){.  
9b50: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
9b60: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
9b70: 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62 4c 69  *pLeft = &pTabLi
9b80: 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20 20  st->a[i-1];.    
9b90: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
9ba0: 4c 65 66 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  Left->jointype &
9bb0: 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20   JT_NATURAL)!=0 
9bc0: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
9bd0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d             colum
9be0: 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70 54  nIndex(pLeft->pT
9bf0: 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ab, zName)>=0 ){
9c00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9c10: 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c   /* In a NATURAL
9c20: 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20   join, omit the 
9c30: 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  join columns fro
9c40: 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  m the .         
9c50: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
9c60: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c80: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
9c90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9ca0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
9cb0: 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
9cc0: 4c 65 66 74 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e  Left->pUsing, zN
9cd0: 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
9ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
9cf0: 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
9d00: 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
9d10: 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
9d20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9d30: 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
9d40: 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
9d50: 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
9d60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9d70: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
9d80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9d90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9da0: 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
9db0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c  lite3Expr(TK_ID,
9dc0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
9dd0: 20 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68         if( pRigh
9de0: 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  t==0 ) break;.  
9df0: 20 20 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b            setTok
9e00: 65 6e 28 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65  en(&pRight->toke
9e10: 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  n, zName);.     
9e20: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
9e30: 61 6d 65 20 26 26 20 28 6c 6f 6e 67 4e 61 6d 65  ame && (longName
9e40: 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s || pTabList->n
9e50: 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20  Src>1) ){.      
9e60: 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
9e70: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
9e80: 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
9e90: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
9ea0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
9eb0: 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52  K_DOT, pLeft, pR
9ec0: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
9ed0: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
9ee0: 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r==0 ) break;.  
9ef0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54              setT
9f00: 6f 6b 65 6e 28 26 70 4c 65 66 74 2d 3e 74 6f 6b  oken(&pLeft->tok
9f10: 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20  en, zTabName);. 
9f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
9f30: 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d 3e 73 70  Token(&pExpr->sp
9f40: 61 6e 2c 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  an, sqlite3MPrin
9f50: 74 66 28 22 25 73 2e 25 73 22 2c 20 7a 54 61 62  tf("%s.%s", zTab
9f60: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20  Name, zName));. 
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
9f80: 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31  pr->span.dyn = 1
9f90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
9fa0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d  pExpr->token.z =
9fb0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
9fc0: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e    pExpr->token.n
9fd0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
9fe0: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
9ff0: 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  .dyn = 0;.      
a000: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a010: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
a020: 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
a030: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
a040: 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f  span = pExpr->to
a050: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ken;.           
a060: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
a070: 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a  f( longNames ){.
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
a090: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
a0a0: 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c  ListAppend(pNew,
a0b0: 20 70 45 78 70 72 2c 20 26 70 45 78 70 72 2d 3e   pExpr, &pExpr->
a0c0: 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  span);.         
a0d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a0e0: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
a0f0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
a100: 70 65 6e 64 28 70 4e 65 77 2c 20 70 45 78 70 72  pend(pNew, pExpr
a110: 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  , &pRight->token
a120: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
a130: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
a140: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
a150: 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b  f( !tableSeen ){
a160: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
a170: 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  TName ){.       
a180: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
a190: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
a1a0: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22   such table: %s"
a1b0: 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20  , zTName);.     
a1c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a1d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
a1e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
a1f0: 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69  "no tables speci
a200: 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  fied");.        
a210: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
a220: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
a230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
a240: 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20  ee(zTName);.    
a250: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
a260: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
a270: 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20 20 20  ete(pEList);.   
a280: 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65   p->pEList = pNe
a290: 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  w;.  }.  return 
a2a0: 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
a2b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
a2c0: 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
a2d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73   This routine as
a2e0: 73 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65 73  sociates entries
a2f0: 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
a300: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
a310: 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20  with.** columns 
a320: 69 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46 6f  in a result.  Fo
a330: 72 20 65 61 63 68 20 4f 52 44 45 52 20 42 59 20  r each ORDER BY 
a340: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20  expression, the 
a350: 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65  opcode of.** the
a360: 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20   top-level node 
a370: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b  is changed to TK
a380: 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20  _COLUMN and the 
a390: 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66  iColumn value of
a3a0: 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  .** the top-leve
a3b0: 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64  l node is filled
a3c0: 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20   in with column 
a3d0: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69  number and the i
a3e0: 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  Table.** value o
a3f0: 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  f the top-level 
a400: 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 77  node is filled w
a410: 69 74 68 20 69 54 61 62 6c 65 20 70 61 72 61 6d  ith iTable param
a420: 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  eter..**.** If t
a430: 68 65 72 65 20 61 72 65 20 70 72 69 6f 72 20 53  here are prior S
a440: 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20 74  ELECT clauses, t
a450: 68 65 79 20 61 72 65 20 70 72 6f 63 65 73 73 65  hey are processe
a460: 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74 63  d first.  A matc
a470: 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69  h.** in an earli
a480: 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73 20  er SELECT takes 
a490: 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20  precedence over 
a4a0: 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e 0a  a later SELECT..
a4b0: 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20  **.** Any entry 
a4c0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  that does not ma
a4d0: 74 63 68 20 69 73 20 66 6c 61 67 67 65 64 20 61  tch is flagged a
a4e0: 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65  s an error.  The
a4f0: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
a500: 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65 64  rors is returned
a510: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a520: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
a530: 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
a540: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
a550: 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 6c 65  /* A place to le
a560: 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ave error messag
a570: 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  es */.  Select *
a580: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20  pSelect,        
a590: 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65 73 75  /* Match to resu
a5a0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  lt columns of th
a5b0: 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45  is SELECT */.  E
a5c0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
a5d0: 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  y,     /* The OR
a5e0: 44 45 52 20 42 59 20 76 61 6c 75 65 73 20 74 6f  DER BY values to
a5f0: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 63   match against c
a600: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
a610: 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
a620: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
a630: 69 73 20 76 61 6c 75 65 20 69 6e 20 69 54 61 62  is value in iTab
a640: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74  le */.  int must
a650: 43 6f 6d 70 6c 65 74 65 20 20 20 20 20 20 20 20  Complete        
a660: 2f 2a 20 49 66 20 54 52 55 45 20 61 6c 6c 20 4f  /* If TRUE all O
a670: 52 44 45 52 20 42 59 73 20 6d 75 73 74 20 6d 61  RDER BYs must ma
a680: 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tch */.){.  int 
a690: 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nErr = 0;.  int 
a6a0: 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74  i, j;.  ExprList
a6b0: 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28   *pEList;..  if(
a6c0: 20 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70   pSelect==0 || p
a6d0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
a6e0: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d 75 73  urn 1;.  if( mus
a6f0: 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20  tComplete ){.   
a700: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
a710: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
a720: 29 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  ){ pOrderBy->a[i
a730: 5d 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20 20  ].done = 0; }.  
a740: 7d 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65  }.  if( prepSele
a750: 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70  ctStmt(pParse, p
a760: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72  Select) ){.    r
a770: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
a780: 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  f( pSelect->pPri
a790: 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 61  or ){.    if( ma
a7a0: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
a7b0: 6d 6e 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  mn(pParse, pSele
a7c0: 63 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64  ct->pPrior, pOrd
a7d0: 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 30 29  erBy, iTable, 0)
a7e0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
a7f0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
a800: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
a810: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28  ->pEList;.  for(
a820: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
a830: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
a840: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72    Expr *pE = pOr
a850: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
a860: 72 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  r;.    int iCol 
a870: 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 4f  = -1;.    if( pO
a880: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e  rderBy->a[i].don
a890: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
a8a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
a8b0: 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26  rIsInteger(pE, &
a8c0: 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 69  iCol) ){.      i
a8d0: 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43  f( iCol<=0 || iC
a8e0: 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  ol>pEList->nExpr
a8f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
a900: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
a910: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4f  se,.          "O
a920: 52 44 45 52 20 42 59 20 70 6f 73 69 74 69 6f 6e  RDER BY position
a930: 20 25 64 20 73 68 6f 75 6c 64 20 62 65 20 62 65   %d should be be
a940: 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c  tween 1 and %d",
a950: 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 2c  .          iCol,
a960: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
a970: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  .        nErr++;
a980: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
a990: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
a9a0: 28 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  ( !mustComplete 
a9b0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
a9c0: 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a    iCol--;.    }.
a9d0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 43 6f      for(j=0; iCo
a9e0: 6c 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73 74 2d  l<0 && j<pEList-
a9f0: 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
aa00: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
aa10: 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70  a[j].zName && (p
aa20: 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20  E->op==TK_ID || 
aa30: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  pE->op==TK_STRIN
aa40: 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  G) ){.        ch
aa50: 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62  ar *zName, *zLab
aa60: 65 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  el;.        zNam
aa70: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  e = pEList->a[j]
aa80: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
aa90: 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33  zLabel = sqlite3
aaa0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70  NameFromToken(&p
aab0: 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  E->token);.     
aac0: 20 20 20 61 73 73 65 72 74 28 20 7a 4c 61 62 65     assert( zLabe
aad0: 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
aae0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
aaf0: 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c  mp(zName, zLabel
ab00: 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20  )==0 ){ .       
ab10: 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20     iCol = j;.   
ab20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
ab30: 71 6c 69 74 65 46 72 65 65 28 7a 4c 61 62 65 6c  qliteFree(zLabel
ab40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ab50: 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 73   if( iCol<0 && s
ab60: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
ab70: 65 28 70 45 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  e(pE, pEList->a[
ab80: 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  j].pExpr) ){.   
ab90: 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20       iCol = j;. 
aba0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
abb0: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a   if( iCol>=0 ){.
abc0: 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54        pE->op = T
abd0: 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
abe0: 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43  pE->iColumn = iC
abf0: 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 54  ol;.      pE->iT
ac00: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
ac10: 20 20 20 20 20 70 45 2d 3e 69 41 67 67 20 3d 20       pE->iAgg = 
ac20: 2d 31 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72  -1;.      pOrder
ac30: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20  By->a[i].done = 
ac40: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
ac50: 20 69 43 6f 6c 3c 30 20 26 26 20 6d 75 73 74 43   iCol<0 && mustC
ac60: 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  omplete ){.     
ac70: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
ac80: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
ac90: 20 22 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20   "ORDER BY term 
aca0: 6e 75 6d 62 65 72 20 25 64 20 64 6f 65 73 20 6e  number %d does n
acb0: 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 72 65 73  ot match any res
acc0: 75 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20 69 2b 31  ult column", i+1
acd0: 29 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  );.      nErr++;
ace0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
acf0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
ad00: 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69   nErr;  .}.#endi
ad10: 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
ad20: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
ad30: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a  D_SELECT */../*.
ad40: 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f  ** Get a VDBE fo
ad50: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73  r the given pars
ad60: 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65  er context.  Cre
ad70: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
ad80: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49   necessary..** I
ad90: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
ada0: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  s, return NULL a
adb0: 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61  nd leave a messa
adc0: 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
add0: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65  .Vdbe *sqlite3Ge
ade0: 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61  tVdbe(Parse *pPa
adf0: 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  rse){.  Vdbe *v 
ae00: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
ae10: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
ae20: 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70     v = pParse->p
ae30: 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Vdbe = sqlite3Vd
ae40: 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d  beCreate(pParse-
ae50: 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  >db);.  }.  retu
ae60: 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn v;.}.../*.** 
ae70: 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d  Compute the iLim
ae80: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66  it and iOffset f
ae90: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c  ields of the SEL
aea0: 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ECT based on the
aeb0: 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  .** pLimit and p
aec0: 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f  Offset expressio
aed0: 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20  ns.  pLimit and 
aee0: 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65  pOffset hold the
aef0: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
af00: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74  that appear in t
af10: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
af20: 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20  statement after 
af30: 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
af40: 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73  FSET.** keywords
af50: 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68  .  Or NULL if th
af60: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65  ose keywords are
af70: 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74   omitted. iLimit
af80: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a   and iOffset .**
af90: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
afa0: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
afb0: 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75   numbers for cou
afc0: 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f  nters used to co
afd0: 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69  mpute .** the li
afe0: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20  mit and offset. 
aff0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
b000: 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66  limit and/or off
b010: 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c  set, then .** iL
b020: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
b030: 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a   are negative..*
b040: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b050: 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61  e changes the va
b060: 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61  lues of iLimit a
b070: 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20  nd iOffset only 
b080: 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72  if.** a limit or
b090: 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e   offset is defin
b0a0: 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64  ed by pLimit and
b0b0: 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69   pOffset.  iLimi
b0c0: 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74  t and.** iOffset
b0d0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
b0e0: 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72  n preset to appr
b0f0: 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20  opriate default 
b100: 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c  values.** (usual
b110: 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79  ly but not alway
b120: 73 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63  s -1) prior to c
b130: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
b140: 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20  ine..** Only if 
b150: 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66  pLimit!=0 or pOf
b160: 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c  fset!=0 do the l
b170: 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67  imit registers g
b180: 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e  et.** redefined.
b190: 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20    The UNION ALL 
b1a0: 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68  operator uses th
b1b0: 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66  is property to f
b1c0: 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73  orce.** the reus
b1d0: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69  e of the same li
b1e0: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72  mit and offset r
b1f0: 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20  egisters across 
b200: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45  multiple.** SELE
b210: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
b220: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
b230: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
b240: 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ers(Parse *pPars
b250: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
b260: 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62  t iBreak){.  Vdb
b270: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 4c 69 6d  e *v;.  int iLim
b280: 69 74 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65  it;.  int iOffse
b290: 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20  t;.  int addr1, 
b2a0: 61 64 64 72 32 3b 0a 0a 20 20 2f 2a 20 0a 20 20  addr2;..  /* .  
b2b0: 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c  ** "LIMIT -1" al
b2c0: 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72  ways shows all r
b2d0: 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73  ows.  There is s
b2e0: 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76  ome.  ** contrav
b2f0: 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20  ersy about what 
b300: 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
b310: 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a  vior should be..
b320: 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74    ** The current
b330: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
b340: 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49  interprets "LIMI
b350: 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a  T 0" to mean.  *
b360: 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a  * no rows..  */.
b370: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
b380: 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  ){.    p->iLimit
b390: 20 3d 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 72   = iLimit = pPar
b3a0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 50  se->nMem;.    pP
b3b0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b  arse->nMem += 2;
b3c0: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
b3d0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
b3e0: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
b3f0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
b400: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
b410: 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  se, p->pLimit);.
b420: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b430: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42  ddOp(v, OP_MustB
b440: 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eInt, 0, 0);.   
b450: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b460: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
b470: 2c 20 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20  , iLimit, 0);.  
b480: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
b490: 2c 20 22 23 20 4c 49 4d 49 54 20 63 6f 75 6e 74  , "# LIMIT count
b4a0: 65 72 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  er"));.    sqlit
b4b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b4c0: 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 69 4c 69  P_IfMemZero, iLi
b4d0: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  mit, iBreak);.  
b4e0: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73  }.  if( p->pOffs
b4f0: 65 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4f 66  et ){.    p->iOf
b500: 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d  fset = iOffset =
b510: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
b520: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
b530: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
b540: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
b550: 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
b560: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
b570: 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  se, p->pOffset);
b580: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b590: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74  AddOp(v, OP_Must
b5a0: 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20  BeInt, 0, 0);.  
b5b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b5c0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
b5d0: 65 2c 20 69 4f 66 66 73 65 74 2c 20 70 2d 3e 70  e, iOffset, p->p
b5e0: 4c 69 6d 69 74 3d 3d 30 29 3b 0a 20 20 20 20 56  Limit==0);.    V
b5f0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
b600: 23 20 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72  # OFFSET counter
b610: 22 29 29 3b 0a 20 20 20 20 61 64 64 72 31 20 3d  "));.    addr1 =
b620: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b630: 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73  p(v, OP_IfMemPos
b640: 2c 20 69 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20  , iOffset, 0);. 
b650: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b660: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
b670: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
b680: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b690: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
b6a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b6b0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
b6c0: 31 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  1);.    if( p->p
b6d0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73  Limit ){.      s
b6e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b6f0: 76 2c 20 4f 50 5f 41 64 64 2c 20 30 2c 20 30 29  v, OP_Add, 0, 0)
b700: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
b710: 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ( p->pLimit ){. 
b720: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
b730: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b740: 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 4c 69 6d  P_IfMemPos, iLim
b750: 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  it, 0);.    sqli
b760: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b770: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
b780: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b790: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74  dOp(v, OP_MemInt
b7a0: 2c 20 2d 31 2c 20 69 4c 69 6d 69 74 2b 31 29 3b  , -1, iLimit+1);
b7b0: 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
b7c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b7d0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b   OP_Goto, 0, 0);
b7e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b7f0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
b800: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
b810: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
b820: 65 6d 53 74 6f 72 65 2c 20 69 4c 69 6d 69 74 2b  emStore, iLimit+
b830: 31 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65 43  1, 1);.    VdbeC
b840: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 4c 49  omment((v, "# LI
b850: 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20  MIT+OFFSET"));. 
b860: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
b870: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32 29  mpHere(v, addr2)
b880: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
b890: 6c 6c 6f 63 61 74 65 20 61 20 76 69 72 74 75 61  llocate a virtua
b8a0: 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  l index to use f
b8b0: 6f 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2f 0a 73  or sorting..*/.s
b8c0: 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61 74  tatic void creat
b8d0: 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 50 61  eSortingIndex(Pa
b8e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
b8f0: 65 63 74 20 2a 70 2c 20 45 78 70 72 4c 69 73 74  ect *p, ExprList
b900: 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20 20 69   *pOrderBy){.  i
b910: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
b920: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
b930: 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
b940: 79 2d 3e 69 45 43 75 72 73 6f 72 3d 3d 30 20 29  y->iECursor==0 )
b950: 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e  ;.    pOrderBy->
b960: 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  iECursor = pPars
b970: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 61  e->nTab++;.    a
b980: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
b990: 65 41 64 64 4f 70 28 70 50 61 72 73 65 2d 3e 70  eAddOp(pParse->p
b9a0: 56 64 62 65 2c 20 4f 50 5f 4f 70 65 6e 56 69 72  Vdbe, OP_OpenVir
b9b0: 74 75 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tual,.          
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75    pOrderBy->iECu
b9e0: 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e  rsor, pOrderBy->
b9f0: 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20 20 61 73  nExpr+1);.    as
ba00: 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
ba10: 6e 56 69 72 74 5b 32 5d 20 3d 3d 20 2d 31 20 29  nVirt[2] == -1 )
ba20: 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  ;.    p->addrOpe
ba30: 6e 56 69 72 74 5b 32 5d 20 3d 20 61 64 64 72 3b  nVirt[2] = addr;
ba40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
ba50: 65 20 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72  e opcode at addr
ba60: 20 69 73 20 61 6e 20 4f 50 5f 4f 70 65 6e 56 69   is an OP_OpenVi
ba70: 72 74 75 61 6c 20 74 68 61 74 20 63 72 65 61 74  rtual that creat
ba80: 65 64 20 61 20 73 6f 72 74 69 6e 67 0a 2a 2a 20  ed a sorting.** 
ba90: 69 6e 64 65 78 20 74 68 61 20 77 65 20 65 6e 64  index tha we end
baa0: 65 64 20 75 70 20 6e 6f 74 20 6e 65 65 64 69 6e  ed up not needin
bab0: 67 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  g.  This routine
bac0: 20 63 68 61 6e 67 65 73 20 74 68 61 74 0a 2a 2a   changes that.**
bad0: 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 5f 4e 6f   opcode to OP_No
bae0: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
baf0: 69 64 20 75 6e 63 72 65 61 74 65 53 6f 72 74 69  id uncreateSorti
bb00: 6e 67 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  ngIndex(Parse *p
bb10: 50 61 72 73 65 2c 20 69 6e 74 20 61 64 64 72 29  Parse, int addr)
bb20: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
bb30: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 56  arse->pVdbe;.  V
bb40: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c  dbeOp *pOp = sql
bb50: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
bb60: 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65   addr);.  sqlite
bb70: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
bb80: 20 61 64 64 72 2c 20 30 2c 20 30 29 3b 0a 20 20   addr, 0, 0);.  
bb90: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
bba0: 5f 4e 6f 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 31  _Noop;.  pOp->p1
bbb0: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 32 20   = 0;.  pOp->p2 
bbc0: 3d 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  = 0;.}..#ifndef 
bbd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
bbe0: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
bbf0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70  * Return the app
bc00: 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
bc10: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
bc20: 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
bc30: 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73  mn of.** the res
bc40: 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20  ult set for the 
bc50: 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
bc60: 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20  statement "p".  
bc70: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a  Return NULL if.*
bc80: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  * the column has
bc90: 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c   no default coll
bca0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
bcb0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74  **.** The collat
bcc0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
bcd0: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
bce0: 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72  lect is taken fr
bcf0: 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  om the.** left-m
bd00: 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ost term of the 
bd10: 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20  select that has 
bd20: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
bd30: 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ence..*/.static 
bd40: 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65  CollSeq *multiSe
bd50: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73  lectCollSeq(Pars
bd60: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
bd70: 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  t *p, int iCol){
bd80: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74  .  CollSeq *pRet
bd90: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ;.  if( p->pPrio
bda0: 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  r ){.    pRet = 
bdb0: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
bdc0: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50  eq(pParse, p->pP
bdd0: 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d  rior, iCol);.  }
bde0: 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d  else{.    pRet =
bdf0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52   0;.  }.  if( pR
be00: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 52 65  et==0 ){.    pRe
be10: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
be20: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
be30: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
be40: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  ].pExpr);.  }.  
be50: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23  return pRet;.}.#
be60: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
be70: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
be80: 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  LECT */..#ifndef
be90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
bea0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
beb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
bec0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  is called to pro
bed0: 63 65 73 73 20 61 20 71 75 65 72 79 20 74 68 61  cess a query tha
bee0: 74 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  t is really the 
bef0: 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65  union.** or inte
bf00: 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  rsection of two 
bf10: 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65  or more separate
bf20: 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20   queries..**.** 
bf30: 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  "p" points to th
bf40: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
bf50: 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e  the two queries.
bf60: 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74    the query on t
bf70: 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d  he.** left is p-
bf80: 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65  >pPrior.  The le
bf90: 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61  ft query could a
bfa0: 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  lso be a compoun
bfb0: 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68  d query.** in wh
bfc0: 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f  ich case this ro
bfd0: 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
bfe0: 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
bff0: 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  . .**.** The res
c000: 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61  ults of the tota
c010: 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62  l query are to b
c020: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61  e written into a
c030: 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20   destination.** 
c040: 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69  of type eDest wi
c050: 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61  th parameter iPa
c060: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  rm..**.** Exampl
c070: 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61  e 1:  Consider a
c080: 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f   three-way compo
c090: 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  und SQL statemen
c0a0: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  t..**.**     SEL
c0b0: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e  ECT a FROM t1 UN
c0c0: 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ION SELECT b FRO
c0d0: 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t2 UNION SELEC
c0e0: 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a  T c FROM t3.**.*
c0f0: 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
c100: 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73   is parsed up as
c110: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
c120: 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f      SELECT c FRO
c130: 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a  M t3.**      |.*
c140: 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20  *      `----->  
c150: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
c160: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
c170: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
c180: 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20         `------> 
c190: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
c1a0: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f  1.**.** The arro
c1b0: 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  ws in the diagra
c1c0: 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e  m above represen
c1d0: 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72  t the Select.pPr
c1e0: 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20  ior pointer..** 
c1f0: 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
c200: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  ne is called wit
c210: 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65  h p equal to the
c220: 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a   t3 query, then.
c230: 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62  ** pPrior will b
c240: 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20  e the t2 query. 
c250: 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54   p->op will be T
c260: 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20  K_UNION in this 
c270: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69  case..**.** Noti
c280: 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  ce that because 
c290: 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74  of the way SQLit
c2a0: 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e  e parses compoun
c2b0: 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a  d SELECTs, the.*
c2c0: 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c  * individual sel
c2d0: 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75  ects always grou
c2e0: 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  p from left to r
c2f0: 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ight..*/.static 
c300: 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  int multiSelect(
c310: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c320: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
c330: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
c340: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
c350: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
c360: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
c370: 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
c380: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  */.  int eDest, 
c390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5c 5f             /* \_
c3a0: 5f 5f 20 20 53 74 6f 72 65 20 71 75 65 72 79 20  __  Store query 
c3b0: 72 65 73 75 6c 74 73 20 61 73 20 73 70 65 63 69  results as speci
c3c0: 66 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50  fied */.  int iP
c3d0: 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  arm,            
c3e0: 2f 2a 20 2f 20 20 20 20 20 62 79 20 74 68 65 73  /* /     by thes
c3f0: 65 20 74 77 6f 20 70 61 72 61 6d 65 74 65 72 73  e two parameters
c400: 2e 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 63  .         */.  c
c410: 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20  har *aff        
c420: 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74       /* If eDest
c430: 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74   is SRT_Union, t
c440: 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
c450: 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ng */.){.  int r
c460: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
c470: 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65   /* Success code
c480: 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69   from a subrouti
c490: 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ne */.  Select *
c4a0: 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
c4b0: 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
c4c0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
c4d0: 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
c4e0: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
c4f0: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
c500: 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
c510: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20   */.  int nCol; 
c520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c530: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
c540: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
c550: 65 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  et */.  ExprList
c560: 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a   *pOrderBy;   /*
c570: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
c580: 61 75 73 65 20 6f 6e 20 70 20 2a 2f 0a 20 20 69  ause on p */.  i
c590: 6e 74 20 61 53 65 74 50 32 5b 32 5d 3b 20 20 20  nt aSetP2[2];   
c5a0: 20 20 20 20 20 2f 2a 20 53 65 74 20 50 32 20 76       /* Set P2 v
c5b0: 61 6c 75 65 20 6f 66 20 74 68 65 73 65 20 6f 70  alue of these op
c5c0: 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f   to number of co
c5d0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
c5e0: 53 65 74 50 32 20 3d 20 30 3b 20 20 20 20 20 20  SetP2 = 0;      
c5f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c   /* Number of sl
c600: 6f 74 73 20 69 6e 20 61 53 65 74 50 32 5b 5d 20  ots in aSetP2[] 
c610: 75 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61  used */..  /* Ma
c620: 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
c630: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
c640: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
c650: 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20  prior SELECTs.  
c660: 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61  Only.  ** the la
c670: 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20  st (right-most) 
c680: 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65  SELECT in the se
c690: 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e  ries may have an
c6a0: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
c6b0: 49 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  IT..  */.  if( p
c6c0: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72  ==0 || p->pPrior
c6d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
c6e0: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
c6f0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
c700: 7d 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e  }.  pPrior = p->
c710: 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74  pPrior;.  assert
c720: 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74  ( pPrior->pRight
c730: 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20 29 3b 0a  most!=pPrior );.
c740: 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
c750: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 2d  ->pRightmost==p-
c760: 3e 70 52 69 67 68 74 6d 6f 73 74 20 29 3b 0a 20  >pRightmost );. 
c770: 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72   if( pPrior->pOr
c780: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
c790: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
c7a0: 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c  rse,"ORDER BY cl
c7b0: 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65  ause should come
c7c0: 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65   after %s not be
c7d0: 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c  fore",.      sel
c7e0: 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
c7f0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
c800: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
c810: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
c820: 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  if( pPrior->pLim
c830: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
c840: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
c850: 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73  ,"LIMIT clause s
c860: 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
c870: 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
c880: 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
c890: 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
c8a0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
c8b0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
c8c0: 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  nd;.  }..  /* Ma
c8d0: 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
c8e0: 61 20 76 61 6c 69 64 20 71 75 65 72 79 20 65 6e  a valid query en
c8f0: 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63  gine.  If not, c
c900: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e  reate a new one.
c910: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
c920: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
c930: 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
c940: 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
c950: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
c960: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
c970: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65  /* Create the de
c980: 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72  stination tempor
c990: 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63  ary table if nec
c9a0: 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66  essary.  */.  if
c9b0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 56 69 72  ( eDest==SRT_Vir
c9c0: 74 75 61 6c 54 61 62 20 29 7b 0a 20 20 20 20 61  tualTab ){.    a
c9d0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
c9e0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
c9f0: 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66 28 61 53  nSetP2<sizeof(aS
ca00: 65 74 50 32 29 2f 73 69 7a 65 6f 66 28 61 53 65  etP2)/sizeof(aSe
ca10: 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20 20 20 61  tP2[0]) );.    a
ca20: 53 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d 20  SetP2[nSetP2++] 
ca30: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
ca40: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72  Op(v, OP_OpenVir
ca50: 74 75 61 6c 2c 20 69 50 61 72 6d 2c 20 30 29 3b  tual, iParm, 0);
ca60: 0a 20 20 20 20 65 44 65 73 74 20 3d 20 53 52 54  .    eDest = SRT
ca70: 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _Table;.  }..  /
ca80: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
ca90: 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64  for the left and
caa0: 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74   right SELECT st
cab0: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
cac0: 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
cad0: 4f 72 64 65 72 42 79 3b 0a 20 20 73 77 69 74 63  OrderBy;.  switc
cae0: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
caf0: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20  case TK_ALL: {. 
cb00: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
cb10: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
cb20: 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20  int addr = 0;.  
cb30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
cb40: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b  Prior->pLimit );
cb50: 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d  .        pPrior-
cb60: 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  >pLimit = p->pLi
cb70: 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72  mit;.        pPr
cb80: 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70  ior->pOffset = p
cb90: 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
cba0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
cbb0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
cbc0: 72 69 6f 72 2c 20 65 44 65 73 74 2c 20 69 50 61  rior, eDest, iPa
cbd0: 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  rm, 0, 0, 0, aff
cbe0: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c  );.        p->pL
cbf0: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
cc00: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
cc10: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
cc20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
cc30: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
cc40: 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
cc50: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
cc60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 0;.        p-
cc70: 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72  >iLimit = pPrior
cc80: 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
cc90: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70    p->iOffset = p
cca0: 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a  Prior->iOffset;.
ccb0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69          if( p->i
ccc0: 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20  Limit>=0 ){.    
ccd0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
cce0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ccf0: 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 70   OP_IfMemZero, p
cd00: 2d 3e 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20  ->iLimit, 0);.  
cd10: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
cd20: 65 6e 74 28 28 76 2c 20 22 23 20 4a 75 6d 70 20  ent((v, "# Jump 
cd30: 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72  ahead if LIMIT r
cd40: 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20  eached"));.     
cd50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
cd60: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
cd70: 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74  pParse, p, eDest
cd80: 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30  , iParm, 0, 0, 0
cd90: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  , aff);.        
cda0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
cdb0: 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  or;.        if( 
cdc0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
cdd0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
cde0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
cdf0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
ce00: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
ce10: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
ce20: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
ce30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
ce40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
ce50: 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e      /* For UNION
ce60: 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20 42   ALL ... ORDER B
ce70: 59 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  Y fall through t
ce80: 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65 20  o the next case 
ce90: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
cea0: 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20  e TK_EXCEPT:.   
ceb0: 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
cec0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f  {.      int unio
ced0: 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73  nTab;    /* Curs
cee0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
cef0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
cf00: 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20   holding result 
cf10: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  */.      int op 
cf20: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4f 6e 65  = 0;      /* One
cf30: 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65   of the SRT_ ope
cf40: 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79  rations to apply
cf50: 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   to self */.    
cf60: 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20    int priorOp;  
cf70: 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f     /* The SRT_ o
cf80: 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c  peration to appl
cf90: 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63  y to prior selec
cfa0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ts */.      Expr
cfb0: 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
cfc0: 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c  et; /* Saved val
cfd0: 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74  ues of p->nLimit
cfe0: 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20   and p->nOffset 
cff0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
d000: 72 3b 0a 0a 20 20 20 20 20 20 70 72 69 6f 72 4f  r;..      priorO
d010: 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  p = p->op==TK_AL
d020: 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65 20 3a 20  L ? SRT_Table : 
d030: 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
d040: 20 69 66 28 20 65 44 65 73 74 3d 3d 70 72 69 6f   if( eDest==prio
d050: 72 4f 70 20 26 26 20 70 4f 72 64 65 72 42 79 3d  rOp && pOrderBy=
d060: 3d 30 20 26 26 20 21 70 2d 3e 70 4c 69 6d 69 74  =0 && !p->pLimit
d070: 20 26 26 20 21 70 2d 3e 70 4f 66 66 73 65 74 20   && !p->pOffset 
d080: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
d090: 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d   can reuse a tem
d0a0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e  porary table gen
d0b0: 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45  erated by a SELE
d0c0: 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20  CT to our.      
d0d0: 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20    ** right..    
d0e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75      */.        u
d0f0: 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b  nionTab = iParm;
d100: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d110: 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
d120: 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
d130: 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
d140: 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
d150: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
d160: 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
d170: 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
d180: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
d190: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
d1a0: 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  +;.        if( p
d1b0: 4f 72 64 65 72 42 79 20 26 26 20 6d 61 74 63 68  OrderBy && match
d1c0: 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28  OrderbyToColumn(
d1d0: 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 72 64 65  pParse, p, pOrde
d1e0: 72 42 79 2c 20 75 6e 69 6f 6e 54 61 62 2c 31 29  rBy, unionTab,1)
d1f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
d200: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
d210: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
d220: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
d230: 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
d240: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d250: 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75  (v, OP_OpenVirtu
d260: 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  al, unionTab, 0)
d270: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 72  ;.        if( pr
d280: 69 6f 72 4f 70 3d 3d 53 52 54 5f 54 61 62 6c 65  iorOp==SRT_Table
d290: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
d2a0: 73 65 72 74 28 20 6e 53 65 74 50 32 3c 73 69 7a  sert( nSetP2<siz
d2b0: 65 6f 66 28 61 53 65 74 50 32 29 2f 73 69 7a 65  eof(aSetP2)/size
d2c0: 6f 66 28 61 53 65 74 50 32 5b 30 5d 29 20 29 3b  of(aSetP2[0]) );
d2d0: 0a 20 20 20 20 20 20 20 20 20 20 61 53 65 74 50  .          aSetP
d2e0: 32 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d 20 61 64  2[nSetP2++] = ad
d2f0: 64 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  dr;.        }els
d300: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
d310: 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
d320: 56 69 72 74 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b  Virt[0] == -1 );
d330: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 64  .          p->ad
d340: 64 72 4f 70 65 6e 56 69 72 74 5b 30 5d 20 3d 20  drOpenVirt[0] = 
d350: 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 20 20  addr;.          
d360: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 75  p->pRightmost->u
d370: 73 65 73 56 69 72 74 20 3d 20 31 3b 0a 20 20 20  sesVirt = 1;.   
d380: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
d390: 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65  reateSortingInde
d3a0: 78 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 72  x(pParse, p, pOr
d3b0: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20 20  derBy);.        
d3c0: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
d3d0: 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  t );.      }..  
d3e0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
d3f0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
d400: 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20  s to our left.  
d410: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
d420: 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f  ert( !pPrior->pO
d430: 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20  rderBy );.      
d440: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
d450: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
d460: 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f  r, priorOp, unio
d470: 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61  nTab, 0, 0, 0, a
d480: 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ff);.      if( r
d490: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
d4a0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
d4b0: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
d4c0: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
d4d0: 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74  urrent SELECT st
d4e0: 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f  atement.      */
d4f0: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70  .      switch( p
d500: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ->op ){.        
d510: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
d520: 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70    op = SRT_Excep
d530: 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  t;   break;.    
d540: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49       case TK_UNI
d550: 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f 55  ON:   op = SRT_U
d560: 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a  nion;    break;.
d570: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
d580: 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53  _ALL:     op = S
d590: 52 54 5f 54 61 62 6c 65 3b 20 20 20 20 62 72 65  RT_Table;    bre
d5a0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
d5b0: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
d5c0: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
d5d0: 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  By = 0;.      p-
d5e0: 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79  >disallowOrderBy
d5f0: 20 3d 20 70 4f 72 64 65 72 42 79 21 3d 30 3b 0a   = pOrderBy!=0;.
d600: 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
d610: 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
d620: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
d630: 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70       pOffset = p
d640: 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
d650: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
d660: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d670: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
d680: 2c 20 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e 54 61  , p, op, unionTa
d690: 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  b, 0, 0, 0, aff)
d6a0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
d6b0: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
d6c0: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
d6d0: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
d6e0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
d6f0: 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  e(p->pLimit);.  
d700: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
d710: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
d720: 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
d730: 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69  et;.      p->iLi
d740: 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mit = -1;.      
d750: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b  p->iOffset = -1;
d760: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
d770: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
d780: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
d790: 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20        }...      
d7a0: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64  /* Convert the d
d7b0: 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f  ata in the tempo
d7c0: 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20  rary table into 
d7d0: 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20  whatever form.  
d7e0: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61      ** it is tha
d7f0: 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e  t we currently n
d800: 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20  eed..      */   
d810: 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 65 44     .      if( eD
d820: 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20  est!=priorOp || 
d830: 75 6e 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d 20  unionTab!=iParm 
d840: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
d850: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
d860: 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  tart;.        as
d870: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
d880: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  );.        if( e
d890: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
d8a0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ck ){.          
d8b0: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
d8c0: 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
d8d0: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
d8e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72     }.        iBr
d8f0: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
d900: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
d910: 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73         iCont = s
d920: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
d930: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
d940: 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
d950: 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
d960: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
d970: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d980: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
d990: 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61   unionTab, iBrea
d9a0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  k);.        iSta
d9b0: 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
d9c0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
d9d0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c          rc = sel
d9e0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
d9f0: 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
da00: 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e  t, unionTab, p->
da10: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20  pEList->nExpr,. 
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da30: 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64              pOrd
da40: 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c  erBy, -1, eDest,
da50: 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20   iParm, .       
da60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da70: 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72        iCont, iBr
da80: 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  eak, 0);.       
da90: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
daa0: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
dab0: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
dac0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
dad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
dae0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
daf0: 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
db00: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
db10: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
db20: 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62  P_Next, unionTab
db30: 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20  , iStart);.     
db40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
db50: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
db60: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
db70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
db80: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69  v, OP_Close, uni
db90: 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
dba0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
dbb0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
dbc0: 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20  K_INTERSECT: {. 
dbd0: 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74       int tab1, t
dbe0: 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab2;.      int i
dbf0: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
dc00: 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72  tart;.      Expr
dc10: 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
dc20: 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  et;.      int ad
dc30: 64 72 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e  dr;..      /* IN
dc40: 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65  TERSECT is diffe
dc50: 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74  rent from the ot
dc60: 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65  hers since it re
dc70: 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
dc80: 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  two temporary ta
dc90: 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20  bles.  Hence it 
dca0: 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65  has its own case
dcb0: 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a  .  Begin.      *
dcc0: 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * by allocating 
dcd0: 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69  the tables we wi
dce0: 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ll need..      *
dcf0: 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70  /.      tab1 = p
dd00: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
dd10: 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72       tab2 = pPar
dd20: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
dd30: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26    if( pOrderBy &
dd40: 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  & matchOrderbyTo
dd50: 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 70 2c  Column(pParse,p,
dd60: 70 4f 72 64 65 72 42 79 2c 74 61 62 31 2c 31 29  pOrderBy,tab1,1)
dd70: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
dd80: 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
dd90: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
dda0: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
ddb0: 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e   createSortingIn
ddc0: 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20 70  dex(pParse, p, p
ddd0: 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20 20 20 20  OrderBy);..     
dde0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
ddf0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
de00: 70 65 6e 56 69 72 74 75 61 6c 2c 20 74 61 62 31  penVirtual, tab1
de10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
de20: 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56  rt( p->addrOpenV
de30: 69 72 74 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a  irt[0] == -1 );.
de40: 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
de50: 6e 56 69 72 74 5b 30 5d 20 3d 20 61 64 64 72 3b  nVirt[0] = addr;
de60: 0a 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74  .      p->pRight
de70: 6d 6f 73 74 2d 3e 75 73 65 73 56 69 72 74 20 3d  most->usesVirt =
de80: 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
de90: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a  ( p->pEList );..
dea0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
deb0: 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72  e SELECTs to our
dec0: 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f   left into tempo
ded0: 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31  rary table "tab1
dee0: 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
def0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
df00: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
df10: 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  ior, SRT_Union, 
df20: 74 61 62 31 2c 20 30 2c 20 30 2c 20 30 2c 20 61  tab1, 0, 0, 0, a
df30: 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ff);.      if( r
df40: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
df50: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
df60: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
df70: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
df80: 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e  urrent SELECT in
df90: 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
dfa0: 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20  le "tab2".      
dfb0: 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  */.      addr = 
dfc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dfd0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75  (v, OP_OpenVirtu
dfe0: 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  al, tab2, 0);.  
dff0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
e000: 64 64 72 4f 70 65 6e 56 69 72 74 5b 31 5d 20 3d  ddrOpenVirt[1] =
e010: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
e020: 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 31 5d  >addrOpenVirt[1]
e030: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70   = addr;.      p
e040: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
e050: 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e      pLimit = p->
e060: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
e070: 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
e080: 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e     pOffset = p->
e090: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
e0a0: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
e0b0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e0c0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
e0d0: 70 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  p, SRT_Union, ta
e0e0: 62 32 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  b2, 0, 0, 0, aff
e0f0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
e100: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
e110: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
e120: 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b  lete(p->pLimit);
e130: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
e140: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
e150: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
e160: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28  ffset;.      if(
e170: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
e180: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
e190: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
e1a0: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
e1b0: 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68   code to take th
e1c0: 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  e intersection o
e1d0: 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72  f the two tempor
e1e0: 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  ary.      ** tab
e1f0: 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  les..      */.  
e200: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
e210: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69  EList );.      i
e220: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
e230: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
e240: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
e250: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
e260: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
e270: 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61     }.      iBrea
e280: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
e290: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
e2a0: 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
e2b0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
e2c0: 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74  v);.      comput
e2d0: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
e2e0: 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
e2f0: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
e300: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
e310: 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69  _Rewind, tab1, i
e320: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 69 53  Break);.      iS
e330: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
e340: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f  beAddOp(v, OP_Ro
e350: 77 4b 65 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a  wKey, tab1, 0);.
e360: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e370: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
e380: 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f  Found, tab2, iCo
e390: 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  nt);.      rc = 
e3a0: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
e3b0: 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
e3c0: 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70  List, tab1, p->p
e3d0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3f0: 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65             pOrde
e400: 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  rBy, -1, eDest, 
e410: 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20  iParm, .        
e420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e430: 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65       iCont, iBre
e440: 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ak, 0);.      if
e450: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
e460: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
e470: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
e480: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
e490: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e4a0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
e4b0: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  iCont);.      sq
e4c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
e4d0: 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c  , OP_Next, tab1,
e4e0: 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   iStart);.      
e4f0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
e500: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
e510: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
e520: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
e530: 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29  _Close, tab2, 0)
e540: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e550: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
e560: 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a  lose, tab1, 0);.
e570: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e580: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
e590: 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43  e sure all SELEC
e5a0: 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  Ts in the statem
e5b0: 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ent have the sam
e5c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
e5d0: 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ents.  ** in the
e5e0: 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a  ir result sets..
e5f0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
e600: 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69  ->pEList && pPri
e610: 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20  or->pEList );.  
e620: 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
e630: 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45  Expr!=pPrior->pE
e640: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
e650: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
e660: 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45  sg(pParse, "SELE
e670: 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
e680: 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22  and right of %s"
e690: 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20  .      " do not 
e6a0: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
e6b0: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
e6c0: 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f  olumns", selectO
e6d0: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
e6e0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
e6f0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
e700: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
e710: 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
e720: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 65 6d  f columns in tem
e730: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 0a 20 20  porary tables.  
e740: 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70  */.  nCol = p->p
e750: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
e760: 77 68 69 6c 65 28 20 6e 53 65 74 50 32 20 29 7b  while( nSetP2 ){
e770: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e780: 43 68 61 6e 67 65 50 32 28 76 2c 20 61 53 65 74  ChangeP2(v, aSet
e790: 50 32 5b 2d 2d 6e 53 65 74 50 32 5d 2c 20 6e 43  P2[--nSetP2], nC
e7a0: 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ol);.  }..  /* C
e7b0: 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67  ompute collating
e7c0: 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20   sequences used 
e7d0: 62 79 20 65 69 74 68 65 72 20 74 68 65 20 4f 52  by either the OR
e7e0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
e7f0: 0a 20 20 2a 2a 20 62 79 20 61 6e 79 20 74 65 6d  .  ** by any tem
e800: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
e810: 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
e820: 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
e830: 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
e840: 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
e850: 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
e860: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
e870: 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 0a 20 20  .  Invoke the.  
e880: 2a 2a 20 4f 52 44 45 52 20 42 59 20 70 72 6f 63  ** ORDER BY proc
e890: 65 73 73 69 6e 67 20 69 66 20 74 68 65 72 65 20  essing if there 
e8a0: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
e8b0: 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
e8c0: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73   This section is
e8d0: 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68   run by the righ
e8e0: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
e8f0: 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20  atement only..  
e900: 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
e910: 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ents to the left
e920: 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69   always skip thi
e930: 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67  s part.  The rig
e940: 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c  ht-most.  ** SEL
e950: 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73  ECT might also s
e960: 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66  kip this part if
e970: 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52   it has no ORDER
e980: 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20   BY clause and. 
e990: 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c   ** no temp tabl
e9a0: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e  es are required.
e9b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
e9c0: 65 72 42 79 20 7c 7c 20 70 2d 3e 75 73 65 73 56  erBy || p->usesV
e9d0: 69 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  irt ){.    int i
e9e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e9f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
ea00: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
ea10: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
ea20: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
ea30: 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
ea40: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75  nce for the resu
ea50: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65  lt set */.    Se
ea60: 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  lect *pLoop;    
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
ea80: 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
ea90: 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  gh SELECT statem
eaa0: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  ents */.    Coll
eab0: 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 0a 20 20  Seq **apColl;.  
eac0: 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 43 6f 70    CollSeq **aCop
ead0: 79 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  y;..    assert( 
eae0: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70  p->pRightmost==p
eaf0: 20 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f   );.    pKeyInfo
eb00: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
eb10: 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f  sizeof(*pKeyInfo
eb20: 29 2b 6e 43 6f 6c 2a 32 2a 73 69 7a 65 6f 66 28  )+nCol*2*sizeof(
eb30: 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 6e 43 6f 6c  CollSeq*) + nCol
eb40: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79  );.    if( !pKey
eb50: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  Info ){.      rc
eb60: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
eb70: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  .      goto mult
eb80: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
eb90: 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66    }..    pKeyInf
eba0: 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  o->enc = ENC(pPa
ebb0: 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4b  rse->db);.    pK
ebc0: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d  eyInfo->nField =
ebd0: 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28   nCol;..    for(
ebe0: 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79  i=0, apColl=pKey
ebf0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e  Info->aColl; i<n
ec00: 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c  Col; i++, apColl
ec10: 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f  ++){.      *apCo
ec20: 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
ec30: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
ec40: 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
ec50: 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20   0==*apColl ){. 
ec60: 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
ec70: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
ec80: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
ec90: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
eca0: 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
ecb0: 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
ecc0: 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
ecd0: 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
ece0: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
ecf0: 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
ed00: 6e 56 69 72 74 5b 69 5d 3b 0a 20 20 20 20 20 20  nVirt[i];.      
ed10: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
ed20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
ed30: 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
ed40: 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
ed50: 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
ed60: 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
ed70: 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
ed80: 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
ed90: 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
eda0: 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
edb0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
edc0: 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
edd0: 6e 56 69 72 74 5b 31 5d 3c 30 20 29 3b 0a 20 20  nVirt[1]<0 );.  
ede0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
edf0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ee00: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
ee10: 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
ee20: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
ee30: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
ee40: 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
ee50: 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  )pKeyInfo, P3_KE
ee60: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a  YINFO);.      }.
ee70: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
ee80: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
ee90: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
eea0: 5f 69 74 65 6d 20 2a 70 4f 54 65 72 6d 20 3d 20  _item *pOTerm = 
eeb0: 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 20  pOrderBy->a;.   
eec0: 20 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 45     int nOrderByE
eed0: 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
eee0: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  nExpr;.      int
eef0: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 75 38 20   addr;.      u8 
ef00: 2a 70 53 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20  *pSortOrder;..  
ef10: 20 20 20 20 61 43 6f 70 79 20 3d 20 28 43 6f 6c      aCopy = (Col
ef20: 6c 53 65 71 2a 2a 29 26 70 4b 65 79 49 6e 66 6f  lSeq**)&pKeyInfo
ef30: 5b 31 5d 3b 0a 20 20 20 20 20 20 70 53 6f 72 74  [1];.      pSort
ef40: 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f  Order = pKeyInfo
ef50: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
ef60: 75 38 2a 29 26 61 43 6f 70 79 5b 6e 43 6f 6c 5d  u8*)&aCopy[nCol]
ef70: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61  ;.      memcpy(a
ef80: 43 6f 70 79 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  Copy, pKeyInfo->
ef90: 61 43 6f 6c 6c 2c 20 6e 43 6f 6c 2a 73 69 7a 65  aColl, nCol*size
efa0: 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29 3b 0a 20  of(CollSeq*));. 
efb0: 20 20 20 20 20 61 70 43 6f 6c 6c 20 3d 20 70 4b       apColl = pK
efc0: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 0a 20  eyInfo->aColl;. 
efd0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
efe0: 6e 4f 72 64 65 72 42 79 45 78 70 72 3b 20 69 2b  nOrderByExpr; i+
eff0: 2b 2c 20 70 4f 54 65 72 6d 2b 2b 2c 20 61 70 43  +, pOTerm++, apC
f000: 6f 6c 6c 2b 2b 2c 20 70 53 6f 72 74 4f 72 64 65  oll++, pSortOrde
f010: 72 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  r++){.        Ex
f020: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 54 65  pr *pExpr = pOTe
f030: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
f040: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
f050: 20 70 4f 54 65 72 6d 2d 3e 7a 4e 61 6d 65 3b 0a   pOTerm->zName;.
f060: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f070: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
f080: 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
f090: 43 6f 6c 75 6d 6e 3c 6e 43 6f 6c 20 29 3b 0a 20  Column<nCol );. 
f0a0: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
f0b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 61   ){.          *a
f0c0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c  pColl = sqlite3L
f0d0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
f0e0: 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b  rse, zName, -1);
f0f0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
f100: 20 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c            *apCol
f110: 6c 20 3d 20 61 43 6f 70 79 5b 70 45 78 70 72 2d  l = aCopy[pExpr-
f120: 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20  >iColumn];.     
f130: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 53     }.        *pS
f140: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 54 65 72  ortOrder = pOTer
f150: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
f160: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
f170: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  rt( p->pRightmos
f180: 74 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 61 73  t==p );.      as
f190: 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
f1a0: 6e 56 69 72 74 5b 32 5d 3e 3d 30 20 29 3b 0a 20  nVirt[2]>=0 );. 
f1b0: 20 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 61       addr = p->a
f1c0: 64 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 3b 0a  ddrOpenVirt[2];.
f1d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f1e0: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
f1f0: 72 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  r, p->pEList->nE
f200: 78 70 72 2b 32 29 3b 0a 20 20 20 20 20 20 70 4b  xpr+2);.      pK
f210: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d  eyInfo->nField =
f220: 20 6e 4f 72 64 65 72 42 79 45 78 70 72 3b 0a 20   nOrderByExpr;. 
f230: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f240: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
f250: 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
f260: 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P3_KEYINFO_HA
f270: 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 70 4b  NDOFF);.      pK
f280: 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20  eyInfo = 0;.    
f290: 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
f2a0: 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c  il(pParse, p, v,
f2b0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
f2c0: 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29  r, eDest, iParm)
f2d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
f2e0: 69 74 65 46 72 65 65 28 70 4b 65 79 49 6e 66 6f  iteFree(pKeyInfo
f2f0: 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65  );.  }..multi_se
f300: 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 72 65 74 75  lect_end:.  retu
f310: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
f320: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
f330: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
f340: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
f350: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
f360: 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74  * Scan through t
f370: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
f380: 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76  xpr.  Replace ev
f390: 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ery reference to
f3a0: 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  .** a column in 
f3b0: 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61  table number iTa
f3c0: 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20  ble with a copy 
f3d0: 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  of the iColumn-t
f3e0: 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45  h.** entry in pE
f3f0: 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76  List.  (But leav
f400: 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
f410: 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  the ROWID column
f420: 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29   .** unchanged.)
f430: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
f440: 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ine is part of t
f450: 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72  he flattening pr
f460: 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71  ocedure.  A subq
f470: 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65  uery.** whose re
f480: 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69  sult set is defi
f490: 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70  ned by pEList ap
f4a0: 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69  pears as entry i
f4b0: 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c  n the.** FROM cl
f4c0: 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
f4d0: 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56   such that the V
f4e0: 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67  DBE cursor assig
f4f0: 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46  ned to that.** F
f500: 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ORM clause entry
f510: 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69   is iTable.  Thi
f520: 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74  s routine make t
f530: 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
f540: 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
f550: 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
f560: 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
f570: 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
f580: 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
f590: 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
f5a0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
f5b0: 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
f5c0: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
f5d0: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
f5e0: 2a 2c 69 6e 74 2c 45 78 70 72 4c 69 73 74 2a 29  *,int,ExprList*)
f5f0: 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 44 65  ;  /* Forward De
f600: 63 6c 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  cl */.static voi
f610: 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 53 65  d substSelect(Se
f620: 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70  lect *, int, Exp
f630: 72 4c 69 73 74 20 2a 29 3b 20 20 2f 2a 20 46 6f  rList *);  /* Fo
f640: 72 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74  rward Decl */.st
f650: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
f660: 78 70 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c  xpr(Expr *pExpr,
f670: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70   int iTable, Exp
f680: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a  rList *pEList){.
f690: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
f6a0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
f6b0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
f6c0: 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
f6d0: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a  able==iTable ){.
f6e0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
f6f0: 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
f700: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
f710: 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
f720: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
f730: 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ew;.      assert
f740: 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ( pEList!=0 && p
f750: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45  Expr->iColumn<pE
f760: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
f770: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
f780: 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20  pr->pLeft==0 && 
f790: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
f7a0: 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   && pExpr->pList
f7b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
f7c0: 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45  w = pEList->a[pE
f7d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
f7e0: 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
f7f0: 74 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20  t( pNew!=0 );.  
f800: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
f810: 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20  pNew->op;.      
f820: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
f830: 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Left==0 );.     
f840: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
f850: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
f860: 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  New->pLeft);.   
f870: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
f880: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
f890: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67       pExpr->pRig
f8a0: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
f8b0: 44 75 70 28 70 4e 65 77 2d 3e 70 52 69 67 68 74  Dup(pNew->pRight
f8c0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
f8d0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
f8e0: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
f8f0: 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  >pList = sqlite3
f900: 45 78 70 72 4c 69 73 74 44 75 70 28 70 4e 65 77  ExprListDup(pNew
f910: 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
f920: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
f930: 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  pNew->iTable;.  
f940: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
f950: 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75  mn = pNew->iColu
f960: 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  mn;.      pExpr-
f970: 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41  >iAgg = pNew->iA
f980: 67 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  gg;.      sqlite
f990: 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70  3TokenCopy(&pExp
f9a0: 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d  r->token, &pNew-
f9b0: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73  >token);.      s
f9c0: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
f9d0: 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70  &pExpr->span, &p
f9e0: 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  New->span);.    
f9f0: 20 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74    pExpr->pSelect
fa00: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
fa10: 44 75 70 28 70 4e 65 77 2d 3e 70 53 65 6c 65 63  Dup(pNew->pSelec
fa20: 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  t);.      pExpr-
fa30: 3e 66 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 66  >flags = pNew->f
fa40: 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  lags;.    }.  }e
fa50: 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78  lse{.    substEx
fa60: 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  pr(pExpr->pLeft,
fa70: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
fa80: 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  ;.    substExpr(
fa90: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69  pExpr->pRight, i
faa0: 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
fab0: 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
fac0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pExpr->pSelect, 
fad0: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
fae0: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
faf0: 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c  st(pExpr->pList,
fb00: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
fb10: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
fb20: 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
fb30: 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  t(ExprList *pLis
fb40: 74 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45  t, int iTable, E
fb50: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29  xprList *pEList)
fb60: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
fb70: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
fb80: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
fb90: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
fba0: 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  ++){.    substEx
fbb0: 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pr(pList->a[i].p
fbc0: 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  Expr, iTable, pE
fbd0: 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  List);.  }.}.sta
fbe0: 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
fbf0: 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  lect(Select *p, 
fc00: 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72  int iTable, Expr
fc10: 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20  List *pEList){. 
fc20: 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
fc30: 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
fc40: 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61  t(p->pEList, iTa
fc50: 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
fc60: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d  substExprList(p-
fc70: 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c  >pGroupBy, iTabl
fc80: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
fc90: 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
fca0: 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c  OrderBy, iTable,
fcb0: 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
fcc0: 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  tExpr(p->pHaving
fcd0: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
fce0: 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 70  );.  substExpr(p
fcf0: 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65  ->pWhere, iTable
fd00: 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 23 65 6e  , pEList);.}.#en
fd10: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
fd20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
fd30: 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) */..#ifndef SQ
fd40: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
fd50: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
fd60: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  e attempts to fl
fd70: 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
fd80: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65   in order to spe
fd90: 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e  ed.** execution.
fda0: 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20 69    It returns 1 i
fdb0: 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67  f it makes chang
fdc0: 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66  es and 0 if no f
fdd0: 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63  lattening.** occ
fde0: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e  urs..**.** To un
fdf0: 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e  derstand the con
fe00: 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69  cept of flatteni
fe10: 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  ng, consider the
fe20: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75   following.** qu
fe30: 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ery:.**.**     S
fe40: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45  ELECT a FROM (SE
fe50: 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
fe60: 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
fe70: 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a  0) WHERE a>5.**.
fe80: 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77  ** The default w
fe90: 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69  ay of implementi
fea0: 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73  ng this query is
feb0: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a   to execute the.
fec0: 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73  ** subquery firs
fed0: 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  t and store the 
fee0: 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d  results in a tem
fef0: 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
ff00: 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75  en.** run the ou
ff10: 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61  ter query on tha
ff20: 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  t temporary tabl
ff30: 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65  e.  This require
ff40: 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20  s two.** passes 
ff50: 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20  over the data.  
ff60: 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63  Furthermore, bec
ff70: 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61  ause the tempora
ff80: 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20  ry table.** has 
ff90: 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20  no indices, the 
ffa0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20  WHERE clause on 
ffb0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
ffc0: 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74  cannot be.** opt
ffd0: 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  imized..**.** Th
ffe0: 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
fff0: 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71  pts to rewrite q
10000 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74  ueries such as t
10010 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a  he above into.**
10020 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73   a single flat s
10030 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73  elect, like this
10040 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
10050 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
10060 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20   t1 WHERE z<100 
10070 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  AND a>5.**.** Th
10080 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
10090 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66   for this simpif
100a0 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68  ication gives th
100b0 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a  e same result.**
100c0 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f   but only has to
100d0 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f   scan the data o
100e0 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73  nce.  And becaus
100f0 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20  e indices might 
10100 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65  .** exist on the
10110 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d   table t1, a com
10120 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68  plete scan of th
10130 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a  e data might be.
10140 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a  ** avoided..**.*
10150 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  * Flattening is 
10160 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
10170 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
10180 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
10190 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68  .**.**   (1)  Th
101a0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
101b0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
101c0 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61  o not both use a
101d0 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
101e0 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71     (2)  The subq
101f0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
10200 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
10210 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
10220 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
10230 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71     (3)  The subq
10240 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
10250 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
10260 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f   a left outer jo
10270 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  in, or.**       
10280 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
10290 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a 6f   not itself a jo
102a0 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33 30  in.  (Ticket #30
102b0 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20  6).**.**   (4)  
102c0 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
102d0 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20  not DISTINCT or 
102e0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
102f0 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
10300 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20  *.**   (5)  The 
10310 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
10320 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20  DISTINCT or the 
10330 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
10340 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
10350 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
10360 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20  *.**   (6)  The 
10370 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
10380 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
10390 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
103a0 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20  ery is not.**   
103b0 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a       DISTINCT..*
103c0 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20  *.**   (7)  The 
103d0 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46  subquery has a F
103e0 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
103f0 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62  *   (8)  The sub
10400 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
10410 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
10420 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
10430 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
10440 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71     (9)  The subq
10450 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
10460 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
10470 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
10480 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
10490 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
104a0 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73  .**  (10)  The s
104b0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
104c0 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
104d0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
104e0 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
104f0 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e        use LIMIT.
10500 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68  .**.**  (11)  Th
10510 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
10520 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
10530 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20  o not both have 
10540 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
10550 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20 54  ..**.**  (12)  T
10560 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
10570 6f 74 20 74 68 65 20 72 69 67 68 74 20 74 65 72  ot the right ter
10580 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  m of a LEFT OUTE
10590 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a 2a  R JOIN or the.**
105a0 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
105b0 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   has no WHERE cl
105c0 61 75 73 65 2e 20 20 28 61 64 64 65 64 20 62 79  ause.  (added by
105d0 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a 2a 2a   ticket #350).**
105e0 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
105f0 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
10600 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
10610 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
10620 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
10630 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
10640 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
10650 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
10660 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
10670 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
10680 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49  es and subqueryI
10690 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
106a0 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
106b0 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  s aggregates..**
106c0 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
106d0 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  g is not attempt
106e0 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
106f0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20   is a no-op and 
10700 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66  returns 0..** If
10710 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
10720 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f  ttempted this ro
10730 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
10740 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  .**.** All of th
10750 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  e expression ana
10760 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72  lysis must occur
10770 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74   on both the out
10780 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20  er query and.** 
10790 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66  the subquery bef
107a0 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
107b0 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   runs..*/.static
107c0 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71   int flattenSubq
107d0 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70  uery(.  Parse *p
107e0 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
107f0 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
10800 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
10810 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
10820 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f   The parent or o
10830 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74  uter SELECT stat
10840 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
10850 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
10860 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70  /* Index in p->p
10870 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  Src->a[] of the 
10880 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a  inner subquery *
10890 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20  /.  int isAgg,  
108a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
108b0 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54   if outer SELECT
108c0 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
108d0 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
108e0 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nt subqueryIsAgg
108f0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
10900 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
10910 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
10920 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  ions */.){.  Sel
10930 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20  ect *pSub;      
10940 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75   /* The inner qu
10950 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79  ery or "subquery
10960 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  " */.  SrcList *
10970 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
10980 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
10990 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
109a0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
109b0 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65  SubSrc;   /* The
109c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
109d0 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
109e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
109f0 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  t;    /* The res
10a00 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
10a10 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
10a20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
10a30 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
10a40 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
10a50 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
10a60 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
10a70 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
10a80 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
10a90 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nter */.  Expr *
10aa0 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
10ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10ac0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
10ad0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
10ae0 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65  st_item *pSubite
10af0 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  m;   /* The subq
10b00 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  uery */..  /* Ch
10b10 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c  eck to see if fl
10b20 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
10b30 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30  itted.  Return 0
10b40 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20   if not..  */.  
10b50 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
10b60 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  n 0;.  pSrc = p-
10b70 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
10b80 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d   pSrc && iFrom>=
10b90 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d  0 && iFrom<pSrc-
10ba0 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69  >nSrc );.  pSubi
10bb0 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
10bc0 46 72 6f 6d 5d 3b 0a 20 20 70 53 75 62 20 3d 20  From];.  pSub = 
10bd0 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
10be0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  t;.  assert( pSu
10bf0 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  b!=0 );.  if( is
10c00 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49  Agg && subqueryI
10c10 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
10c20 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49  .  if( subqueryI
10c30 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53  sAgg && pSrc->nS
10c40 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  rc>1 ) return 0;
10c50 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75  .  pSubSrc = pSu
10c60 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  b->pSrc;.  asser
10c70 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20  t( pSubSrc );.  
10c80 69 66 28 20 28 70 53 75 62 2d 3e 70 4c 69 6d 69  if( (pSub->pLimi
10c90 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 29 20  t && p->pLimit) 
10ca0 7c 7c 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74  || pSub->pOffset
10cb0 20 7c 7c 20 0a 20 20 20 20 20 20 28 70 53 75 62   || .      (pSub
10cc0 2d 3e 70 4c 69 6d 69 74 20 26 26 20 69 73 41 67  ->pLimit && isAg
10cd0 67 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  g) ) return 0;. 
10ce0 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
10cf0 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rc==0 ) return 0
10d00 3b 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 69 73  ;.  if( pSub->is
10d10 44 69 73 74 69 6e 63 74 20 26 26 20 28 70 53 72  Distinct && (pSr
10d20 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
10d30 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
10d40 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
10d50 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26  p->isDistinct &&
10d60 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
10d70 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
10d80 20 28 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64   (p->disallowOrd
10d90 65 72 42 79 20 7c 7c 20 70 2d 3e 70 4f 72 64 65  erBy || p->pOrde
10da0 72 42 79 29 20 26 26 20 70 53 75 62 2d 3e 70 4f  rBy) && pSub->pO
10db0 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20  rderBy ) return 
10dc0 30 3b 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63  0;..  /* Restric
10dd0 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20  tion 3:  If the 
10de0 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f  subquery is a jo
10df0 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
10e00 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20  e subquery is . 
10e10 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20   ** not used as 
10e20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
10e30 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f  d of an outer jo
10e40 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66  in.  Examples of
10e50 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69   why this.  ** i
10e60 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
10e70 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
10e80 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
10e90 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29  OIN (t2 JOIN t3)
10ea0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
10eb0 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
10ec0 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
10ed0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
10ee0 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
10ef0 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20  R JOIN t2) JOIN 
10f00 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69  t3.  **.  ** whi
10f10 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  ch is not at all
10f20 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e   the same thing.
10f30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
10f40 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26 26 20 69  Src->nSrc>1 && i
10f50 46 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d  From>0 && (pSrc-
10f60 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e  >a[iFrom-1].join
10f70 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
10f80 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
10f90 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  n 0;.  }..  /* R
10fa0 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20  estriction 12:  
10fb0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
10fc0 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
10fd0 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f  rand of a left o
10fe0 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20  uter.  ** join, 
10ff0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
11000 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48  bquery has no WH
11010 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ERE clause..  **
11020 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20   An examples of 
11030 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20  why this is not 
11040 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
11050 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
11060 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53  FT OUTER JOIN (S
11070 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
11080 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20  WHERE t2.x>0).  
11090 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
110a0 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
110b0 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
110c0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
110d0 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
110e0 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32  OIN t2) WHERE t2
110f0 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42  .x>0.  **.  ** B
11100 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65  ut the t2.x>0 te
11110 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66  st will always f
11120 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f  ail on a NULL ro
11130 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20  w of t2, which. 
11140 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20   ** effectively 
11150 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54  converts the OUT
11160 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20  ER JOIN into an 
11170 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f  INNER JOIN..  */
11180 0a 20 20 69 66 28 20 69 46 72 6f 6d 3e 30 20 26  .  if( iFrom>0 &
11190 26 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  & (pSrc->a[iFrom
111a0 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  -1].jointype & J
111b0 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20  T_OUTER)!=0 .   
111c0 20 20 20 26 26 20 70 53 75 62 2d 3e 70 57 68 65     && pSub->pWhe
111d0 72 65 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  re!=0 ){.    ret
111e0 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
111f0 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
11200 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
11210 73 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  s flattening is 
11220 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20 74 68  permitted for th
11230 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20  e.  ** iFrom-th 
11240 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
11250 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
11260 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
11270 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c  /..  /* Move all
11280 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65   of the FROM ele
11290 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62  ments of the sub
112a0 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
112b0 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
112c0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
112d0 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20   query.  Before 
112e0 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65  doing this, reme
112f0 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75  mber.  ** the cu
11300 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
11310 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74  the original out
11320 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c  er query FROM el
11330 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50  ement in.  ** iP
11340 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72  arent.  The iPar
11350 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ent cursor will 
11360 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20  never be used.  
11370 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a  Subsequent code.
11380 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65    ** will scan e
11390 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69  xpressions looki
113a0 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72  ng for iParent r
113b0 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65  eferences and re
113c0 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65  place.  ** those
113d0 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68   references with
113e0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
113f0 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65  t resolve to the
11400 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20   subquery FROM. 
11410 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20   ** elements we 
11420 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20  are now copying 
11430 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65  in..  */.  iPare
11440 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69  nt = pSubitem->i
11450 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20  Cursor;.  {.    
11460 69 6e 74 20 6e 53 75 62 53 72 63 20 3d 20 70 53  int nSubSrc = pS
11470 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20  ubSrc->nSrc;.   
11480 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
11490 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
114a0 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  pe;..    sqlite3
114b0 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
114c0 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 29 3b 0a  Subitem->pTab);.
114d0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
114e0 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
114f0 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  se);.    sqliteF
11500 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  ree(pSubitem->zN
11510 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
11520 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a  Free(pSubitem->z
11530 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20  Alias);.    if( 
11540 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20  nSubSrc>1 ){.   
11550 20 20 20 69 6e 74 20 65 78 74 72 61 20 3d 20 6e     int extra = n
11560 53 75 62 53 72 63 20 2d 20 31 3b 0a 20 20 20 20  SubSrc - 1;.    
11570 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53 75    for(i=1; i<nSu
11580 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
11590 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74      pSrc = sqlit
115a0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
115b0 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20  pSrc, 0, 0);.   
115c0 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 53     }.      p->pS
115d0 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 20  rc = pSrc;.     
115e0 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
115f0 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e 3d 69 46  c-1; i-extra>=iF
11600 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  rom; i--){.     
11610 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 20 3d 20     pSrc->a[i] = 
11620 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74 72 61 5d  pSrc->a[i-extra]
11630 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11640 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
11650 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
11660 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46      pSrc->a[i+iF
11670 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e  rom] = pSubSrc->
11680 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73  a[i];.      mems
11690 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69  et(&pSubSrc->a[i
116a0 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75  ], 0, sizeof(pSu
116b0 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20  bSrc->a[i]));.  
116c0 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b    }.    pSrc->a[
116d0 69 46 72 6f 6d 2b 6e 53 75 62 53 72 63 2d 31 5d  iFrom+nSubSrc-1]
116e0 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e  .jointype = join
116f0 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  type;.  }..  /* 
11700 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74 69  Now begin substi
11710 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79 20  tuting subquery 
11720 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65  result set expre
11730 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 2a 2a  ssions for .  **
11740 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
11750 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
11760 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
11770 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61 6d 70 6c   ** .  ** Exampl
11780 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53  e:.  **.  **   S
11790 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20  ELECT a+5, b*10 
117a0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33  FROM (SELECT x*3
117b0 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62   AS a, y+10 AS b
117c0 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20   FROM t1) WHERE 
117d0 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c 20 20 20  a>b;.  **   \   
117e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117f0 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
11800 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f   subquery ______
11810 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f  ____/          /
11820 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  .  **    \______
11830 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20  _______________ 
11840 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f  outer query ____
11850 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
11860 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a  __________/.  **
11870 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74  .  ** We look at
11880 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
11890 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
118a0 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
118b0 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 2a 2a  lace we see.  **
118c0 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75   "a" we substitu
118d0 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65  te "x*3" and eve
118e0 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20  ry place we see 
118f0 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "b" we substitut
11900 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20  e "y+10"..  */. 
11910 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
11920 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
11930 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
11940 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70  ;.  pList = p->p
11950 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30  EList;.  for(i=0
11960 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
11970 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
11980 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28   *pExpr;.    if(
11990 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
119a0 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70 72 20  me==0 && (pExpr 
119b0 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
119c0 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20  xpr)->span.z!=0 
119d0 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  ){.      pList->
119e0 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[i].zName = sql
119f0 69 74 65 53 74 72 4e 44 75 70 28 28 63 68 61 72  iteStrNDup((char
11a00 2a 29 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c  *)pExpr->span.z,
11a10 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b   pExpr->span.n);
11a20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
11a30 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73 75   isAgg ){.    su
11a40 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
11a50 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74  GroupBy, iParent
11a60 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
11a70 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
11a80 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
11a90 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
11aa0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  );.  }.  if( pSu
11ab0 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
11ac0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
11ad0 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
11ae0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
11af0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
11b00 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42     pSub->pOrderB
11b10 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  y = 0;.  }else i
11b20 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
11b30 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  {.    substExprL
11b40 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
11b50 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
11b60 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69  pEList);.  }.  i
11b70 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20  f( pSub->pWhere 
11b80 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  ){.    pWhere = 
11b90 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
11ba0 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  Sub->pWhere);.  
11bb0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 68 65 72  }else{.    pWher
11bc0 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
11bd0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
11be0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
11bf0 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20  >pHaving==0 );. 
11c00 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
11c10 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 70  p->pWhere;.    p
11c20 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
11c30 65 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  e;.    substExpr
11c40 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  (p->pHaving, iPa
11c50 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
11c60 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76  st);.    p->pHav
11c70 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
11c80 72 41 6e 64 28 70 2d 3e 70 48 61 76 69 6e 67 2c  rAnd(p->pHaving,
11c90 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
11ca0 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 29 29 3b  pSub->pHaving));
11cb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
11cc0 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
11cd0 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d     p->pGroupBy =
11ce0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
11cf0 44 75 70 28 70 53 75 62 2d 3e 70 47 72 6f 75 70  Dup(pSub->pGroup
11d00 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  By);.  }else{.  
11d10 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
11d20 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20  Where, iParent, 
11d30 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
11d40 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
11d50 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 2d  qlite3ExprAnd(p-
11d60 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29  >pWhere, pWhere)
11d70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
11d80 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20  flattened query 
11d90 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65  is distinct if e
11da0 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20  ither the inner 
11db0 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f 75 74 65  or the.  ** oute
11dc0 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  r query is disti
11dd0 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e  nct. .  */.  p->
11de0 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
11df0 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53  isDistinct || pS
11e00 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a  ub->isDistinct;.
11e10 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 45 4c 45 43  .  /*.  ** SELEC
11e20 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45  T ... FROM (SELE
11e30 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f  CT ... LIMIT a O
11e40 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78  FFSET b) LIMIT x
11e50 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 2a 2f 0a   OFFSET y;.  */.
11e60 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
11e70 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 69  it ){.    p->pLi
11e80 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d  mit = pSub->pLim
11e90 69 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4c  it;.    pSub->pL
11ea0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  imit = 0;.  }.. 
11eb0 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65   /* Finially, de
11ec0 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66  lete what is lef
11ed0 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
11ee0 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a  y and return.  *
11ef0 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a  * success..  */.
11f00 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
11f10 65 6c 65 74 65 28 70 53 75 62 29 3b 0a 20 20 72  elete(pSub);.  r
11f20 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
11f30 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
11f40 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VIEW */../*.** 
11f50 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45  Analyze the SELE
11f60 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  CT statement pas
11f70 73 65 64 20 69 6e 20 61 73 20 61 6e 20 61 72 67  sed in as an arg
11f80 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20  ument to see if 
11f90 69 74 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c  it.** is a simpl
11fa0 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
11fb0 20 71 75 65 72 79 2e 20 20 49 66 20 69 74 20 69   query.  If it i
11fc0 73 20 61 6e 64 20 74 68 69 73 20 71 75 65 72 79  s and this query
11fd0 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73   can be.** satis
11fe0 66 69 65 64 20 75 73 69 6e 67 20 61 20 73 69 6e  fied using a sin
11ff0 67 6c 65 20 73 65 65 6b 20 74 6f 20 74 68 65 20  gle seek to the 
12000 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64  beginning or end
12010 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a   of an index,.**
12020 20 74 68 65 6e 20 67 65 6e 65 72 61 74 65 20 74   then generate t
12030 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73  he code for this
12040 20 53 45 4c 45 43 54 20 61 6e 64 20 72 65 74 75   SELECT and retu
12050 72 6e 20 31 2e 20 20 49 66 20 74 68 69 73 20 69  rn 1.  If this i
12060 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70  s not a .** simp
12070 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  le min() or max(
12080 29 20 71 75 65 72 79 2c 20 74 68 65 6e 20 72 65  ) query, then re
12090 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20  turn 0;.**.** A 
120a0 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20  simply min() or 
120b0 6d 61 78 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b  max() query look
120c0 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
120d0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 69 6e  **    SELECT min
120e0 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a  (a) FROM table;.
120f0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78  **    SELECT max
12100 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a  (a) FROM table;.
12110 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20  **.** The query 
12120 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79 20 61 20  may have only a 
12130 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
12140 69 74 73 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e  its FROM argumen
12150 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e  t.  There.** can
12160 20 62 65 20 6e 6f 20 47 52 4f 55 50 20 42 59 20   be no GROUP BY 
12170 6f 72 20 48 41 56 49 4e 47 20 6f 72 20 57 48 45  or HAVING or WHE
12180 52 45 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65  RE clauses.  The
12190 20 72 65 73 75 6c 74 20 73 65 74 20 6d 75 73 74   result set must
121a0 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69 6e 28 29  .** be the min()
121b0 20 6f 72 20 6d 61 78 28 29 20 6f 66 20 61 20 73   or max() of a s
121c0 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
121d0 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  the table.  The 
121e0 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65  column.** in the
121f0 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
12200 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
12210 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20   indexed..**.** 
12220 54 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 74  The parameters t
12230 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  o this routine a
12240 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 66  re the same as f
12250 6f 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  or sqlite3Select
12260 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68  ()..** See the h
12270 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e  eader comment on
12280 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f   that routine fo
12290 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
122a0 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
122b0 74 69 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69  tic int simpleMi
122c0 6e 4d 61 78 51 75 65 72 79 28 50 61 72 73 65 20  nMaxQuery(Parse 
122d0 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
122e0 2a 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  *p, int eDest, i
122f0 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 45 78 70  nt iParm){.  Exp
12300 72 20 2a 70 45 78 70 72 3b 0a 20 20 69 6e 74 20  r *pExpr;.  int 
12310 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70  iCol;.  Table *p
12320 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
12330 64 78 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a  dx;.  int base;.
12340 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
12350 20 73 65 65 6b 4f 70 3b 0a 20 20 45 78 70 72 4c   seekOp;.  ExprL
12360 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 2a 70 4c  ist *pEList, *pL
12370 69 73 74 2c 20 65 4c 69 73 74 3b 0a 20 20 73 74  ist, eList;.  st
12380 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
12390 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20  em eListItem;.  
123a0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
123b0 20 69 6e 74 20 62 72 6b 3b 0a 20 20 69 6e 74 20   int brk;.  int 
123c0 69 44 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  iDb;..  /* Check
123d0 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
123e0 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c  query is a simpl
123f0 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
12400 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 0a   query.  Return.
12410 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74 20    ** zero if it 
12420 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20  is  not..  */.  
12430 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  if( p->pGroupBy 
12440 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c  || p->pHaving ||
12450 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
12460 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
12470 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70  p->pSrc;.  if( p
12480 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
12490 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73  eturn 0;.  pELis
124a0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
124b0 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
124c0 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
124d0 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69  ;.  pExpr = pELi
124e0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
124f0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
12500 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
12510 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
12520 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
12530 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  ist;.  if( pList
12540 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45  ==0 || pList->nE
12550 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
12560 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
12570 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74  token.n!=3 ) ret
12580 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  urn 0;.  if( sql
12590 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68  ite3StrNICmp((ch
125a0 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
125b0 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29  .z,"min",3)==0 )
125c0 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f  {.    seekOp = O
125d0 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73  P_Rewind;.  }els
125e0 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
125f0 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78  NICmp((char*)pEx
12600 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78  pr->token.z,"max
12610 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ",3)==0 ){.    s
12620 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b  eekOp = OP_Last;
12630 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
12640 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45  turn 0;.  }.  pE
12650 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30  xpr = pList->a[0
12660 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
12670 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
12680 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  UMN ) return 0;.
12690 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e    iCol = pExpr->
126a0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20  iColumn;.  pTab 
126b0 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  = pSrc->a[0].pTa
126c0 62 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  b;...  /* If we 
126d0 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69 74 20  get to here, it 
126e0 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72 79 20  means the query 
126f0 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63  is of the correc
12700 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65  t form..  ** Che
12710 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
12720 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64 65 78  we have an index
12730 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78 20 70   and make pIdx p
12740 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a  oint to the.  **
12750 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64   appropriate ind
12760 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69 6e 28  ex.  If the min(
12770 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e  ) or max() is on
12780 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
12790 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c  ARY.  ** key col
127a0 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73  umn, no index is
127b0 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 73 65   necessary so se
127c0 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20  t pIdx to NULL. 
127d0 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62   If no.  ** usab
127e0 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e  le index is foun
127f0 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a  d, return 0..  *
12800 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29  /.  if( iCol<0 )
12810 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a  {.    pIdx = 0;.
12820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 43 6f 6c    }else{.    Col
12830 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
12840 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
12850 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
12860 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
12870 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
12880 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
12890 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
128a0 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
128b0 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=1 );.      if(
128c0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
128d0 30 5d 3d 3d 69 43 6f 6c 20 26 26 20 0a 20 20 20  0]==iCol && .   
128e0 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65         0==sqlite
128f0 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 61  3StrICmp(pIdx->a
12900 7a 43 6f 6c 6c 5b 30 5d 2c 20 70 43 6f 6c 6c 2d  zColl[0], pColl-
12910 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  >zName) ){.     
12920 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12930 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
12940 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e  pIdx==0 ) return
12950 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64   0;.  }..  /* Id
12960 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 74 79  entify column ty
12970 70 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62  pes if we will b
12980 65 20 75 73 69 6e 67 20 74 68 65 20 63 61 6c 6c  e using the call
12990 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  back.  This.  **
129a0 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64   step is skipped
129b0 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   if the output i
129c0 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61 62  s going to a tab
129d0 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63  le or a memory c
129e0 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65 20 63 6f  ell..  ** The co
129f0 6c 75 6d 6e 20 6e 61 6d 65 73 20 68 61 76 65 20  lumn names have 
12a00 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65 6e  already been gen
12a10 65 72 61 74 65 64 20 69 6e 20 74 68 65 20 63 61  erated in the ca
12a20 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
12a30 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
12a40 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
12a50 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
12a60 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
12a70 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
12a80 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
12a90 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
12aa0 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
12ab0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  ..  */.  if( eDe
12ac0 73 74 3d 3d 53 52 54 5f 56 69 72 74 75 61 6c 54  st==SRT_VirtualT
12ad0 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
12ae0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
12af0 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 69 50  _OpenVirtual, iP
12b00 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20  arm, 1);.  }..  
12b10 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 63 6f  /* Generating co
12b20 64 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d  de to find the m
12b30 69 6e 20 6f 72 20 74 68 65 20 6d 61 78 2e 20 20  in or the max.  
12b40 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c 20 77 65  Basically all we
12b50 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f   have.  ** to do
12b60 20 69 73 20 66 69 6e 64 20 74 68 65 20 66 69 72   is find the fir
12b70 73 74 20 6f 72 20 74 68 65 20 6c 61 73 74 20 65  st or the last e
12b80 6e 74 72 79 20 69 6e 20 74 68 65 20 63 68 6f 73  ntry in the chos
12b90 65 6e 20 69 6e 64 65 78 2e 20 20 49 66 0a 20 20  en index.  If.  
12ba0 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20  ** the min() or 
12bb0 6d 61 78 28 29 20 69 73 20 6f 6e 20 74 68 65 20  max() is on the 
12bc0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
12bd0 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e 64 20 74  KEY, then find t
12be0 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 6f 72  he first.  ** or
12bf0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
12c00 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 20  he main table.. 
12c10 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   */.  iDb = sqli
12c20 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
12c30 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
12c40 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61  b->pSchema);.  a
12c50 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 7c 7c  ssert( iDb>=0 ||
12c60 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65   pTab->isTransie
12c70 6e 74 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  nt );.  sqlite3C
12c80 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
12c90 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
12ca0 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
12cb0 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
12cc0 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
12cd0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 62 61 73  b->zName);.  bas
12ce0 65 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 69  e = pSrc->a[0].i
12cf0 43 75 72 73 6f 72 3b 0a 20 20 62 72 6b 20 3d 20  Cursor;.  brk = 
12d00 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
12d10 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75  abel(v);.  compu
12d20 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
12d30 28 70 50 61 72 73 65 2c 20 70 2c 20 62 72 6b 29  (pParse, p, brk)
12d40 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b  ;.  if( pSrc->a[
12d50 30 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  0].pSelect==0 ){
12d60 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
12d70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 62 61  Table(pParse, ba
12d80 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  se, iDb, pTab, O
12d90 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 7d  P_OpenRead);.  }
12da0 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29  .  if( pIdx==0 )
12db0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
12dc0 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70  eAddOp(v, seekOp
12dd0 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 65  , base, 0);.  }e
12de0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 76 65 6e  lse{.    /* Even
12df0 20 74 68 6f 75 67 68 20 74 68 65 20 63 75 72 73   though the curs
12e00 6f 72 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20  or used to open 
12e10 74 68 65 20 69 6e 64 65 78 20 68 65 72 65 20 69  the index here i
12e20 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 2a 2a 20  s closed.    ** 
12e30 61 73 20 73 6f 6f 6e 20 61 73 20 61 20 73 69 6e  as soon as a sin
12e40 67 6c 65 20 76 61 6c 75 65 20 68 61 73 20 62 65  gle value has be
12e50 65 6e 20 72 65 61 64 20 66 72 6f 6d 20 69 74 2c  en read from it,
12e60 20 61 6c 6c 6f 63 61 74 65 20 69 74 0a 20 20 20   allocate it.   
12e70 20 2a 2a 20 75 73 69 6e 67 20 28 70 50 61 72 73   ** using (pPars
12e80 65 2d 3e 6e 54 61 62 2b 2b 29 20 74 6f 20 70 72  e->nTab++) to pr
12e90 65 76 65 6e 74 20 74 68 65 20 63 75 72 73 6f 72  event the cursor
12ea0 20 69 64 20 66 72 6f 6d 20 62 65 69 6e 67 20 0a   id from being .
12eb0 20 20 20 20 2a 2a 20 72 65 75 73 65 64 2e 20 54      ** reused. T
12ec0 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  his is important
12ed0 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20   for statements 
12ee0 6f 66 20 74 68 65 20 66 6f 72 6d 20 0a 20 20 20  of the form .   
12ef0 20 2a 2a 20 22 49 4e 53 45 52 54 20 49 4e 54 4f   ** "INSERT INTO
12f00 20 78 20 53 45 4c 45 43 54 20 6d 61 78 28 29 20   x SELECT max() 
12f10 46 52 4f 4d 20 78 22 2e 0a 20 20 20 20 2a 2f 0a  FROM x"..    */.
12f20 20 20 20 20 69 6e 74 20 69 49 64 78 3b 0a 20 20      int iIdx;.  
12f30 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20    KeyInfo *pKey 
12f40 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
12f50 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
12f60 64 78 29 3b 0a 20 20 20 20 69 49 64 78 20 3d 20  dx);.    iIdx = 
12f70 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
12f80 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
12f90 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
12fa0 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
12fb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12fc0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
12fd0 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  iDb, 0);.    sql
12fe0 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
12ff0 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78  P_OpenRead, iIdx
13000 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 0a 20  , pIdx->tnum, . 
13010 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
13020 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48  ey, P3_KEYINFO_H
13030 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 69 66 28  ANDOFF);.    if(
13040 20 73 65 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69   seekOp==OP_Rewi
13050 6e 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nd ){.      sqli
13060 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13070 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a  OP_Null, 0, 0);.
13080 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13090 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
130a0 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 29 3b 0a  eRecord, 1, 0);.
130b0 20 20 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f        seekOp = O
130c0 50 5f 4d 6f 76 65 47 74 3b 0a 20 20 20 20 7d 0a  P_MoveGt;.    }.
130d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
130e0 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20  ddOp(v, seekOp, 
130f0 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 73 71  iIdx, 0);.    sq
13100 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13110 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69  , OP_IdxRowid, i
13120 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  Idx, 0);.    sql
13130 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
13140 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c   OP_Close, iIdx,
13150 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
13160 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13170 4d 6f 76 65 47 65 2c 20 62 61 73 65 2c 20 30 29  MoveGe, base, 0)
13180 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45  ;.  }.  eList.nE
13190 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65  xpr = 1;.  memse
131a0 74 28 26 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c  t(&eListItem, 0,
131b0 20 73 69 7a 65 6f 66 28 65 4c 69 73 74 49 74 65   sizeof(eListIte
131c0 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d  m));.  eList.a =
131d0 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65   &eListItem;.  e
131e0 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20  List.a[0].pExpr 
131f0 3d 20 70 45 78 70 72 3b 0a 20 20 73 65 6c 65 63  = pExpr;.  selec
13200 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
13210 65 2c 20 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c  e, p, &eList, 0,
13220 20 30 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73 74   0, 0, -1, eDest
13230 2c 20 69 50 61 72 6d 2c 20 62 72 6b 2c 20 62 72  , iParm, brk, br
13240 6b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  k, 0);.  sqlite3
13250 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
13260 28 76 2c 20 62 72 6b 29 3b 0a 20 20 73 71 6c 69  (v, brk);.  sqli
13270 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13280 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20  OP_Close, base, 
13290 30 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20  0);.  .  return 
132a0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  1;.}../*.** Anal
132b0 79 7a 65 20 61 6e 64 20 4f 52 44 45 52 20 42 59  yze and ORDER BY
132c0 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
132d0 75 73 65 20 69 6e 20 61 20 53 45 4c 45 43 54 20  use in a SELECT 
132e0 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75  statement.  Retu
132f0 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
13300 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 2e   of errors seen.
13310 0a 2a 2a 0a 2a 2a 20 41 6e 20 4f 52 44 45 52 20  .**.** An ORDER 
13320 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 69  BY or GROUP BY i
13330 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72  s a list of expr
13340 65 73 73 69 6f 6e 73 2e 20 20 49 66 20 61 6e 79  essions.  If any
13350 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
13360 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  s an integer con
13370 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 61 74  stant, then that
13380 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72   expression is r
13390 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 0a 2a  eplaced by the.*
133a0 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
133b0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 65 73  entry in the res
133c0 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
133d0 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 4f 72  ic int processOr
133e0 64 65 72 47 72 6f 75 70 42 79 28 0a 20 20 4e 61  derGroupBy(.  Na
133f0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
13400 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
13410 65 78 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ext of the SELEC
13420 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a  T statement. */.
13430 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
13440 65 72 42 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f  erBy,   /* The O
13450 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
13460 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65   BY clause to be
13470 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
13480 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
13490 65 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  e     /* Either 
134a0 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55  "ORDER" or "GROU
134b0 50 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61  P", as appropria
134c0 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  te */.){.  int i
134d0 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
134e0 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69  List = pNC->pELi
134f0 73 74 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 72  st;     /* The r
13500 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
13510 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 50 61 72   SELECT */.  Par
13520 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43  se *pParse = pNC
13530 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 2f 2a  ->pParse;     /*
13540 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
13550 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 2a 2f  of the SELECT */
13560 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73  .  assert( pELis
13570 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64  t );..  if( pOrd
13580 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  erBy==0 ) return
13590 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
135a0 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
135b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
135c0 69 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a  iCol;.    Expr *
135d0 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
135e0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
135f0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
13600 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
13610 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l) ){.      if( 
13620 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d  iCol>0 && iCol<=
13630 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
13640 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13650 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a  ExprDelete(pE);.
13660 20 20 20 20 20 20 20 20 70 45 20 3d 20 70 4f 72          pE = pOr
13670 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
13680 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
13690 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  up(pEList->a[iCo
136a0 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  l-1].pExpr);.   
136b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
136c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
136d0 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
136e0 20 20 20 20 20 20 22 25 73 20 42 59 20 63 6f 6c        "%s BY col
136f0 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f 75  umn number %d ou
13700 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f  t of range - sho
13710 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20  uld be ".       
13720 20 20 20 20 22 62 65 74 77 65 65 6e 20 31 20 61      "between 1 a
13730 6e 64 20 25 64 22 2c 20 7a 54 79 70 65 2c 20 69  nd %d", zType, i
13740 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  Col, pEList->nEx
13750 70 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  pr);.        ret
13760 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
13770 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
13780 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
13790 61 6d 65 73 28 70 4e 43 2c 20 70 45 29 20 29 7b  ames(pNC, pE) ){
137a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
137b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
137c0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
137d0 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20  tant(pE) ){.    
137e0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
137f0 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
13800 20 20 20 20 22 25 73 20 42 59 20 74 65 72 6d 73      "%s BY terms
13810 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e   must not be non
13820 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e  -integer constan
13830 74 73 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20 20  ts", zType);.   
13840 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
13850 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
13860 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
13870 20 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76 65   routine resolve
13880 73 20 61 6e 79 20 6e 61 6d 65 73 20 75 73 65 64  s any names used
13890 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
138a0 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 73 75 70  et of the.** sup
138b0 70 6c 69 65 64 20 53 45 4c 45 43 54 20 73 74 61  plied SELECT sta
138c0 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 53  tement. If the S
138d0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
138e0 62 65 69 6e 67 20 72 65 73 6f 6c 76 65 64 0a 2a  being resolved.*
138f0 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  * is a sub-selec
13900 74 2c 20 74 68 65 6e 20 70 4f 75 74 65 72 4e 43  t, then pOuterNC
13910 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
13920 20 74 68 65 20 4e 61 6d 65 43 6f 6e 74 65 78 74   the NameContext
13930 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65   .** of the pare
13940 6e 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 69 6e  nt SELECT..*/.in
13950 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52  t sqlite3SelectR
13960 65 73 6f 6c 76 65 28 0a 20 20 50 61 72 73 65 20  esolve(.  Parse 
13970 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
13980 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
13990 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
139a0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
139b0 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
139c0 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
139d0 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d   coded. */.  Nam
139e0 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72  eContext *pOuter
139f0 4e 43 20 20 2f 2a 20 54 68 65 20 6f 75 74 65 72  NC  /* The outer
13a00 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 4d   name context. M
13a10 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 29  ay be NULL. */.)
13a20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  {.  ExprList *pE
13a30 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f  List;          /
13a40 2a 20 52 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f  * Result set. */
13a50 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13a70 20 46 6f 72 2d 6c 6f 6f 70 20 76 61 72 69 61 62   For-loop variab
13a80 6c 65 20 75 73 65 64 20 69 6e 20 6d 75 6c 74 69  le used in multi
13a90 70 6c 65 20 70 6c 61 63 65 73 20 2a 2f 0a 20 20  ple places */.  
13aa0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
13ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
13ac0 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  cal name-context
13ad0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
13ae0 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20 20 20  pGroupBy;       
13af0 20 2f 2a 20 54 68 65 20 67 72 6f 75 70 20 62 79   /* The group by
13b00 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a   clause */..  /*
13b10 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
13b20 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72 65 2c   has run before,
13b30 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
13b40 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ely. */.  if( p-
13b50 3e 69 73 52 65 73 6f 6c 76 65 64 20 29 7b 0a 20  >isResolved ){. 
13b60 20 20 20 61 73 73 65 72 74 28 20 21 70 4f 75 74     assert( !pOut
13b70 65 72 4e 43 20 29 3b 0a 20 20 20 20 72 65 74 75  erNC );.    retu
13b80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13b90 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65  }.  p->isResolve
13ba0 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20  d = 1;..  /* If 
13bb0 74 68 65 72 65 20 68 61 76 65 20 61 6c 72 65 61  there have alrea
13bc0 64 79 20 62 65 65 6e 20 65 72 72 6f 72 73 2c 20  dy been errors, 
13bd0 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20  do nothing. */. 
13be0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
13bf0 72 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  r>0 ){.    retur
13c00 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
13c10 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72    }..  /* Prepar
13c20 65 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61  e the select sta
13c30 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 63 61 6c  tement. This cal
13c40 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74 65 20  l will allocate 
13c50 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  all cursors.  **
13c60 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e   required to han
13c70 64 6c 65 20 74 68 65 20 74 61 62 6c 65 73 20 61  dle the tables a
13c80 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  nd subqueries in
13c90 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
13ca0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65  ..  */.  if( pre
13cb0 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72  pSelectStmt(pPar
13cc0 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65  se, p) ){.    re
13cd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
13ce0 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  R;.  }..  /* Res
13cf0 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73 73  olve the express
13d00 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d 49  ions in the LIMI
13d10 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
13d20 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20 2a 2a  uses. These.  **
13d30 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
13d40 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61 6e 79   to refer to any
13d50 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73 73 20   names, so pass 
13d60 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43 6f 6e  an empty NameCon
13d70 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  text..  */.  mem
13d80 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
13d90 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43  eof(sNC));.  sNC
13da0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
13db0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
13dc0 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
13dd0 26 73 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  &sNC, p->pLimit)
13de0 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ||.      sqlite
13df0 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
13e00 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 66 66 73  s(&sNC, p->pOffs
13e10 65 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  et) ){.    retur
13e20 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
13e30 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70    }..  /* Set up
13e40 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d   the local name-
13e50 63 6f 6e 74 65 78 74 20 74 6f 20 70 61 73 73 20  context to pass 
13e60 74 6f 20 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  to ExprResolveNa
13e70 6d 65 73 28 29 20 74 6f 0a 20 20 2a 2a 20 72 65  mes() to.  ** re
13e80 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73  solve the expres
13e90 73 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  sion-list..  */.
13ea0 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d    sNC.allowAgg =
13eb0 20 31 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69   1;.  sNC.pSrcLi
13ec0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
13ed0 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4f 75 74  sNC.pNext = pOut
13ee0 65 72 4e 43 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f  erNC;..  /* Reso
13ef0 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74 68 65  lve names in the
13f00 20 72 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a   result set. */.
13f10 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
13f20 4c 69 73 74 3b 0a 20 20 69 66 28 20 21 70 45 4c  List;.  if( !pEL
13f30 69 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ist ) return SQL
13f40 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72  ITE_ERROR;.  for
13f50 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
13f60 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
13f70 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45 4c 69   Expr *pX = pELi
13f80 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
13f90 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
13fa0 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
13fb0 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a 20 20 20  &sNC, pX) ){.   
13fc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13fd0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
13fe0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
13ff0 20 61 72 65 20 6e 6f 20 61 67 67 72 65 67 61 74   are no aggregat
14000 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74  e functions in t
14010 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c 20 61  he result-set, a
14020 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 0a  nd no GROUP BY .
14030 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c    ** expression,
14040 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 67   do not allow ag
14050 67 72 65 67 61 74 65 73 20 69 6e 20 61 6e 79 20  gregates in any 
14060 6f 66 20 74 68 65 20 6f 74 68 65 72 20 65 78 70  of the other exp
14070 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
14080 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69 73 41   assert( !p->isA
14090 67 67 20 29 3b 0a 20 20 70 47 72 6f 75 70 42 79  gg );.  pGroupBy
140a0 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
140b0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 7c    if( pGroupBy |
140c0 7c 20 73 4e 43 2e 68 61 73 41 67 67 20 29 7b 0a  | sNC.hasAgg ){.
140d0 20 20 20 20 70 2d 3e 69 73 41 67 67 20 3d 20 31      p->isAgg = 1
140e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
140f0 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 30 3b  NC.allowAgg = 0;
14100 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20  .  }..  /* If a 
14110 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73  HAVING clause is
14120 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74   present, then t
14130 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 47  here must be a G
14140 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a  ROUP BY clause..
14150 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 48    */.  if( p->pH
14160 61 76 69 6e 67 20 26 26 20 21 70 47 72 6f 75 70  aving && !pGroup
14170 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
14180 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14190 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c  , "a GROUP BY cl
141a0 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64  ause is required
141b0 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22 29   before HAVING")
141c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
141d0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
141e0 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 78 70    /* Add the exp
141f0 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
14200 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  the name-context
14210 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e 67 20   before parsing 
14220 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 65  the.  ** other e
14230 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
14240 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
14250 6e 74 2e 20 54 68 69 73 20 69 73 20 73 6f 20 74  nt. This is so t
14260 68 61 74 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  hat.  ** express
14270 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52  ions in the WHER
14280 45 20 63 6c 61 75 73 65 20 28 65 74 63 2e 29 20  E clause (etc.) 
14290 63 61 6e 20 72 65 66 65 72 20 74 6f 20 65 78 70  can refer to exp
142a0 72 65 73 73 69 6f 6e 73 20 62 79 0a 20 20 2a 2a  ressions by.  **
142b0 20 61 6c 69 61 73 65 73 20 69 6e 20 74 68 65 20   aliases in the 
142c0 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2a  result set..  **
142d0 0a 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e  .  ** Minor poin
142e0 74 3a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  t: If this is th
142f0 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
14300 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c   expression will
14310 20 62 65 0a 20 20 2a 2a 20 72 65 2d 65 76 61 6c   be.  ** re-eval
14320 75 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 72  uated for each r
14330 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 0a  eference to it..
14340 20 20 2a 2f 0a 20 20 73 4e 43 2e 70 45 4c 69 73    */.  sNC.pELis
14350 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
14360 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
14370 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
14380 43 2c 20 70 2d 3e 70 57 68 65 72 65 29 20 7c 7c  C, p->pWhere) ||
14390 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
143a0 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
143b0 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  sNC, p->pHaving)
143c0 20 7c 7c 0a 20 20 20 20 20 20 70 72 6f 63 65 73   ||.      proces
143d0 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26 73  sOrderGroupBy(&s
143e0 4e 43 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  NC, p->pOrderBy,
143f0 20 22 4f 52 44 45 52 22 29 20 7c 7c 0a 20 20 20   "ORDER") ||.   
14400 20 20 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47     processOrderG
14410 72 6f 75 70 42 79 28 26 73 4e 43 2c 20 70 47 72  roupBy(&sNC, pGr
14420 6f 75 70 42 79 2c 20 22 47 52 4f 55 50 22 29 0a  oupBy, "GROUP").
14430 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
14440 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
14450 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
14460 65 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  e the GROUP BY c
14470 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 63  lause does not c
14480 6f 6e 74 61 69 6e 20 61 67 67 72 65 67 61 74 65  ontain aggregate
14490 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f   functions..  */
144a0 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20  .  if( pGroupBy 
144b0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
144c0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
144d0 65 6d 3b 0a 20 20 0a 20 20 20 20 66 6f 72 28 69  em;.  .    for(i
144e0 3d 30 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70  =0, pItem=pGroup
144f0 42 79 2d 3e 61 3b 20 69 3c 70 47 72 6f 75 70 42  By->a; i<pGroupB
14500 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  y->nExpr; i++, p
14510 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Item++){.      i
14520 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
14530 74 79 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  ty(pItem->pExpr,
14540 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20 20 20   EP_Agg) ){.    
14550 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14560 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 67 67  Msg(pParse, "agg
14570 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
14580 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
14590 20 69 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20   in ".          
145a0 20 20 22 74 68 65 20 47 52 4f 55 50 20 42 59 20    "the GROUP BY 
145b0 63 6c 61 75 73 65 22 29 3b 0a 20 20 20 20 20 20  clause");.      
145c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
145d0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
145e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
145f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
14600 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65  ./*.** Reset the
14610 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
14620 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ulator..**.** Th
14630 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
14640 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74  mulator is a set
14650 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73   of memory cells
14660 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e   that hold.** in
14670 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
14680 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61  ts while calcula
14690 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74  ting an aggregat
146a0 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  e.  This.** rout
146b0 69 6e 65 20 73 69 6d 70 6c 79 20 73 74 6f 72 65  ine simply store
146c0 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f  s NULLs in all o
146d0 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63  f those memory c
146e0 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ells..*/.static 
146f0 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d 75  void resetAccumu
14700 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
14710 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
14720 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
14730 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
14740 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
14750 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
14760 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28  nc *pFunc;.  if(
14770 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63   pAggInfo->nFunc
14780 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  +pAggInfo->nColu
14790 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  mn==0 ){.    ret
147a0 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  urn;.  }.  for(i
147b0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
147c0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
147d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
147e0 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c  dOp(v, OP_MemNul
147f0 6c 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  l, pAggInfo->aCo
14800 6c 5b 69 5d 2e 69 4d 65 6d 2c 20 30 29 3b 0a 20  l[i].iMem, 0);. 
14810 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70   }.  for(pFunc=p
14820 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20  AggInfo->aFunc, 
14830 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
14840 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75  >nFunc; i++, pFu
14850 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  nc++){.    sqlit
14860 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
14870 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 70 46 75 6e 63  P_MemNull, pFunc
14880 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  ->iMem, 0);.    
14890 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  if( pFunc->iDist
148a0 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
148b0 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e   Expr *pE = pFun
148c0 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  c->pExpr;.      
148d0 69 66 28 20 70 45 2d 3e 70 4c 69 73 74 3d 3d 30  if( pE->pList==0
148e0 20 7c 7c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e   || pE->pList->n
148f0 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
14900 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14910 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54  sg(pParse, "DIST
14920 49 4e 43 54 20 69 6e 20 61 67 67 72 65 67 61 74  INCT in aggregat
14930 65 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77  e must be follow
14940 65 64 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ed ".           
14950 22 62 79 20 61 6e 20 65 78 70 72 65 73 73 69 6f  "by an expressio
14960 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75  n");.        pFu
14970 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  nc->iDistinct = 
14980 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
14990 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
149a0 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79   *pKeyInfo = key
149b0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
149c0 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69  (pParse, pE->pLi
149d0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  st);.        sql
149e0 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
149f0 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 70  P_OpenVirtual, p
14a00 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c  Func->iDistinct,
14a10 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
14a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
14a30 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
14a40 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
14a50 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FF);.      }.   
14a60 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
14a70 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67  Invoke the OP_Ag
14a80 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65  gFinalize opcode
14a90 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65   for every aggre
14aa0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  gate function.**
14ab0 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20   in the AggInfo 
14ac0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
14ad0 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69  atic void finali
14ae0 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50  zeAggFunctions(P
14af0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
14b00 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
14b10 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
14b20 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
14b30 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
14b40 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
14b50 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
14b60 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
14b70 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
14b80 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
14b90 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
14ba0 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
14bb0 70 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c 69 74  pList;.    sqlit
14bc0 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
14bd0 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d  AggFinal, pF->iM
14be0 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  em, pList ? pLis
14bf0 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 0a 20 20  t->nExpr : 0,.  
14c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c10 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70      (void*)pF->p
14c20 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43 44 45 46  Func, P3_FUNCDEF
14c30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
14c40 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d  Update the accum
14c50 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65  ulator memory ce
14c60 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65  lls for an aggre
14c70 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  gate based on.**
14c80 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
14c90 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
14ca0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64  .static void upd
14cb0 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  ateAccumulator(P
14cc0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
14cd0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
14ce0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
14cf0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
14d00 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
14d10 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
14d20 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
14d30 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41  o_col *pC;..  pA
14d40 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
14d50 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d  de = 1;.  for(i=
14d60 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
14d70 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
14d80 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
14d90 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41  F++){.    int nA
14da0 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  rg;.    int addr
14db0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 45 78  Next = 0;.    Ex
14dc0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
14dd0 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74  pF->pExpr->pList
14de0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
14df0 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  ){.      nArg = 
14e00 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
14e10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
14e20 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
14e30 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  se, pList);.    
14e40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72  }else{.      nAr
14e50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 0;.    }.   
14e60 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e   if( pF->iDistin
14e70 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ct>=0 ){.      a
14e80 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65  ddrNext = sqlite
14e90 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
14ea0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14eb0 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20   nArg==1 );.    
14ec0 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 76    codeDistinct(v
14ed0 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c  , pF->iDistinct,
14ee0 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 32 29   addrNext, 1, 2)
14ef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14f00 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43  pF->pFunc->needC
14f10 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20  ollSeq ){.      
14f20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
14f30 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74   0;.      struct
14f40 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
14f50 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74  pItem;.      int
14f60 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
14f70 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
14f80 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 70  a; !pColl && j<p
14f90 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  List->nExpr; j++
14fa0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
14fb0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
14fc0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
14fd0 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
14fe0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
14ff0 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
15000 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
15010 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
15020 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
15030 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15040 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c  beOp3(v, OP_Coll
15050 53 65 71 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  Seq, 0, 0, (char
15060 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c   *)pColl, P3_COL
15070 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20  LSEQ);.    }.   
15080 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
15090 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 70  v, OP_AggStep, p
150a0 46 2d 3e 69 4d 65 6d 2c 20 6e 41 72 67 2c 20 28  F->iMem, nArg, (
150b0 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c  void*)pF->pFunc,
150c0 20 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P3_FUNCDEF);.  
150d0 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29    if( addrNext )
150e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
150f0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15100 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20  v, addrNext);.  
15110 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
15120 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pC=pAggInfo->
15130 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f  aCol; i<pAggInfo
15140 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20  ->nAccumulator; 
15150 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20  i++, pC++){.    
15160 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
15170 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70  pParse, pC->pExp
15180 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
15190 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
151a0 65 6d 53 74 6f 72 65 2c 20 70 43 2d 3e 69 4d 65  emStore, pC->iMe
151b0 6d 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 70 41 67  m, 1);.  }.  pAg
151c0 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
151d0 65 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  e = 0;.}.../*.**
151e0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
151f0 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c  or the given SEL
15200 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
15210 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
15220 20 61 72 65 20 64 69 73 74 72 69 62 75 74 65 64   are distributed
15230 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73   in various ways
15240 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
15250 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 65 44  e.** value of eD
15260 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e 0a 2a  est and iParm..*
15270 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74 20 56  *.**     eDest V
15280 61 6c 75 65 20 20 20 20 20 20 20 52 65 73 75 6c  alue       Resul
15290 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  t.**     -------
152a0 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
152b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152d0 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ----.**     SRT_
152e0 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f  Callback    Invo
152f0 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  ke the callback 
15300 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20  for each row of 
15310 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
15320 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20  *     SRT_Mem   
15330 20 20 20 20 20 20 53 74 6f 72 65 20 66 69 72 73        Store firs
15340 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f  t result in memo
15350 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a  ry cell iParm.**
15360 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20  .**     SRT_Set 
15370 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65          Store re
15380 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20 6f 66  sults as keys of
15390 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a   table iParm..**
153a0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f  .**     SRT_Unio
153b0 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  n       Store re
153c0 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69  sults as a key i
153d0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
153e0 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20  ble iParm.**.** 
153f0 20 20 20 20 53 52 54 5f 45 78 63 65 70 74 20 20      SRT_Except  
15400 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c      Remove resul
15410 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d 70  ts from the temp
15420 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
15430 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  m..**.**     SRT
15440 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f  _Table       Sto
15450 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65  re results in te
15460 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
15470 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  arm.**.** The ta
15480 62 6c 65 20 61 62 6f 76 65 20 69 73 20 69 6e 63  ble above is inc
15490 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64 69 74 69  omplete.  Additi
154a0 6f 6e 61 6c 20 65 44 69 73 74 20 76 61 6c 75 65  onal eDist value
154b0 20 68 61 76 65 20 62 65 20 61 64 64 65 64 0a 2a   have be added.*
154c0 2a 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6d  * since this com
154d0 6d 65 6e 74 20 77 61 73 20 77 72 69 74 74 65 6e  ment was written
154e0 2e 20 20 53 65 65 20 74 68 65 20 73 65 6c 65 63  .  See the selec
154f0 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66 75 6e  tInnerLoop() fun
15500 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 20 63  ction for.** a c
15510 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e 67 20  omplete listing 
15520 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 76  of the allowed v
15530 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74 20 61  alues of eDest a
15540 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69 6e 67  nd their meaning
15550 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
15560 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
15570 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
15580 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
15590 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
155a0 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
155b0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
155c0 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
155d0 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
155e0 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
155f0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
15600 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
15610 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
15620 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
15630 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
15640 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
15650 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50  at..**.** The pP
15660 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62  arent, parentTab
15670 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74 41 67  , and *pParentAg
15680 67 20 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c  g fields are fil
15690 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73 0a 2a  led in if this.*
156a0 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20 73 75  * SELECT is a su
156b0 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 72 6f  bquery.  This ro
156c0 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20 74 6f  utine may try to
156d0 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20 53 45   combine this SE
156e0 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69 74 73  LECT.** with its
156f0 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20   parent to form 
15700 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 71 75  a single flat qu
15710 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e  ery.  In so doin
15720 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63  g, it might.** c
15730 68 61 6e 67 65 20 74 68 65 20 70 61 72 65 6e 74  hange the parent
15740 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f   query from a no
15750 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f 20 61  n-aggregate to a
15760 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
15770 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20 72  y..** For that r
15780 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61 72 65  eason, the pPare
15790 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20 70 61  ntAgg flag is pa
157a0 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65  ssed as a pointe
157b0 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20  r, so it.** can 
157c0 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  be changed..**.*
157d0 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 20 54  * Example 1:   T
157e0 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
157f0 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65  e pParent parame
15800 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  ter..**.**    SE
15810 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a  LECT * FROM t1 J
15820 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c 20 63  OIN (SELECT x, c
15830 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29  ount(*) FROM t2)
15840 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20   JOIN t3;.**    
15850 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
15860 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20         \_______ 
15870 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  subquery _______
15880 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20  /        /.**   
15890 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158c0 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20           /.**   
158d0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
158e0 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
158f0 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
15900 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20  ________/.**.** 
15910 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
15920 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 6f  called for the o
15930 75 74 65 72 20 71 75 65 72 79 20 66 69 72 73 74  uter query first
15940 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63 61 6c  .   For that cal
15950 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77 69  l,.** pParent wi
15960 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72  ll be NULL.  Dur
15970 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73 73 69  ing the processi
15980 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  ng of the outer 
15990 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20  query, this .** 
159a0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
159b0 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f  d recursively to
159c0 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75 62 71   handle the subq
159d0 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65 20 72  uery.  For the r
159e0 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c  ecursive.** call
159f0 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 70  , pParent will p
15a00 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 65  oint to the oute
15a10 72 20 71 75 65 72 79 2e 20 20 42 65 63 61 75 73  r query.  Becaus
15a20 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  e the subquery i
15a30 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20  s.** the second 
15a40 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74 68 72  element in a thr
15a50 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65  ee-way join, the
15a60 20 70 61 72 65 6e 74 54 61 62 20 70 61 72 61 6d   parentTab param
15a70 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  eter will.** be 
15a80 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c 75 65  1 (the 2nd value
15a90 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65 64 20   of a 0-indexed 
15aa0 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73  array.).*/.int s
15ab0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20  qlite3Select(.  
15ac0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
15ad0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
15ae0 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
15af0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
15b00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15b10 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
15b20 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
15b30 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20  .  int eDest,   
15b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
15b50 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
15b60 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
15b70 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20  int iParm,      
15b80 20 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72 61         /* A para
15b90 6d 65 74 65 72 20 75 73 65 64 20 62 79 20 74 68  meter used by th
15ba0 65 20 65 44 65 73 74 20 64 69 73 70 6f 73 61 6c  e eDest disposal
15bb0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53 65 6c   method */.  Sel
15bc0 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20 20  ect *pParent,   
15bd0 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
15be0 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68 20  ELECT for which 
15bf0 74 68 69 73 20 69 73 20 61 20 73 75 62 2d 71 75  this is a sub-qu
15c00 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72  ery */.  int par
15c10 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20 20  entTab,         
15c20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61 72  /* Index in pPar
15c30 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68 69  ent->pSrc of thi
15c40 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  s query */.  int
15c50 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 20 20   *pParentAgg,   
15c60 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
15c70 50 61 72 65 6e 74 20 75 73 65 73 20 61 67 67 72  Parent uses aggr
15c80 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
15c90 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20  */.  char *aff  
15ca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
15cb0 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55  f eDest is SRT_U
15cc0 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69  nion, the affini
15cd0 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  ty string */.){.
15ce0 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
15cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
15d00 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57   counters */.  W
15d10 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
15d20 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ;     /* Return 
15d30 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72  from sqlite3Wher
15d40 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64  eBegin() */.  Vd
15d50 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
15d60 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
15d70 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65  ual machine unde
15d80 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
15d90 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20  /.  int isAgg;  
15da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
15db0 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69  ue for select li
15dc0 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28  sts like "count(
15dd0 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  *)" */.  ExprLis
15de0 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
15df0 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
15e00 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a  ns to extract. *
15e10 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
15e20 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69  bList;     /* Li
15e30 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  st of tables to 
15e40 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20  select from */. 
15e50 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
15e60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
15e70 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61  HERE clause.  Ma
15e80 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
15e90 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
15ea0 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  y;    /* The ORD
15eb0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  ER BY clause.  M
15ec0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
15ed0 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
15ee0 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52  By;    /* The GR
15ef0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
15f00 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
15f10 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20   Expr *pHaving; 
15f20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48          /* The H
15f30 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d  AVING clause.  M
15f40 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
15f50 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20  int isDistinct; 
15f60 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
15f70 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
15f80 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
15f90 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69  t */.  int disti
15fa0 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nct;          /*
15fb0 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f   Table to use fo
15fc0 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
15fd0 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  et */.  int rc =
15fe0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
15ff0 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
16000 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
16010 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tion */.  int ad
16020 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
16030 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
16040 6e 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c  n OP_OpenVirtual
16050 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
16060 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e    AggInfo sAggIn
16070 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f  fo;      /* Info
16080 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20  rmation used by 
16090 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
160a0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b  s */.  int iEnd;
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
160c0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
160d0 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79  end of the query
160e0 20 2a 2f 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20   */..  if( p==0 
160f0 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  || sqlite3Malloc
16100 46 61 69 6c 65 64 28 29 20 7c 7c 20 70 50 61 72  Failed() || pPar
16110 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
16120 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
16130 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
16140 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
16150 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
16160 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , 0) ) return 1;
16170 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49  .  memset(&sAggI
16180 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  nfo, 0, sizeof(s
16190 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 23 69 66 6e  AggInfo));..#ifn
161a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
161b0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
161c0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
161d0 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20   are a sequence 
161e0 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74  of queries, do t
161f0 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20  he earlier ones 
16200 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  first..  */.  if
16210 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
16220 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74     if( p->pRight
16230 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  most==0 ){.     
16240 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 0a   Select *pLoop;.
16250 20 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d        for(pLoop=
16260 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  p; pLoop; pLoop=
16270 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  pLoop->pPrior){.
16280 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70          pLoop->p
16290 52 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20  Rightmost = p;. 
162a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
162b0 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c   return multiSel
162c0 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65  ect(pParse, p, e
162d0 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 61 66 66  Dest, iParm, aff
162e0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
162f0 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
16300 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 49  OrderBy;.  if( I
16310 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
16320 65 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70 2d  eDest) ){.    p-
16330 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
16340 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
16350 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50  SelectResolve(pP
16360 61 72 73 65 2c 20 70 2c 20 30 29 20 29 7b 0a 20  arse, p, 0) ){. 
16370 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
16380 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f 72  nd;.  }.  p->pOr
16390 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
163a0 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63  ;..  /* Make loc
163b0 61 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  al copies of the
163c0 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72 20   parameters for 
163d0 74 68 69 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f  this query..  */
163e0 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
163f0 3e 70 53 72 63 3b 0a 20 20 70 57 68 65 72 65 20  >pSrc;.  pWhere 
16400 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70  = p->pWhere;.  p
16410 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
16420 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67  oupBy;.  pHaving
16430 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20   = p->pHaving;. 
16440 20 69 73 41 67 67 20 3d 20 70 2d 3e 69 73 41 67   isAgg = p->isAg
16450 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20  g;.  isDistinct 
16460 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b  = p->isDistinct;
16470 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
16480 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c  EList;.  if( pEL
16490 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ist==0 ) goto se
164a0 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
164b0 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65  .  ** Do not eve
164c0 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 6e  n attempt to gen
164d0 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65 20 69  erate any code i
164e0 66 20 77 65 20 68 61 76 65 20 61 6c 72 65 61 64  f we have alread
164f0 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f  y seen.  ** erro
16500 72 73 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  rs before this r
16510 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e 0a 20  outine starts.. 
16520 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
16530 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f 20  ->nErr>0 ) goto 
16540 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
16550 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20  * If writing to 
16560 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61  memory or genera
16570 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20  ting a set.  ** 
16580 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f  only a single co
16590 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70  lumn may be outp
165a0 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ut..  */.#ifndef
165b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
165c0 51 55 45 52 59 0a 20 20 69 66 28 20 28 65 44 65  QUERY.  if( (eDe
165d0 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
165e0 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 26  Dest==SRT_Set) &
165f0 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
16600 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
16610 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
16620 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20   "only a single 
16630 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66  result allowed f
16640 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61 20 53  or ".       "a S
16650 45 4c 45 43 54 20 74 68 61 74 20 69 73 20 70 61  ELECT that is pa
16660 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
16670 69 6f 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ion");.    goto 
16680 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
16690 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 52 44  #endif..  /* ORD
166a0 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64  ER BY is ignored
166b0 20 66 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e   for some destin
166c0 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ations..  */.  i
166d0 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
166e0 72 62 79 28 65 44 65 73 74 29 20 29 7b 0a 20 20  rby(eDest) ){.  
166f0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
16700 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
16710 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
16720 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
16730 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
16740 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
16750 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
16760 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79  ;..  /* Identify
16770 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66   column names if
16780 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
16790 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c  g them in a call
167a0 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  back.  This.  **
167b0 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64   step is skipped
167c0 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   if the output i
167d0 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20  s going to some 
167e0 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74 69 6f  other destinatio
167f0 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  n..  */.  if( eD
16800 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
16810 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  k ){.    generat
16820 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
16830 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
16840 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  EList);.  }..  /
16850 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
16860 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
16870 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
16880 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20  clause.  */.#if 
16890 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
168a0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
168b0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
168c0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66  E_OMIT_VIEW).  f
168d0 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
168e0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
168f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
16900 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
16910 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  t = 0;.    int n
16920 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78  eedRestoreContex
16930 74 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  t;.    struct Sr
16940 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
16950 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
16960 5b 69 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 49  [i];..    if( pI
16970 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  tem->pSelect==0 
16980 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
16990 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  if( pItem->zName
169a0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 61  !=0 ){.      zSa
169b0 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
169c0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
169d0 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61  ntext;.      pPa
169e0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
169f0 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  t = pItem->zName
16a00 3b 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73 74  ;.      needRest
16a10 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a  oreContext = 1;.
16a20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16a30 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
16a40 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
16a50 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
16a60 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
16a70 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 56 69 72  pSelect, SRT_Vir
16a80 74 75 61 6c 54 61 62 2c 20 0a 20 20 20 20 20 20  tualTab, .      
16a90 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
16aa0 2d 3e 69 43 75 72 73 6f 72 2c 20 70 2c 20 69 2c  ->iCursor, p, i,
16ab0 20 26 69 73 41 67 67 2c 20 30 29 3b 0a 20 20 20   &isAgg, 0);.   
16ac0 20 69 66 28 20 6e 65 65 64 52 65 73 74 6f 72 65   if( needRestore
16ad0 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20 20 20 20  Context ){.     
16ae0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
16af0 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75  ntext = zSavedAu
16b00 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d  thContext;.    }
16b10 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20  .    pTabList = 
16b20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70 57 68  p->pSrc;.    pWh
16b30 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
16b40 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61  .    if( !Ignora
16b50 62 6c 65 4f 72 64 65 72 62 79 28 65 44 65 73 74  bleOrderby(eDest
16b60 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65  ) ){.      pOrde
16b70 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
16b80 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72  y;.    }.    pGr
16b90 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
16ba0 70 42 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67  pBy;.    pHaving
16bb0 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20   = p->pHaving;. 
16bc0 20 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20     isDistinct = 
16bd0 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20  p->isDistinct;. 
16be0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
16bf0 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 73 70  Check for the sp
16c00 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20  ecial case of a 
16c10 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66  min() or max() f
16c20 75 6e 63 74 69 6f 6e 20 62 79 20 69 74 73 65 6c  unction by itsel
16c30 66 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65  f.  ** in the re
16c40 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  sult set..  */. 
16c50 20 69 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61   if( simpleMinMa
16c60 78 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  xQuery(pParse, p
16c70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 20  , eDest, iParm) 
16c80 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  ){.    rc = 0;. 
16c90 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
16ca0 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  nd;.  }..  /* Ch
16cb0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
16cc0 69 73 20 69 73 20 61 20 73 75 62 71 75 65 72 79  is is a subquery
16cd0 20 74 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c   that can be "fl
16ce0 61 74 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74  attened" into it
16cf0 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49  s parent..  ** I
16d00 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
16d10 61 20 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f  a possiblity, do
16d20 20 73 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69   so and return i
16d30 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20  mmediately.  .  
16d40 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
16d50 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66  E_OMIT_VIEW.  if
16d60 28 20 70 50 61 72 65 6e 74 20 26 26 20 70 50 61  ( pParent && pPa
16d70 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20  rentAgg &&.     
16d80 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
16d90 28 70 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74  (pParse, pParent
16da0 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 2a 70 50  , parentTab, *pP
16db0 61 72 65 6e 74 41 67 67 2c 20 69 73 41 67 67 29  arentAgg, isAgg)
16dc0 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67   ){.    if( isAg
16dd0 67 20 29 20 2a 70 50 61 72 65 6e 74 41 67 67 20  g ) *pParentAgg 
16de0 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  = 1;.    goto se
16df0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65  lect_end;.  }.#e
16e00 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
16e10 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
16e20 42 59 20 63 6c 61 75 73 65 2c 20 72 65 73 6f 6c  BY clause, resol
16e30 76 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e  ve any collation
16e40 20 73 65 71 75 65 6e 63 65 73 0a 20 20 2a 2a 20   sequences.  ** 
16e50 6e 61 6d 65 73 20 74 68 61 74 20 68 61 76 65 20  names that have 
16e60 62 65 65 6e 20 65 78 70 6c 69 63 69 74 6c 79 20  been explicitly 
16e70 73 70 65 63 69 66 69 65 64 20 61 6e 64 20 63 72  specified and cr
16e80 65 61 74 65 20 61 20 73 6f 72 74 69 6e 67 20 69  eate a sorting i
16e90 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
16ea0 54 68 69 73 20 73 6f 72 74 69 6e 67 20 69 6e 64  This sorting ind
16eb0 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20  ex might end up 
16ec0 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20  being unused if 
16ed0 74 68 65 20 64 61 74 61 20 63 61 6e 20 62 65 20  the data can be 
16ee0 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20  .  ** extracted 
16ef0 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72  in pre-sorted or
16f00 64 65 72 2e 20 20 49 66 20 74 68 61 74 20 69 73  der.  If that is
16f10 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20   the case, then 
16f20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e  the.  ** OP_Open
16f30 56 69 72 74 75 61 6c 20 69 6e 73 74 72 75 63 74  Virtual instruct
16f40 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e  ion will be chan
16f50 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  ged to an OP_Noo
16f60 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66  p once.  ** we f
16f70 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74  igure out that t
16f80 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
16f90 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20   is not needed. 
16fa0 20 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64   The addrSortInd
16fb0 65 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  ex.  ** variable
16fc0 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63 69   is used to faci
16fd0 6c 69 74 61 74 65 20 74 68 61 74 20 63 68 61 6e  litate that chan
16fe0 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ge..  */.  if( p
16ff0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
17000 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
17010 74 65 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20  tem *pTerm;.    
17020 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
17030 6f 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  o;.    for(i=0, 
17040 70 54 65 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pTerm=pOrderBy->
17050 61 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  a; i<pOrderBy->n
17060 45 78 70 72 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Expr; i++, pTerm
17070 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
17080 54 65 72 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  Term->zName ){. 
17090 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 45         pTerm->pE
170a0 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c  xpr->pColl = sql
170b0 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
170c0 71 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d  q(pParse, pTerm-
170d0 3e 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20  >zName, -1);.   
170e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
170f0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
17100 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
17110 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
17120 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
17130 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
17140 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  st(pParse, pOrde
17150 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72  rBy);.    pOrder
17160 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70  By->iECursor = p
17170 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
17180 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69     p->addrOpenVi
17190 72 74 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74  rt[2] = addrSort
171a0 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 20 73  Index =.       s
171b0 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
171c0 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c   OP_OpenVirtual,
171d0 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
171e0 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  sor, pOrderBy->n
171f0 45 78 70 72 2b 32 2c 20 0a 20 20 20 20 20 20 20  Expr+2, .       
17200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17210 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
17220 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P3_KEYINFO_HAN
17230 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DOFF);.  }else{.
17240 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e 64 65      addrSortInde
17250 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  x = -1;.  }..  /
17260 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65  * Set the limite
17270 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d  r..  */.  iEnd =
17280 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
17290 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70  Label(v);.  comp
172a0 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
172b0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e  s(pParse, p, iEn
172c0 64 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  d);..  /* If the
172d0 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
172e0 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
172f0 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
17300 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
17310 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
17320 54 5f 56 69 72 74 75 61 6c 54 61 62 20 29 7b 0a  T_VirtualTab ){.
17330 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17340 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56  ddOp(v, OP_OpenV
17350 69 72 74 75 61 6c 2c 20 69 50 61 72 6d 2c 20 70  irtual, iParm, p
17360 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
17370 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20   }..  /* Open a 
17380 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
17390 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
173a0 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a  tinct set..  */.
173b0 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74    if( isDistinct
173c0 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
173d0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 64  *pKeyInfo;.    d
173e0 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
173f0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 4b  ->nTab++;.    pK
17400 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
17410 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
17420 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  rse, p->pEList);
17430 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
17440 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69  Op3(v, OP_OpenVi
17450 72 74 75 61 6c 2c 20 64 69 73 74 69 6e 63 74 2c  rtual, distinct,
17460 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
17470 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
17480 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33  ar*)pKeyInfo, P3
17490 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
174a0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
174b0 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  distinct = -1;. 
174c0 20 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67 61   }..  /* Aggrega
174d0 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65  te and non-aggre
174e0 67 61 74 65 20 71 75 65 72 69 65 73 20 61 72 65  gate queries are
174f0 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65   handled differe
17500 6e 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21 69  ntly */.  if( !i
17510 73 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79  sAgg && pGroupBy
17520 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
17530 69 73 20 63 61 73 65 20 69 73 20 66 6f 72 20 6e  is case is for n
17540 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65  on-aggregate que
17550 72 69 65 73 0a 20 20 20 20 2a 2a 20 42 65 67 69  ries.    ** Begi
17560 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  n the database s
17570 63 61 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  can.    */.    p
17580 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
17590 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
175a0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
175b0 72 65 2c 20 26 70 4f 72 64 65 72 42 79 29 3b 0a  re, &pOrderBy);.
175c0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
175d0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
175e0 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  end;..    /* If 
175f0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
17600 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62  at was created b
17610 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65  y a prior OP_Ope
17620 6e 56 69 72 74 75 61 6c 20 0a 20 20 20 20 2a 2a  nVirtual .    **
17630 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
17640 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
17650 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
17660 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 56  nge the OP_OpenV
17670 69 72 74 75 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  irtual.    ** in
17680 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20  to an OP_Noop.. 
17690 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 64     */.    if( ad
176a0 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26  drSortIndex>=0 &
176b0 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  & pOrderBy==0 ){
176c0 0a 20 20 20 20 20 20 75 6e 63 72 65 61 74 65 53  .      uncreateS
176d0 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72  ortingIndex(pPar
176e0 73 65 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65  se, addrSortInde
176f0 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64  x);.      p->add
17700 72 4f 70 65 6e 56 69 72 74 5b 32 5d 20 3d 20 2d  rOpenVirt[2] = -
17710 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
17720 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   Use the standar
17730 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 20 20 20  d inner loop.   
17740 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 65 6c 65   */.    if( sele
17750 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
17760 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30  se, p, pEList, 0
17770 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64  , 0, pOrderBy, d
17780 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a  istinct, eDest,.
17790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177a0 20 20 20 20 69 50 61 72 6d 2c 20 70 57 49 6e 66      iParm, pWInf
177b0 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57  o->iContinue, pW
177c0 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 61 66  Info->iBreak, af
177d0 66 29 20 29 7b 0a 20 20 20 20 20 20 20 67 6f 74  f) ){.       got
177e0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
177f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20    }..    /* End 
17800 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
17810 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
17820 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
17830 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65  nd(pWInfo);.  }e
17840 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
17850 20 69 73 20 74 68 65 20 70 72 6f 63 65 73 73 69   is the processi
17860 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
17870 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 20 20   queries */.    
17880 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
17890 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
178a0 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ext for processi
178b0 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66  ng aggregate inf
178c0 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
178d0 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20  int iAMem;      
178e0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
178f0 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f   address for sto
17900 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f  ring current GRO
17910 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
17920 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iBMem;         
17930 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
17940 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f  dress for previo
17950 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  us GROUP BY */. 
17960 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b     int iUseFlag;
17970 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64         /* Mem ad
17980 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c  dress holding fl
17990 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  ag indicating th
179a0 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20  at at least.    
179b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179c0 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f      ** one row o
179d0 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74  f the input to t
179e0 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61  he aggregator ha
179f0 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20  s been.         
17a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
17a10 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  * processed */. 
17a20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61     int iAbortFla
17a30 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64  g;     /* Mem ad
17a40 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73  dress which caus
17a50 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69  es query abort i
17a60 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20  f positive */.  
17a70 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72    int groupBySor
17a80 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f  t;    /* Rows co
17a90 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69  me from source i
17aa0 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72  n GROUP BY order
17ab0 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 20 54 68 65   */...    /* The
17ac0 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
17ad0 62 6c 65 73 20 68 6f 6c 64 20 61 64 64 72 65 73  bles hold addres
17ae0 73 65 73 20 6f 72 20 6c 61 62 65 6c 73 20 66 6f  ses or labels fo
17af0 72 20 70 61 72 74 73 20 6f 66 20 74 68 65 0a 20  r parts of the. 
17b00 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61     ** virtual ma
17b10 63 68 69 6e 65 20 70 72 6f 67 72 61 6d 20 77 65  chine program we
17b20 20 61 72 65 20 70 75 74 74 69 6e 67 20 74 6f 67   are putting tog
17b30 65 74 68 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  ether */.    int
17b40 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20   addrOutputRow; 
17b50 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
17b60 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
17b70 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c   outputs a resul
17b80 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74  t row */.    int
17b90 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20   addrSetAbort;  
17ba0 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
17bb0 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72  abort flag and r
17bc0 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  eturn */.    int
17bd0 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c   addrInitializeL
17be0 6f 6f 70 3b 20 2f 2a 20 53 74 61 72 74 20 6f 66  oop; /* Start of
17bf0 20 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74 69   code that initi
17c00 61 6c 69 7a 65 73 20 74 68 65 20 69 6e 70 75 74  alizes the input
17c10 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74   loop */.    int
17c20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20   addrTopOfLoop; 
17c30 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
17c40 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f  he input loop */
17c50 0a 20 20 20 20 69 6e 74 20 61 64 64 72 47 72 6f  .    int addrGro
17c60 75 70 42 79 43 68 61 6e 67 65 3b 20 20 2f 2a 20  upByChange;  /* 
17c70 43 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77  Code that runs w
17c80 68 65 6e 20 61 6e 79 20 47 52 4f 55 50 20 42 59  hen any GROUP BY
17c90 20 74 65 72 6d 20 63 68 61 6e 67 65 73 20 2a 2f   term changes */
17ca0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 50 72 6f  .    int addrPro
17cb0 63 65 73 73 52 6f 77 3b 20 20 20 20 20 2f 2a 20  cessRow;     /* 
17cc0 43 6f 64 65 20 74 6f 20 70 72 6f 63 65 73 73 20  Code to process 
17cd0 61 20 73 69 6e 67 6c 65 20 69 6e 70 75 74 20 72  a single input r
17ce0 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  ow */.    int ad
17cf0 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  drEnd;          
17d00 20 20 2f 2a 20 45 6e 64 20 6f 66 20 61 6c 6c 20    /* End of all 
17d10 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20  processing */.  
17d20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e    int addrSortin
17d30 67 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68 65  gIdx;     /* The
17d40 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 20   OP_OpenVirtual 
17d50 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  for the sorting 
17d60 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74  index */.    int
17d70 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20   addrReset;     
17d80 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69       /* Subrouti
17d90 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67  ne for resetting
17da0 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
17db0 20 2a 2f 0a 0a 20 20 20 20 61 64 64 72 45 6e 64   */..    addrEnd
17dc0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
17dd0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20  keLabel(v);..   
17de0 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43   /* Convert TK_C
17df0 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f  OLUMN nodes into
17e00 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61   TK_AGG_COLUMN a
17e10 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20  nd make entries 
17e20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e  in.    ** sAggIn
17e30 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47  fo for all TK_AG
17e40 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73  G_FUNCTION nodes
17e50 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20   in expressions 
17e60 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45  of the.    ** SE
17e70 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
17e80 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65      */.    memse
17e90 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
17ea0 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43  f(sNC));.    sNC
17eb0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
17ec0 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69  ;.    sNC.pSrcLi
17ed0 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
17ee0 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20     sNC.pAggInfo 
17ef0 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20  = &sAggInfo;.   
17f00 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
17f10 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75  ngColumn = pGrou
17f20 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e  pBy ? pGroupBy->
17f30 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20  nExpr+1 : 0;.   
17f40 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70   sAggInfo.pGroup
17f50 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20  By = pGroupBy;. 
17f60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
17f70 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
17f80 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 20 29  (&sNC, pEList) )
17f90 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
17fa0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
17fb0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
17fc0 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
17fd0 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79 29  (&sNC, pOrderBy)
17fe0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
17ff0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
18000 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67  .    if( pHaving
18010 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 41   && sqlite3ExprA
18020 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
18030 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 20  (&sNC, pHaving) 
18040 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
18050 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
18060 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63      sAggInfo.nAc
18070 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67  cumulator = sAgg
18080 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Info.nColumn;.  
18090 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
180a0 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b  gInfo.nFunc; i++
180b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
180c0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
180d0 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67  ggList(&sNC, sAg
180e0 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70  gInfo.aFunc[i].p
180f0 45 78 70 72 2d 3e 70 4c 69 73 74 29 20 29 7b 0a  Expr->pList) ){.
18100 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
18110 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
18120 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
18130 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
18140 65 64 28 29 20 29 20 67 6f 74 6f 20 73 65 6c 65  ed() ) goto sele
18150 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20  ct_end;..    /* 
18160 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  Processing for a
18170 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47  ggregates with G
18180 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20  ROUP BY is very 
18190 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20  different and.  
181a0 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63    ** much more c
181b0 6f 6d 70 6c 65 78 20 74 68 61 20 61 67 67 72 65  omplex tha aggre
181c0 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20  gates without a 
181d0 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f  GROUP BY..    */
181e0 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
181f0 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e  y ){.      KeyIn
18200 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f  fo *pKeyInfo;  /
18210 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61  * Keying informa
18220 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f  tion for the gro
18230 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  up by clause */.
18240 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  .      /* Create
18250 20 6c 61 62 65 6c 73 20 74 68 61 74 20 77 65 20   labels that we 
18260 77 69 6c 6c 20 62 65 20 6e 65 65 64 69 6e 67 0a  will be needing.
18270 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 0a 20        */.     . 
18280 20 20 20 20 20 61 64 64 72 49 6e 69 74 69 61 6c       addrInitial
18290 69 7a 65 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65  izeLoop = sqlite
182a0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
182b0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 47 72 6f  );.      addrGro
182c0 75 70 42 79 43 68 61 6e 67 65 20 3d 20 73 71 6c  upByChange = sql
182d0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
182e0 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 64 64 72  l(v);.      addr
182f0 50 72 6f 63 65 73 73 52 6f 77 20 3d 20 73 71 6c  ProcessRow = sql
18300 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
18310 6c 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  l(v);..      /* 
18320 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52  If there is a GR
18330 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65  OUP BY clause we
18340 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f   might need a so
18350 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20  rting index to. 
18360 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e       ** implemen
18370 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20  t it.  Allocate 
18380 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64  that sorting ind
18390 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74  ex now.  If it t
183a0 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a  urns out.      *
183b0 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
183c0 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61   need it after a
183d0 6c 6c 2c 20 74 68 65 20 4f 70 65 6e 56 69 72 74  ll, the OpenVirt
183e0 75 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  ual instruction.
183f0 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
18400 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
18410 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20  a Noop.  .      
18420 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66  */.      sAggInf
18430 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70  o.sortingIdx = p
18440 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
18450 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
18460 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
18470 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ist(pParse, pGro
18480 75 70 42 79 29 3b 0a 20 20 20 20 20 20 61 64 64  upBy);.      add
18490 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 0a 20 20  rSortingIdx =.  
184a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
184b0 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  dbeOp3(v, OP_Ope
184c0 6e 56 69 72 74 75 61 6c 2c 20 73 41 67 67 49 6e  nVirtual, sAggIn
184d0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20  fo.sortingIdx,. 
184e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184f0 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
18500 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c  .nSortingColumn,
18510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18520 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
18530 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  )pKeyInfo, P3_KE
18540 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
18550 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  .      /* Initia
18560 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  lize memory loca
18570 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52  tions used by GR
18580 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65  OUP BY aggregate
18590 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20   processing.    
185a0 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46    */.      iUseF
185b0 6c 61 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  lag = pParse->nM
185c0 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69 41 62 6f  em++;.      iAbo
185d0 72 74 46 6c 61 67 20 3d 20 70 50 61 72 73 65 2d  rtFlag = pParse-
185e0 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69  >nMem++;.      i
185f0 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  AMem = pParse->n
18600 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73  Mem;.      pPars
18610 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
18620 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
18630 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65    iBMem = pParse
18640 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50  ->nMem;.      pP
18650 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
18660 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
18670 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18680 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
18690 6e 74 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61  nt, 0, iAbortFla
186a0 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
186b0 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 63 6c 65  mment((v, "# cle
186c0 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  ar abort flag"))
186d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
186e0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
186f0 65 6d 49 6e 74 2c 20 30 2c 20 69 55 73 65 46 6c  emInt, 0, iUseFl
18700 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
18710 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 69 6e  omment((v, "# in
18720 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74  dicate accumulat
18730 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20  or empty"));.   
18740 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18750 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
18760 30 2c 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a  0, addrInitializ
18770 65 4c 6f 6f 70 29 3b 0a 0a 20 20 20 20 20 20 2f  eLoop);..      /
18780 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
18790 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
187a0 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  puts a single ro
187b0 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a  w of the result.
187c0 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54        ** set.  T
187d0 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66  his subroutine f
187e0 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68  irst looks at th
187f0 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20  e iUseFlag.  If 
18800 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a  iUseFlag.      *
18810 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  * is less than o
18820 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c  r equal to zero,
18830 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
18840 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a  is a no-op.  If.
18850 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f        ** the pro
18860 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f  cessing calls fo
18870 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61  r the query to a
18880 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f  bort, this subro
18890 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  utine.      ** i
188a0 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41  ncrements the iA
188b0 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20  bortFlag memory 
188c0 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20  location before 
188d0 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20  returning in.   
188e0 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73     ** order to s
188f0 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72  ignal the caller
18900 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20   to abort..     
18910 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65   */.      addrSe
18920 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33  tAbort = sqlite3
18930 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
18940 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
18950 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
18960 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 69 41 62 6f  _MemInt, 1, iAbo
18970 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
18980 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
18990 23 20 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67  # set abort flag
189a0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
189b0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
189c0 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b  P_Return, 0, 0);
189d0 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
189e0 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
189f0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
18a00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
18a10 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
18a20 66 4d 65 6d 50 6f 73 2c 20 69 55 73 65 46 6c 61  fMemPos, iUseFla
18a30 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
18a40 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +2);.      VdbeC
18a50 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 47 72  omment((v, "# Gr
18a60 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
18a70 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69  erator entry poi
18a80 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  nt"));.      sql
18a90 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
18aa0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30   OP_Return, 0, 0
18ab0 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  );.      finaliz
18ac0 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
18ad0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
18ae0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 61 76  ;.      if( pHav
18af0 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
18b00 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
18b10 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
18b20 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
18b30 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  +1, 1);.      }.
18b40 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63        rc = selec
18b50 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
18b60 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
18b70 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
18b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18b90 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
18ba0 69 6e 63 74 2c 20 65 44 65 73 74 2c 20 69 50 61  inct, eDest, iPa
18bb0 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rm, .           
18bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bd0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
18be0 20 61 64 64 72 53 65 74 41 62 6f 72 74 2c 20 61   addrSetAbort, a
18bf0 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ff);.      if( r
18c00 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
18c10 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
18c20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
18c30 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
18c40 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29  OP_Return, 0, 0)
18c50 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
18c60 65 6e 74 28 28 76 2c 20 22 23 20 65 6e 64 20 67  ent((v, "# end g
18c70 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65  roupby result ge
18c80 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  nerator"));..   
18c90 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
18ca0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
18cb0 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20   will reset the 
18cc0 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c  group-by accumul
18cd0 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ator.      */.  
18ce0 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20      addrReset = 
18cf0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
18d00 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
18d10 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
18d20 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
18d30 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
18d40 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
18d50 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29  OP_Return, 0, 0)
18d60 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;..      /* Begi
18d70 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  n a loop that wi
18d80 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73  ll extract all s
18d90 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52  ource rows in GR
18da0 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20  OUP BY order..  
18db0 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
18dc0 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65  t involve two se
18dd0 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74  parate loops wit
18de0 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20  h an OP_Sort in 
18df0 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20  between, or.    
18e00 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
18e10 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74   a single loop t
18e20 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65  hat uses an inde
18e30 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66  x to extract inf
18e40 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  ormation.      *
18e50 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f  * in the right o
18e60 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69  rder to begin wi
18e70 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  th..      */.   
18e80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
18e90 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
18ea0 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70  drInitializeLoop
18eb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18ec0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
18ed0 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 52 65  Gosub, 0, addrRe
18ee0 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  set);.      pWIn
18ef0 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
18f00 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
18f10 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
18f20 20 26 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20   &pGroupBy);.   
18f30 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
18f40 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
18f50 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 47  nd;.      if( pG
18f60 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20  roupBy==0 ){.   
18f70 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69       /* The opti
18f80 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f  mizer is able to
18f90 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e   deliver rows in
18fa0 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20   group by order 
18fb0 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65  so.        ** we
18fc0 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
18fd0 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70  sort.  The OP_Op
18fe0 65 6e 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  enVirtual table 
18ff0 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
19000 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74  ** cancelled lat
19010 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74  er because we st
19020 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20  ill need to use 
19030 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20  the pKeyInfo.   
19040 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
19050 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
19060 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
19070 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b  groupBySort = 0;
19080 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19090 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72        /* Rows ar
190a0 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20  e coming out in 
190b0 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64  undetermined ord
190c0 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  er.  We have to 
190d0 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  push.        ** 
190e0 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20  each row into a 
190f0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74  sorting index, t
19100 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72  erminate the fir
19110 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  st loop,.       
19120 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76   ** then loop ov
19130 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  er the sorting i
19140 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f  ndex in order to
19150 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a   get the output.
19160 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f          ** in so
19170 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20  rted order.     
19180 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72     */.        gr
19190 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20  oupBySort = 1;. 
191a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
191b0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
191c0 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29  Parse, pGroupBy)
191d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
191e0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
191f0 5f 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49  _Sequence, sAggI
19200 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
19210 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  0);.        j = 
19220 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b  pGroupBy->nExpr+
19230 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  1;.        for(i
19240 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
19250 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
19260 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
19270 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
19280 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f   = &sAggInfo.aCo
19290 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[i];.          
192a0 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
192b0 72 43 6f 6c 75 6d 6e 3c 6a 20 29 20 63 6f 6e 74  rColumn<j ) cont
192c0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
192d0 69 66 28 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d  if( pCol->iColum
192e0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
192f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19300 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  dOp(v, OP_Rowid,
19310 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 30   pCol->iTable, 0
19320 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
19330 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
19340 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19350 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
19360 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 70 43 6f  Col->iTable, pCo
19370 6c 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  l->iColumn);.   
19380 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19390 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     j++;.        
193a0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
193b0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
193c0 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6a 2c 20  _MakeRecord, j, 
193d0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
193e0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
193f0 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 73 41  OP_IdxInsert, sA
19400 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
19410 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  x, 0);.        s
19420 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
19430 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
19440 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19450 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 73 41 67  (v, OP_Sort, sAg
19460 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
19470 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
19480 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
19490 28 76 2c 20 22 23 20 47 52 4f 55 50 20 42 59 20  (v, "# GROUP BY 
194a0 73 6f 72 74 22 29 29 3b 0a 20 20 20 20 20 20 20  sort"));.       
194b0 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72   sAggInfo.useSor
194c0 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20  tingIdx = 1;.   
194d0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45     }..      /* E
194e0 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72  valuate the curr
194f0 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
19500 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20  ms and store in 
19510 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20  b0, b1, b2....  
19520 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65      ** (b0 is me
19530 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42  mory location iB
19540 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d  Mem+0, b1 is iBM
19550 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72  em+1, and so for
19560 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  th).      ** The
19570 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75  n compare the cu
19580 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
19590 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65  erms against the
195a0 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a   GROUP BY terms.
195b0 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
195c0 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63  e previous row c
195d0 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
195e0 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e  in a0, a1, a2...
195f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
19600 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20  addrTopOfLoop = 
19610 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
19620 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
19630 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f   for(j=0; j<pGro
19640 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  upBy->nExpr; j++
19650 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  ){.        if( g
19660 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
19670 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
19680 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
19690 6f 6c 75 6d 6e 2c 20 73 41 67 67 49 6e 66 6f 2e  olumn, sAggInfo.
196a0 73 6f 72 74 69 6e 67 49 64 78 2c 20 6a 29 3b 0a  sortingIdx, j);.
196b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
196c0 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
196d0 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  o.directMode = 1
196e0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
196f0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
19700 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
19710 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  j].pExpr);.     
19720 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
19730 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
19740 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 42   OP_MemStore, iB
19750 4d 65 6d 2b 6a 2c 20 6a 3c 70 47 72 6f 75 70 42  Mem+j, j<pGroupB
19760 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  y->nExpr-1);.   
19770 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
19780 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  =pGroupBy->nExpr
19790 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a  -1; j>=0; j--){.
197a0 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 47          if( j<pG
197b0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 20  roupBy->nExpr-1 
197c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
197d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
197e0 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69 42 4d   OP_MemLoad, iBM
197f0 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20  em+j, 0);.      
19800 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
19810 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
19820 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69 41 4d 65  OP_MemLoad, iAMe
19830 6d 2b 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  m+j, 0);.       
19840 20 69 66 28 20 6a 3d 3d 30 20 29 7b 0a 20 20 20   if( j==0 ){.   
19850 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19860 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 45 71  beAddOp(v, OP_Eq
19870 2c 20 30 78 32 30 30 2c 20 61 64 64 72 50 72 6f  , 0x200, addrPro
19880 63 65 73 73 52 6f 77 29 3b 0a 20 20 20 20 20 20  cessRow);.      
19890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
198a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
198b0 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c 20 30 78  dOp(v, OP_Ne, 0x
198c0 32 30 30 2c 20 61 64 64 72 47 72 6f 75 70 42 79  200, addrGroupBy
198d0 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 20  Change);.       
198e0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
198f0 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
19900 2c 20 2d 31 2c 20 28 76 6f 69 64 2a 29 70 4b 65  , -1, (void*)pKe
19910 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 2c  yInfo->aColl[j],
19920 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P3_COLLSEQ);.  
19930 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
19940 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
19950 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72  at runs whenever
19960 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 68   the GROUP BY ch
19970 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20  anges..      ** 
19980 43 68 61 6e 67 65 20 69 6e 20 74 68 65 20 47 52  Change in the GR
19990 4f 55 50 20 42 59 20 61 72 65 20 64 65 74 65 63  OUP BY are detec
199a0 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69  ted by the previ
199b0 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a  ous code.      *
199c0 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65  * block.  If the
199d0 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67  re were no chang
199e0 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69  es, this block i
199f0 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20  s skipped..     
19a00 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69   **.      ** Thi
19a10 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75  s code copies cu
19a20 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74  rrent group by t
19a30 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32  erms in b0,b1,b2
19a40 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76  ,....      ** ov
19a50 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20  er to a0,a1,a2. 
19a60 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74   It then calls t
19a70 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  he output subrou
19a80 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e  tine.      ** an
19a90 64 20 72 65 73 65 74 73 20 74 68 65 20 61 67 67  d resets the agg
19aa0 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
19ab0 6f 72 20 72 65 67 69 73 74 65 72 73 20 69 6e 20  or registers in 
19ac0 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20  preparation.    
19ad0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78    ** for the nex
19ae0 74 20 47 52 4f 55 50 20 42 59 20 62 61 74 63 68  t GROUP BY batch
19af0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
19b00 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
19b10 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
19b20 47 72 6f 75 70 42 79 43 68 61 6e 67 65 29 3b 0a  GroupByChange);.
19b30 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
19b40 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
19b50 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
19b60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19b70 28 76 2c 20 4f 50 5f 4d 65 6d 4d 6f 76 65 2c 20  (v, OP_MemMove, 
19b80 69 41 4d 65 6d 2b 6a 2c 20 69 42 4d 65 6d 2b 6a  iAMem+j, iBMem+j
19b90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19ba0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19bb0 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  p(v, OP_Gosub, 0
19bc0 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
19bd0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
19be0 65 6e 74 28 28 76 2c 20 22 23 20 6f 75 74 70 75  ent((v, "# outpu
19bf0 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20  t one row"));.  
19c00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19c10 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d  ddOp(v, OP_IfMem
19c20 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c  Pos, iAbortFlag,
19c30 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
19c40 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
19c50 20 22 23 20 63 68 65 63 6b 20 61 62 6f 72 74 20   "# check abort 
19c60 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
19c70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
19c80 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20  v, OP_Gosub, 0, 
19c90 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
19ca0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
19cb0 2c 20 22 23 20 72 65 73 65 74 20 61 63 63 75 6d  , "# reset accum
19cc0 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  ulator"));..    
19cd0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
19ce0 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
19cf0 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20  lators based on 
19d00 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20  the content of. 
19d10 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72       ** the curr
19d20 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f  ent row.      */
19d30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19d40 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
19d50 2c 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77  , addrProcessRow
19d60 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41  );.      updateA
19d70 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
19d80 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
19d90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19da0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
19db0 6e 74 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29  nt, 1, iUseFlag)
19dc0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
19dd0 65 6e 74 28 28 76 2c 20 22 23 20 69 6e 64 69 63  ent((v, "# indic
19de0 61 74 65 20 64 61 74 61 20 69 6e 20 61 63 63 75  ate data in accu
19df0 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  mulator"));..   
19e00 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65     /* End of the
19e10 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20   loop.      */. 
19e20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
19e30 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
19e40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19e50 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 73 41 67  (v, OP_Next, sAg
19e60 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
19e70 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29  , addrTopOfLoop)
19e80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
19e90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
19ea0 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
19eb0 20 20 20 20 20 20 20 20 75 6e 63 72 65 61 74 65          uncreate
19ec0 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61  SortingIndex(pPa
19ed0 72 73 65 2c 20 61 64 64 72 53 6f 72 74 69 6e 67  rse, addrSorting
19ee0 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Idx);.      }.. 
19ef0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74       /* Output t
19f00 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20  he final row of 
19f10 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a  result.      */.
19f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19f30 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73  eAddOp(v, OP_Gos
19f40 75 62 2c 20 30 2c 20 61 64 64 72 4f 75 74 70 75  ub, 0, addrOutpu
19f50 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62  tRow);.      Vdb
19f60 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
19f70 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f 77  output final row
19f80 22 29 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  "));.      .    
19f90 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75  } /* endif pGrou
19fa0 70 42 79 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  pBy */.    else 
19fb0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
19fc0 63 61 73 65 20 72 75 6e 73 20 69 66 20 74 68 65  case runs if the
19fd0 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20 6e   aggregate has n
19fe0 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
19ff0 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  e.  The.      **
1a000 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d   processing is m
1a010 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63  uch simpler sinc
1a020 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  e there is only 
1a030 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20  a single row.   
1a040 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e     ** of output.
1a050 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1a060 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
1a070 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
1a080 66 6f 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  fo);.      pWInf
1a090 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
1a0a0 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
1a0b0 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
1a0c0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  0);.      if( pW
1a0d0 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
1a0e0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
1a0f0 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
1a100 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
1a110 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
1a120 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
1a130 6e 66 6f 29 3b 0a 20 20 20 20 20 20 66 69 6e 61  nfo);.      fina
1a140 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
1a150 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
1a160 66 6f 29 3b 0a 20 20 20 20 20 20 70 4f 72 64 65  fo);.      pOrde
1a170 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  rBy = 0;.      i
1a180 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
1a190 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a1a0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1a1b0 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e   pHaving, addrEn
1a1c0 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  d, 1);.      }. 
1a1d0 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
1a1e0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
1a1f0 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p->pEList, 0, 0,
1a200 20 30 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20   0, -1, .       
1a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
1a220 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 61 64 64  Dest, iParm, add
1a230 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 2c 20 61  rEnd, addrEnd, a
1a240 66 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ff);.    }.    s
1a250 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1a260 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e  eLabel(v, addrEn
1a270 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20  d);.    .  } /* 
1a280 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20  endif aggregate 
1a290 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49  query */..  /* I
1a2a0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
1a2b0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
1a2c0 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73  hen we need to s
1a2d0 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ort the results.
1a2e0 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68    ** and send th
1a2f0 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  em to the callba
1a300 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  ck one by one.. 
1a310 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
1a320 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  By ){.    genera
1a330 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73  teSortTail(pPars
1a340 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d  e, p, v, pEList-
1a350 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69  >nExpr, eDest, i
1a360 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  Parm);.  }..#ifn
1a370 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a380 53 55 42 51 55 45 52 59 0a 20 20 2f 2a 20 49 66  SUBQUERY.  /* If
1a390 20 74 68 69 73 20 77 61 73 20 61 20 73 75 62 71   this was a subq
1a3a0 75 65 72 79 2c 20 77 65 20 68 61 76 65 20 6e 6f  uery, we have no
1a3b0 77 20 63 6f 6e 76 65 72 74 65 64 20 74 68 65 20  w converted the 
1a3c0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 61 0a  subquery into a.
1a3d0 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74    ** temporary t
1a3e0 61 62 6c 65 2e 20 20 53 6f 20 64 65 6c 65 74 65  able.  So delete
1a3f0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 73 74   the subquery st
1a400 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
1a410 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20 74 6f 20   parent.  ** to 
1a420 70 72 65 76 65 6e 74 20 74 68 69 73 20 73 75 62  prevent this sub
1a430 71 75 65 72 79 20 66 72 6f 6d 20 62 65 69 6e 67  query from being
1a440 20 65 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e   evaluated again
1a450 20 61 6e 64 20 74 6f 20 66 6f 72 63 65 20 74 68   and to force th
1a460 65 0a 20 20 2a 2a 20 74 68 65 20 75 73 65 20 6f  e.  ** the use o
1a470 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  f the temporary 
1a480 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
1a490 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ( pParent ){.   
1a4a0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
1a4b0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72  ->pSrc->nSrc>par
1a4c0 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73  entTab );.    as
1a4d0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
1a4e0 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62  Src->a[parentTab
1a4f0 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a  ].pSelect==p );.
1a500 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
1a510 74 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 20 20  tDelete(p);.    
1a520 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61  pParent->pSrc->a
1a530 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c  [parentTab].pSel
1a540 65 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  ect = 0;.  }.#en
1a550 64 69 66 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  dif..  /* Jump h
1a560 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73  ere to skip this
1a570 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71   query.  */.  sq
1a580 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1a590 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a  Label(v, iEnd);.
1a5a0 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54  .  /* The SELECT
1a5b0 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
1a5c0 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74  y coded.   Set t
1a5d0 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
1a5e0 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  o 0.  ** to indi
1a5f0 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a  cate no errors..
1a600 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a    */.  rc = 0;..
1a610 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d    /* Control jum
1a620 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e  ps to here if an
1a630 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
1a640 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20  tered above, or 
1a650 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  upon.  ** succes
1a660 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74  sful coding of t
1a670 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a  he SELECT..  */.
1a680 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 73 71  select_end:.  sq
1a690 6c 69 74 65 46 72 65 65 28 73 41 67 67 49 6e 66  liteFree(sAggInf
1a6a0 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  o.aCol);.  sqlit
1a6b0 65 46 72 65 65 28 73 41 67 67 49 6e 66 6f 2e 61  eFree(sAggInfo.a
1a6c0 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  Func);.  return 
1a6d0 72 63 3b 0a 7d 0a                                rc;.}.