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

Artifact 77bcb71f609ff95247a529acf7dfc1c1ec09154b:


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 38 36  select.c,v 1.286
0200: 20 32 30 30 36 2f 30 31 2f 30 37 20 31 33 3a 32   2006/01/07 13:2
0210: 31 3a 30 34 20 64 61 6e 69 65 6c 6b 31 39 37 37  1:04 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 50 61 72 73 65 20 2a 70 50 61 72 73 65  er(Parse *pParse
2c50: 2c 20 56 64 62 65 20 2a 76 2c 20 45 78 70 72 4c  , Vdbe *v, ExprL
2c60: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a  ist *pOrderBy){.
2c70: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2c80: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
2c90: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73  , pOrderBy);.  s
2ca0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2cb0: 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20  v, OP_Sequence, 
2cc0: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
2cd0: 6f 72 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  or, 0);.  sqlite
2ce0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
2cf0: 5f 50 75 6c 6c 2c 20 70 4f 72 64 65 72 42 79 2d  _Pull, pOrderBy-
2d00: 3e 6e 45 78 70 72 20 2b 20 31 2c 20 30 29 3b 0a  >nExpr + 1, 0);.
2d10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2d20: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
2d30: 6f 72 64 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  ord, pOrderBy->n
2d40: 45 78 70 72 20 2b 20 32 2c 20 30 29 3b 0a 20 20  Expr + 2, 0);.  
2d50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d60: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
2d70: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
2d80: 72 73 6f 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  rsor, 0);.}../*.
2d90: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69  ** Add code to i
2da0: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46  mplement the OFF
2db0: 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  SET.*/.static vo
2dc0: 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20  id codeOffset(. 
2dd0: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
2de0: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
2df0: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d  ode into this VM
2e00: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
2e10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
2e20: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
2e30: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
2e40: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
2e50: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
2e60: 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72  to skip the curr
2e70: 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ent record */.  
2e80: 69 6e 74 20 6e 50 6f 70 20 20 20 20 20 20 20 20  int nPop        
2e90: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
2ea0: 69 6d 65 73 20 74 6f 20 70 6f 70 20 73 74 61 63  imes to pop stac
2eb0: 6b 20 77 68 65 6e 20 6a 75 6d 70 69 6e 67 20 2a  k when jumping *
2ec0: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f  /.){.  if( p->iO
2ed0: 66 66 73 65 74 3e 3d 30 20 26 26 20 69 43 6f 6e  ffset>=0 && iCon
2ee0: 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20  tinue!=0 ){.    
2ef0: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
2f00: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2f10: 72 28 76 29 20 2b 20 33 3b 0a 20 20 20 20 69 66  r(v) + 3;.    if
2f20: 28 20 6e 50 6f 70 3e 30 20 29 20 61 64 64 72 2b  ( nPop>0 ) addr+
2f30: 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  +;.    sqlite3Vd
2f40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
2f50: 6d 49 6e 63 72 2c 20 70 2d 3e 69 4f 66 66 73 65  mIncr, p->iOffse
2f60: 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
2f70: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2f80: 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 70 2d 3e 69  P_IfMemPos, p->i
2f90: 4f 66 66 73 65 74 2c 20 61 64 64 72 29 3b 0a 20  Offset, addr);. 
2fa0: 20 20 20 69 66 28 20 6e 50 6f 70 3e 30 20 29 7b     if( nPop>0 ){
2fb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2fc0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
2fd0: 70 2c 20 6e 50 6f 70 2c 20 30 29 3b 0a 20 20 20  p, nPop, 0);.   
2fe0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
2ff0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
3000: 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65  to, 0, iContinue
3010: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
3020: 6e 74 28 28 76 2c 20 22 23 20 73 6b 69 70 20 4f  nt((v, "# skip O
3030: 46 46 53 45 54 20 72 65 63 6f 72 64 73 22 29 29  FFSET records"))
3040: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
3050: 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  dd code that wil
3060: 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  l check to make 
3070: 73 75 72 65 20 74 68 65 20 74 6f 70 20 4e 20 65  sure the top N e
3080: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  lements of the.*
3090: 2a 20 73 74 61 63 6b 20 61 72 65 20 64 69 73 74  * stack are dist
30a0: 69 6e 63 74 2e 20 20 69 54 61 62 20 69 73 20 61  inct.  iTab is a
30b0: 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
30c0: 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f  hat holds previo
30d0: 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d  usly.** seen com
30e0: 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  binations of the
30f0: 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65   N values.  A ne
3100: 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20  w entry is made 
3110: 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68  in iTab.** if th
3120: 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75  e current N valu
3130: 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a  es are new..**.*
3140: 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72  * A jump to addr
3150: 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61  Repeat is made a
3160: 6e 64 20 74 68 65 20 4b 20 76 61 6c 75 65 73 20  nd the K values 
3170: 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20  are popped from 
3180: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20  the.** stack if 
3190: 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e  the top N elemen
31a0: 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69  ts are not disti
31b0: 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nct..*/.static v
31c0: 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74  oid codeDistinct
31d0: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
31e0: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
31f0: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
3200: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 54  s VM */.  int iT
3210: 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ab,          /* 
3220: 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  A sorting index 
3230: 75 73 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72  used to test for
3240: 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f   distinctness */
3250: 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70 65 61  .  int addrRepea
3260: 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  t,    /* Jump to
3270: 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64 69 73   here if not dis
3280: 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e  tinct */.  int N
3290: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
32a0: 20 54 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65   The top N eleme
32b0: 6e 74 73 20 6f 66 20 74 68 65 20 73 74 61 63 6b  nts of the stack
32c0: 20 6d 75 73 74 20 62 65 20 64 69 73 74 69 6e 63   must be distinc
32d0: 74 20 2a 2f 0a 20 20 69 6e 74 20 4b 20 20 20 20  t */.  int K    
32e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 70            /* Pop
32f0: 20 4b 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d   K elements from
3300: 20 74 68 65 20 73 74 61 63 6b 20 69 66 20 69 6e   the stack if in
3310: 64 69 73 74 69 6e 63 74 20 2a 2f 0a 29 7b 0a 23  distinct */.){.#
3320: 69 66 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44  if NULL_ALWAYS_D
3330: 49 53 54 49 4e 43 54 0a 20 20 73 71 6c 69 74 65  ISTINCT.  sqlite
3340: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3350: 5f 49 73 4e 75 6c 6c 2c 20 2d 4e 2c 20 73 71 6c  _IsNull, -N, sql
3360: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
3370: 64 64 72 28 76 29 2b 36 29 3b 0a 23 65 6e 64 69  ddr(v)+6);.#endi
3380: 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  f.  sqlite3VdbeA
3390: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
33a0: 65 63 6f 72 64 2c 20 2d 4e 2c 20 30 29 3b 0a 20  ecord, -N, 0);. 
33b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33c0: 70 28 76 2c 20 4f 50 5f 44 69 73 74 69 6e 63 74  p(v, OP_Distinct
33d0: 2c 20 69 54 61 62 2c 20 73 71 6c 69 74 65 33 56  , iTab, sqlite3V
33e0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
33f0: 29 2b 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  )+3);.  sqlite3V
3400: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
3410: 6f 70 2c 20 4b 2c 20 30 29 3b 0a 20 20 73 71 6c  op, K, 0);.  sql
3420: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3430: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
3440: 72 52 65 70 65 61 74 29 3b 0a 20 20 56 64 62 65  rRepeat);.  Vdbe
3450: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73  Comment((v, "# s
3460: 6b 69 70 20 69 6e 64 69 73 74 69 6e 63 74 20 72  kip indistinct r
3470: 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 73 71 6c  ecords"));.  sql
3480: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3490: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
34a0: 54 61 62 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  Tab, 0);.}.../*.
34b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
34c0: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
34d0: 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64  de for the insid
34e0: 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  e of the inner l
34f0: 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45  oop.** of a SELE
3500: 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63  CT..**.** If src
3510: 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20  Tab and nColumn 
3520: 61 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74  are both zero, t
3530: 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65  hen the pEList e
3540: 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72  xpressions.** ar
3550: 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f  e evaluated in o
3560: 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20  rder to get the 
3570: 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f  data for this ro
3580: 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30  w.  If nColumn>0
3590: 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73  .** then data is
35a0: 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63   pulled from src
35b0: 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69  Tab and pEList i
35c0: 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67  s used only to g
35d0: 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79  et the.** dataty
35e0: 70 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  pes for each col
35f0: 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  umn..*/.static i
3600: 6e 74 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  nt selectInnerLo
3610: 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  op(.  Parse *pPa
3620: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
3630: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
3640: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
3650: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
3660: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65   /* The complete
3670: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
3680: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
3690: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
36a0: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69  ist,       /* Li
36b0: 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69  st of values bei
36c0: 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a  ng extracted */.
36d0: 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20    int srcTab,   
36e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c            /* Pul
36f0: 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73  l data from this
3700: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
3710: 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  nColumn,        
3720: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3730: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
3740: 73 6f 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a  source table */.
3750: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
3760: 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20  erBy,     /* If 
3770: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72  not NULL, sort r
3780: 65 73 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69  esults using thi
3790: 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64  s key */.  int d
37a0: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20  istinct,        
37b0: 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61     /* If >=0, ma
37c0: 6b 65 20 73 75 72 65 20 72 65 73 75 6c 74 73 20  ke sure results 
37d0: 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  are distinct */.
37e0: 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20    int eDest,    
37f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
3800: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
3810: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
3820: 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20  int iParm,      
3830: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 72          /* An ar
3840: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 64 69  gument to the di
3850: 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f  sposal method */
3860: 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
3870: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ,          /* Ju
3880: 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69  mp here to conti
3890: 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f  nue with next ro
38a0: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  w */.  int iBrea
38b0: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
38c0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62  * Jump here to b
38d0: 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
38e0: 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20  inner loop */.  
38f0: 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20  char *aff       
3900: 20 20 20 20 20 20 20 20 2f 2a 20 61 66 66 69 6e          /* affin
3910: 69 74 79 20 73 74 72 69 6e 67 20 69 66 20 65 44  ity string if eD
3920: 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e  est is SRT_Union
3930: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
3940: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
3950: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
3960: 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20   hasDistinct;   
3970: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3980: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
3990: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
39a0: 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  */..  if( v==0 )
39b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
39c0: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
39d0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
39e0: 20 77 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61   was a LIMIT cla
39f0: 75 73 65 20 6f 6e 20 74 68 65 20 53 45 4c 45 43  use on the SELEC
3a00: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  T statement, the
3a10: 6e 20 64 6f 20 74 68 65 20 63 68 65 63 6b 0a 20  n do the check. 
3a20: 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68   ** to see if th
3a30: 69 73 20 72 6f 77 20 73 68 6f 75 6c 64 20 62 65  is row should be
3a40: 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20   output..  */.  
3a50: 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 64 69  hasDistinct = di
3a60: 73 74 69 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c  stinct>=0 && pEL
3a70: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
3a80: 45 78 70 72 3e 30 3b 0a 20 20 69 66 28 20 70 4f  Expr>0;.  if( pO
3a90: 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21 68 61  rderBy==0 && !ha
3aa0: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
3ab0: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
3ac0: 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 30 29 3b  , iContinue, 0);
3ad0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20  .  }..  /* Pull 
3ae0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
3af0: 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  lumns..  */.  if
3b00: 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20  ( nColumn>0 ){. 
3b10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
3b20: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
3b30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3b40: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
3b50: 2c 20 73 72 63 54 61 62 2c 20 69 29 3b 0a 20 20  , srcTab, i);.  
3b60: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
3b70: 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73   nColumn = pELis
3b80: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 73 71  t->nExpr;.    sq
3b90: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
3ba0: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
3bb0: 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  List);.  }..  /*
3bc0: 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   If the DISTINCT
3bd0: 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65   keyword was pre
3be0: 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45  sent on the SELE
3bf0: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  CT statement.  *
3c00: 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68  * and this row h
3c10: 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66  as been seen bef
3c20: 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ore, then do not
3c30: 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20   make this row. 
3c40: 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
3c50: 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69  result..  */.  i
3c60: 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29  f( hasDistinct )
3c70: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45  {.    int n = pE
3c80: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
3c90: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 76 2c   codeDistinct(v,
3ca0: 20 64 69 73 74 69 6e 63 74 2c 20 69 43 6f 6e 74   distinct, iCont
3cb0: 69 6e 75 65 2c 20 6e 2c 20 6e 2b 31 29 3b 0a 20  inue, n, n+1);. 
3cc0: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d     if( pOrderBy=
3cd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65  =0 ){.      code
3ce0: 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f  Offset(v, p, iCo
3cf0: 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 29  ntinue, nColumn)
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
3d10: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
3d20: 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d      /* In this m
3d30: 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20  ode, write each 
3d40: 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20  query result to 
3d50: 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74  the key of the t
3d60: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20  emporary.    ** 
3d70: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
3d80: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
3d90: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
3da0: 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65  _SELECT.    case
3db0: 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20   SRT_Union: {.  
3dc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3dd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
3de0: 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  ecord, nColumn, 
3df0: 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54  NULL_ALWAYS_DIST
3e00: 49 4e 43 54 29 3b 0a 20 20 20 20 20 20 69 66 28  INCT);.      if(
3e10: 20 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20   aff ){.        
3e20: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
3e30: 65 50 33 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20  eP3(v, -1, aff, 
3e40: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
3e50: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
3e60: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3e70: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
3e80: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  m, 0);.      bre
3e90: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
3ea0: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65  * Construct a re
3eb0: 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75  cord from the qu
3ec0: 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20  ery result, but 
3ed0: 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a  instead of.    *
3ee0: 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65  * saving that re
3ef0: 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20  cord, use it as 
3f00: 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20  a key to delete 
3f10: 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20  elements from.  
3f20: 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61    ** the tempora
3f30: 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ry table iParm..
3f40: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
3f50: 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20  SRT_Except: {.  
3f60: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
3f70: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
3f80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3f90: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43  P_MakeRecord, nC
3fa0: 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41  olumn, NULL_ALWA
3fb0: 59 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a 20 20  YS_DISTINCT);.  
3fc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
3fd0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 61  hangeP3(v, -1, a
3fe0: 66 66 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  ff, P3_STATIC);.
3ff0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4000: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
4010: 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20 61 64  Found, iParm, ad
4020: 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr+3);.      sql
4030: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4040: 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50 61 72   OP_Delete, iPar
4050: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  m, 0);.      bre
4060: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
4070: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
4080: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
4090: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
40a0: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
40b0: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
40c0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 56 69  .    case SRT_Vi
40d0: 72 74 75 61 6c 54 61 62 3a 20 7b 0a 20 20 20 20  rtualTab: {.    
40e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
40f0: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
4100: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  ord, nColumn, 0)
4110: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
4120: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
4130: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
4140: 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72  Parse, v, pOrder
4150: 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  By);.      }else
4160: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4170: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4180: 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d  _NewRowid, iParm
4190: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
41a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
41b0: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
41c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
41d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
41e0: 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
41f0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
4200: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
4210: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4220: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
4230: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
4240: 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
4250: 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
4260: 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
4270: 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
4280: 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
4290: 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
42a0: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
42b0: 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
42c0: 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
42d0: 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
42e0: 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
42f0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
4300: 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  t: {.      int a
4310: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
4320: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
4330: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
4340: 32 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  2;..      assert
4350: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
4360: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4370: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
4380: 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 31 2b  Null, -1, addr1+
4390: 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
43a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
43b0: 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
43c0: 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
43d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
43e0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20  P_Goto, 0, 0);. 
43f0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
4400: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  y ){.        /* 
4410: 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20  At first glance 
4420: 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20  you would think 
4430: 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a  we could optimiz
4440: 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20  e out the.      
4450: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e    ** ORDER BY in
4460: 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65   this case since
4470: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e   the order of en
4480: 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74  tries in the set
4490: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  .        ** does
44a0: 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75   not matter.  Bu
44b0: 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65  t there might be
44c0: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c   a LIMIT clause,
44d0: 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   in which.      
44e0: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72    ** case the or
44f0: 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20  der does matter 
4500: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  */.        pushO
4510: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
4520: 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , v, pOrderBy);.
4530: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4540: 20 20 20 20 20 63 68 61 72 20 61 66 66 20 3d 20       char aff = 
4550: 28 69 50 61 72 6d 3e 3e 31 36 29 26 30 78 46 46  (iParm>>16)&0xFF
4560: 3b 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d 20  ;.        aff = 
4570: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
4580: 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61  finity(pEList->a
4590: 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b  [0].pExpr, aff);
45a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
45b0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  VdbeOp3(v, OP_Ma
45c0: 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20  keRecord, 1, 0, 
45d0: 26 61 66 66 2c 20 31 29 3b 0a 20 20 20 20 20 20  &aff, 1);.      
45e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
45f0: 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  Op(v, OP_IdxInse
4600: 72 74 2c 20 28 69 50 61 72 6d 26 30 78 30 30 30  rt, (iParm&0x000
4610: 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20 20 20  0FFFF), 0);.    
4620: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
4630: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
4640: 20 61 64 64 72 32 29 3b 0a 20 20 20 20 20 20 62   addr2);.      b
4650: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
4660: 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65   /* If any row e
4670: 78 69 73 74 73 20 69 6e 20 74 68 65 20 72 65 73  xists in the res
4680: 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
4690: 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
46a0: 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
46b0: 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
46c0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
46d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
46e0: 4d 65 6d 49 6e 74 2c 20 31 2c 20 69 50 61 72 6d  MemInt, 1, iParm
46f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4700: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4710: 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  Pop, nColumn, 0)
4720: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
4730: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
4740: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
4750: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
4760: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4770: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
4780: 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
4790: 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
47a0: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
47b0: 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
47c0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
47d0: 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
47e0: 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
47f0: 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
4800: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
4810: 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
4820: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
4830: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
4840: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
4850: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
4860: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
4870: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
4880: 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b  e, v, pOrderBy);
4890: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
48a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
48b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
48c0: 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29  Store, iParm, 1)
48d0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
48e0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
48f0: 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
4900: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
4910: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
4920: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
4930: 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
4940: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
4950: 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ERY */..    /* S
4960: 65 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f 20  end the data to 
4970: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  the callback fun
4980: 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75  ction or to a su
4990: 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74 68  broutine.  In th
49a0: 65 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 6f 66  e.    ** case of
49b0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2c 20 74   a subroutine, t
49c0: 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74  he subroutine it
49d0: 73 65 6c 66 20 69 73 20 72 65 73 70 6f 6e 73 69  self is responsi
49e0: 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70  ble for.    ** p
49f0: 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 20  opping the data 
4a00: 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a  from the stack..
4a10: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
4a20: 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 0a  SRT_Subroutine:.
4a30: 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c      case SRT_Cal
4a40: 6c 62 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20 69  lback: {.      i
4a50: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
4a60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4a70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
4a80: 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d  keRecord, nColum
4a90: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  n, 0);.        p
4aa0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
4ab0: 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42  arse, v, pOrderB
4ac0: 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  y);.      }else 
4ad0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  if( eDest==SRT_S
4ae0: 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  ubroutine ){.   
4af0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4b00: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75  AddOp(v, OP_Gosu
4b10: 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20  b, 0, iParm);.  
4b20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4b30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4b40: 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61  dOp(v, OP_Callba
4b50: 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  ck, nColumn, 0);
4b60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
4b70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
4b80: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
4b90: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20  _OMIT_TRIGGER). 
4ba0: 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
4bb0: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73  e results.  This
4bc0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c   is used for SEL
4bd0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
4be0: 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  nside.    ** the
4bf0: 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47   body of a TRIGG
4c00: 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65  ER.  The purpose
4c10: 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73   of such selects
4c20: 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20   is to call.    
4c30: 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ** user-defined 
4c40: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68  functions that h
4c50: 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73  ave side effects
4c60: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72  .  We do not car
4c70: 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74  e.    ** about t
4c80: 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74  he actual result
4c90: 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  s of the select.
4ca0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
4cb0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
4cc0: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
4cd0: 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20  Discard );.     
4ce0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4cf0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f  p(v, OP_Pop, nCo
4d00: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
4d10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
4d20: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  dif.  }..  /* Ju
4d30: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
4d40: 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
4d50: 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
4d60: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
4d70: 3e 69 4c 69 6d 69 74 3e 3d 30 20 26 26 20 70 4f  >iLimit>=0 && pO
4d80: 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
4d90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4da0: 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c  p(v, OP_MemIncr,
4db0: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 30 29 3b 0a   p->iLimit, 0);.
4dc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4dd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d  ddOp(v, OP_IfMem
4de0: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
4df0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 20 20   iBreak);.  }.  
4e00: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
4e10: 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72  ** Given an expr
4e20: 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e  ession list, gen
4e30: 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  erate a KeyInfo 
4e40: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
4e50: 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f  ecords.** the co
4e60: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
4e70: 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   for each expres
4e80: 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70  sion in that exp
4e90: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
4ea0: 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c  .** If the ExprL
4eb0: 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ist is an ORDER 
4ec0: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
4ed0: 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72  lause then the r
4ee0: 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49  esulting.** KeyI
4ef0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
4f00: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
4f10: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20   initializing a 
4f20: 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
4f30: 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  .** implement th
4f40: 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74  at clause.  If t
4f50: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74  he ExprList is t
4f60: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
4f70: 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65   a SELECT.** the
4f80: 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  n the KeyInfo st
4f90: 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f  ructure is appro
4fa0: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69  priate for initi
4fb0: 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61  alizing a virtua
4fc0: 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d  l.** index to im
4fd0: 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e  plement a DISTIN
4fe0: 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53  CT test..**.** S
4ff0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
5000: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
5010: 72 65 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f  re is obtain fro
5020: 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63  m malloc.  The c
5030: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
5040: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
5050: 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61  e for seeing tha
5060: 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
5070: 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
5080: 2a 20 66 72 65 65 64 2e 20 20 41 64 64 20 74 68  * freed.  Add th
5090: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
50a0: 75 72 65 20 74 6f 20 74 68 65 20 50 33 20 66 69  ure to the P3 fi
50b0: 65 6c 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65  eld of an opcode
50c0: 20 75 73 69 6e 67 0a 2a 2a 20 50 33 5f 4b 45 59   using.** P3_KEY
50d0: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20  INFO_HANDOFF is 
50e0: 74 68 65 20 75 73 75 61 6c 20 77 61 79 20 6f 66  the usual way of
50f0: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68   dealing with th
5100: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65  is..*/.static Ke
5110: 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72  yInfo *keyInfoFr
5120: 6f 6d 45 78 70 72 4c 69 73 74 28 50 61 72 73 65  omExprList(Parse
5130: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69   *pParse, ExprLi
5140: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71  st *pList){.  sq
5150: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
5160: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45  se->db;.  int nE
5170: 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  xpr;.  KeyInfo *
5180: 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  pInfo;.  struct 
5190: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
51a0: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Item;.  int i;..
51b0: 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d    nExpr = pList-
51c0: 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20  >nExpr;.  pInfo 
51d0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
51e0: 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b  sizeof(*pInfo) +
51f0: 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43   nExpr*(sizeof(C
5200: 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20  ollSeq*)+1) );. 
5210: 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
5220: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
5230: 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49 6e 66  der = (u8*)&pInf
5240: 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b  o->aColl[nExpr];
5250: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65  .    pInfo->nFie
5260: 6c 64 20 3d 20 6e 45 78 70 72 3b 0a 20 20 20 20  ld = nExpr;.    
5270: 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 64 62 2d  pInfo->enc = db-
5280: 3e 65 6e 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d  >enc;.    for(i=
5290: 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
52a0: 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c  a; i<nExpr; i++,
52b0: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
52c0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
52d0: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  .      pColl = s
52e0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
52f0: 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
5300: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  >pExpr);.      i
5310: 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
5320: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d       pColl = db-
5330: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
5340: 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d    }.      pInfo-
5350: 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c  >aColl[i] = pCol
5360: 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  l;.      pInfo->
5370: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
5380: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
5390: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
53a0: 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a  turn pInfo;.}...
53b0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
53c0: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
53d0: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
53e0: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
53f0: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
5400: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
5410: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
5420: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
5430: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
5440: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
5450: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
5460: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
5470: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
5480: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
5490: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
54a0: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
54b0: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
54c0: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
54d0: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72  eSortTail(.  Par
54e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
54f0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
5500: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
5510: 20 2a 70 2c 20 20 20 20 20 20 20 2f 2a 20 54 68   *p,       /* Th
5520: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
5530: 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c  nt */.  Vdbe *v,
5540: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
5550: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
5560: 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e  his VDBE */.  in
5570: 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f  t nColumn,     /
5580: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
5590: 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  mns of data */. 
55a0: 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20   int eDest,     
55b0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73    /* Write the s
55c0: 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65  orted results he
55d0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  re */.  int iPar
55e0: 6d 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69  m        /* Opti
55f0: 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 61  onal parameter a
5600: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
5610: 44 65 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Dest */.){.  int
5620: 20 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56 64   brk = sqlite3Vd
5630: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
5640: 20 20 69 6e 74 20 63 6f 6e 74 20 3d 20 73 71 6c    int cont = sql
5650: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
5660: 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64 72  l(v);.  int addr
5670: 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
5680: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
5690: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
56a0: 3b 0a 0a 20 20 69 54 61 62 20 3d 20 70 4f 72 64  ;..  iTab = pOrd
56b0: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3b 0a  erBy->iECursor;.
56c0: 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c    addr = 1 + sql
56d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
56e0: 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20   OP_Sort, iTab, 
56f0: 62 72 6b 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73  brk);.  codeOffs
5700: 65 74 28 76 2c 20 70 2c 20 63 6f 6e 74 2c 20 30  et(v, p, cont, 0
5710: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5720: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
5730: 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65 72  mn, iTab, pOrder
5740: 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31 29 3b 0a  By->nExpr + 1);.
5750: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
5760: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  ){.    case SRT_
5770: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
5780: 53 52 54 5f 56 69 72 74 75 61 6c 54 61 62 3a 20  SRT_VirtualTab: 
5790: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
57a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
57b0: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
57c0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
57d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
57e0: 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20  _Pull, 1, 0);.  
57f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5800: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72  ddOp(v, OP_Inser
5810: 74 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  t, iParm, 0);.  
5820: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5830: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5840: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
5850: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
5860: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
5870: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
5880: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5890: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  ddOp(v, OP_NotNu
58a0: 6c 6c 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 56  ll, -1, sqlite3V
58b0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
58c0: 29 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  )+3);.      sqli
58d0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
58e0: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
58f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5900: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
5910: 2c 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65  , 0, sqlite3Vdbe
5920: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33  CurrentAddr(v)+3
5930: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5940: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  VdbeOp3(v, OP_Ma
5950: 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20  keRecord, 1, 0, 
5960: 22 63 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  "c", P3_STATIC);
5970: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5980: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
5990: 78 49 6e 73 65 72 74 2c 20 28 69 50 61 72 6d 26  xInsert, (iParm&
59a0: 30 78 30 30 30 30 46 46 46 46 29 2c 20 30 29 3b  0x0000FFFF), 0);
59b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
59c0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54    }.    case SRT
59d0: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
59e0: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
59f0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
5a00: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5a10: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d  _MemStore, iParm
5a20: 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
5a30: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
5a40: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
5a50: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
5a60: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
5a70: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
5a80: 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63  case SRT_Callbac
5a90: 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  k:.    case SRT_
5aa0: 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20  Subroutine: {.  
5ab0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
5ac0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5ad0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
5ae0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
5af0: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
5b00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5b10: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
5b20: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
5b30: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
5b40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5b50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5b60: 43 6f 6c 75 6d 6e 2c 20 2d 31 2d 69 2c 20 69 29  Column, -1-i, i)
5b70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5b80: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
5b90: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
5ba0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5bb0: 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61  dOp(v, OP_Callba
5bc0: 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  ck, nColumn, 0);
5bd0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5be0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5bf0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73  eAddOp(v, OP_Gos
5c00: 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20  ub, 0, iParm);. 
5c10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
5c20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5c30: 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b 0a   OP_Pop, 2, 0);.
5c40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5c50: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
5c60: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
5c70: 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62  thing */.      b
5c80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
5c90: 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
5ca0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
5cb0: 70 20 77 68 65 6e 20 74 68 65 20 4c 49 4d 49 54  p when the LIMIT
5cc0: 20 69 73 20 72 65 61 63 68 65 64 0a 20 20 2a 2f   is reached.  */
5cd0: 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
5ce0: 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
5cf0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5d00: 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4c  P_MemIncr, p->iL
5d10: 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  imit, 0);.    sq
5d20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5d30: 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20  , OP_IfMemZero, 
5d40: 70 2d 3e 69 4c 69 6d 69 74 2c 20 62 72 6b 29 3b  p->iLimit, brk);
5d50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 62  .  }..  /* The b
5d60: 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f  ottom of the loo
5d70: 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
5d80: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
5d90: 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c  (v, cont);.  sql
5da0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5db0: 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
5dc0: 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  addr);.  sqlite3
5dd0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
5de0: 28 76 2c 20 62 72 6b 29 3b 0a 7d 0a 0a 2f 2a 0a  (v, brk);.}../*.
5df0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
5e00: 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20  ter to a string 
5e10: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27  containing the '
5e20: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
5e30: 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  ' of the.** expr
5e40: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68  ession pExpr. Th
5e50: 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20  e string may be 
5e60: 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69  treated as stati
5e70: 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  c by the caller.
5e80: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 65  .**.** If the de
5e90: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69  claration type i
5ea0: 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61  s the exact data
5eb0: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
5ec0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 0a 2a  extracted from.*
5ed0: 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 43  * the original C
5ee0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
5ef0: 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70  ement if the exp
5f00: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
5f10: 75 6d 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  umn..** .** The 
5f20: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
5f30: 20 66 6f 72 20 61 6e 20 65 78 70 72 65 73 73 69   for an expressi
5f40: 6f 6e 20 69 73 20 65 69 74 68 65 72 20 54 45 58  on is either TEX
5f50: 54 2c 20 4e 55 4d 45 52 49 43 20 6f 72 20 41 4e  T, NUMERIC or AN
5f60: 59 2e 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  Y..** The declar
5f70: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
5f80: 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20   ROWID field is 
5f90: 49 4e 54 45 47 45 52 2e 0a 2a 2f 0a 73 74 61 74  INTEGER..*/.stat
5fa0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
5fb0: 6f 6c 75 6d 6e 54 79 70 65 28 4e 61 6d 65 43 6f  olumnType(NameCo
5fc0: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
5fd0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72   *pExpr){.  char
5fe0: 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 3b 0a 20   const *zType;. 
5ff0: 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 70 45   int j;.  if( pE
6000: 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 43 2d 3e 70  xpr==0 || pNC->p
6010: 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  SrcList==0 ) ret
6020: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65  urn 0;..  /* The
6030: 20 54 4b 5f 41 53 20 6f 70 65 72 61 74 6f 72 20   TK_AS operator 
6040: 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  can only occur i
6050: 6e 20 4f 52 44 45 52 20 42 59 2c 20 47 52 4f 55  n ORDER BY, GROU
6060: 50 20 42 59 2c 20 48 41 56 49 4e 47 2c 0a 20 20  P BY, HAVING,.  
6070: 2a 2a 20 61 6e 64 20 4c 49 4d 49 54 20 63 6c 61  ** and LIMIT cla
6080: 75 73 65 73 2e 20 20 42 75 74 20 70 45 78 70 72  uses.  But pExpr
6090: 20 6f 72 69 67 69 6e 61 74 65 73 20 69 6e 20 74   originates in t
60a0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
60b0: 20 61 0a 20 20 2a 2a 20 53 45 4c 45 43 54 2e 20   a.  ** SELECT. 
60c0: 20 53 6f 20 70 45 78 70 72 20 63 61 6e 20 6e 65   So pExpr can ne
60d0: 76 65 72 20 63 6f 6e 74 61 69 6e 20 61 6e 20 41  ver contain an A
60e0: 53 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f  S operator..  */
60f0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
6100: 2d 3e 6f 70 21 3d 54 4b 5f 41 53 20 29 3b 0a 0a  ->op!=TK_AS );..
6110: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
6120: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
6130: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
6140: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
6150: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   0;.      int iC
6160: 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ol = pExpr->iCol
6170: 75 6d 6e 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  umn;.      while
6180: 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20 29  ( pNC && !pTab )
6190: 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69 73  {.        SrcLis
61a0: 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e  t *pTabList = pN
61b0: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20  C->pSrcList;.   
61c0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70       for(j=0;j<p
61d0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26  TabList->nSrc &&
61e0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
61f0: 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e  iCursor!=pExpr->
6200: 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20  iTable;j++);.   
6210: 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c       if( j<pTabL
6220: 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20  ist->nSrc ){.   
6230: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54         pTab = pT
6240: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
6250: 62 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  b;.        }else
6260: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20  {.          pNC 
6270: 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pNC->pNext;.  
6280: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6290: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
62a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
62b0: 46 49 58 20 4d 45 3a 0a 20 20 20 20 20 20 20 20  FIX ME:.        
62c0: 2a 2a 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75  ** This can occu
62d0: 72 73 20 69 66 20 79 6f 75 20 68 61 76 65 20 73  rs if you have s
62e0: 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 22 53  omething like "S
62f0: 45 4c 45 43 54 20 6e 65 77 2e 78 3b 22 20 69 6e  ELECT new.x;" in
6300: 73 69 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  side.        ** 
6310: 61 20 74 72 69 67 67 65 72 2e 20 20 49 6e 20 6f  a trigger.  In o
6320: 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 79  ther words, if y
6330: 6f 75 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ou reference the
6340: 20 73 70 65 63 69 61 6c 20 22 6e 65 77 22 0a 20   special "new". 
6350: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
6360: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
6370: 74 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20  t of a select.  
6380: 57 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61  We do not have a
6390: 20 67 6f 6f 64 20 77 61 79 0a 20 20 20 20 20 20   good way.      
63a0: 20 20 2a 2a 20 74 6f 20 66 69 6e 64 20 74 68 65    ** to find the
63b0: 20 61 63 74 75 61 6c 20 74 61 62 6c 65 20 74 79   actual table ty
63c0: 70 65 2c 20 73 6f 20 63 61 6c 6c 20 69 74 20 22  pe, so call it "
63d0: 54 45 58 54 22 2e 20 20 54 68 69 73 20 69 73 20  TEXT".  This is 
63e0: 72 65 61 6c 6c 79 0a 20 20 20 20 20 20 20 20 2a  really.        *
63f0: 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 66 20 61  * something of a
6400: 20 62 75 67 2c 20 62 75 74 20 49 20 64 6f 20 6e   bug, but I do n
6410: 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 74 6f 20 66  ot know how to f
6420: 69 78 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a  ix it..        *
6430: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
6440: 73 20 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20  s code does not 
6450: 70 72 6f 64 75 63 65 20 74 68 65 20 63 6f 72 72  produce the corr
6460: 65 63 74 20 61 6e 73 77 65 72 20 2d 20 69 74 20  ect answer - it 
6470: 6a 75 73 74 20 70 72 65 76 65 6e 74 73 0a 20 20  just prevents.  
6480: 20 20 20 20 20 20 2a 2a 20 61 20 73 65 67 66 61        ** a segfa
6490: 75 6c 74 2e 20 20 53 65 65 20 74 69 63 6b 65 74  ult.  See ticket
64a0: 20 23 31 32 32 39 2e 0a 20 20 20 20 20 20 20 20   #1229..        
64b0: 2a 2f 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65  */.        zType
64c0: 20 3d 20 22 54 45 58 54 22 3b 0a 20 20 20 20 20   = "TEXT";.     
64d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
64e0: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
64f0: 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66  pTab );.      if
6500: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
6510: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
6520: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
6530: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
6540: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
6550: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
6560: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
6570: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
6580: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 7d 65  TEGER";.      }e
6590: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 79  lse{.        zTy
65a0: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
65b0: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20  iCol].zType;.   
65c0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
65d0: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
65e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
65f0: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
6600: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
6610: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
6620: 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  ;.      Select *
6630: 70 53 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c  pS = pExpr->pSel
6640: 65 63 74 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  ect;.      sNC.p
6650: 53 72 63 4c 69 73 74 20 3d 20 70 45 78 70 72 2d  SrcList = pExpr-
6660: 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a  >pSelect->pSrc;.
6670: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
6680: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 7a 54 79  = pNC;.      zTy
6690: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
66a0: 26 73 4e 43 2c 20 70 53 2d 3e 70 45 4c 69 73 74  &sNC, pS->pEList
66b0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 20 0a  ->a[0].pExpr); .
66c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
66d0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
66e0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 7a 54 79  fault:.      zTy
66f0: 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 0a 20  pe = 0;.  }.  . 
6700: 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d   return zType;.}
6710: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
6720: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
6730: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
6740: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
6750: 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  pes of columns.*
6760: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
6770: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  set..*/.static v
6780: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
6790: 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65  mnTypes(.  Parse
67a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
67b0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
67c0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
67d0: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
67e0: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
67f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
6800: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
6810: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
6820: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
6830: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
6840: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
6850: 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74  nt i;.  NameCont
6860: 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70  ext sNC;.  sNC.p
6870: 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
6880: 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  st;.  for(i=0; i
6890: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
68a0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
68b0: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
68c0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73  .pExpr;.    cons
68d0: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20  t char *zType = 
68e0: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
68f0: 20 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 79   p);.    if( zTy
6900: 70 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  pe==0 ) continue
6910: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62  ;.    /* The vdb
6920: 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 27 73  e must make it's
6930: 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65   own copy of the
6940: 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 2c 20 69 6e   column-type, in
6950: 20 63 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a   case the .    *
6960: 2a 20 73 63 68 65 6d 61 20 69 73 20 72 65 73 65  * schema is rese
6970: 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 76 69  t before this vi
6980: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73  rtual machine is
6990: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
69a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
69b0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2b  SetColName(v, i+
69c0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 7a  pEList->nExpr, z
69d0: 54 79 70 65 2c 20 73 74 72 6c 65 6e 28 7a 54 79  Type, strlen(zTy
69e0: 70 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  pe));.  }.}../*.
69f0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
6a00: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
6a10: 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d  the VDBE the nam
6a20: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
6a30: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
6a40: 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  et.  This inform
6a50: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
6a60: 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20   provide the.** 
6a70: 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69  azCol[] values i
6a80: 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a  n the callback..
6a90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
6aa0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
6ab0: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
6ac0: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
6ad0: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
6ae0: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
6af0: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
6b00: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
6b10: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
6b20: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
6b30: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
6b40: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56  lt set */.){.  V
6b50: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
6b60: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c  >pVdbe;.  int i,
6b70: 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   j;.  sqlite3 *d
6b80: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
6b90: 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c    int fullNames,
6ba0: 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69   shortNames;..#i
6bb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6bc0: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49  T_EXPLAIN.  /* I
6bd0: 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50  f this is an EXP
6be0: 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20  LAIN, skip this 
6bf0: 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50  step */.  if( pP
6c00: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
6c10: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6c20: 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
6c30: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 69 66 28  t( v!=0 );.  if(
6c40: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
6c50: 73 53 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20  sSet || v==0 || 
6c60: 73 71 6c 69 74 65 33 54 73 64 28 29 2d 3e 6d 61  sqlite3Tsd()->ma
6c70: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
6c80: 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  urn;.  pParse->c
6c90: 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a  olNamesSet = 1;.
6ca0: 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64    fullNames = (d
6cb0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
6cc0: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
6cd0: 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73  =0;.  shortNames
6ce0: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
6cf0: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
6d00: 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69  ames)!=0;.  sqli
6d10: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
6d20: 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  s(v, pEList->nEx
6d30: 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  pr);.  for(i=0; 
6d40: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
6d50: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
6d60: 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69  *p;.    p = pELi
6d70: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
6d80: 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63      if( p==0 ) c
6d90: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
6da0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
6db0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ame ){.      cha
6dc0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  r *zName = pELis
6dd0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[i].zName;. 
6de0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6df0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
6e00: 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a   zName, strlen(z
6e10: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f  Name));.      co
6e20: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
6e30: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
6e40: 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69  COLUMN && pTabLi
6e50: 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  st ){.      Tabl
6e60: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63  e *pTab;.      c
6e70: 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20  har *zCol;.     
6e80: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69   int iCol = p->i
6e90: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f  Column;.      fo
6ea0: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73  r(j=0; j<pTabLis
6eb0: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
6ec0: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
6ed0: 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b  r!=p->iTable; j+
6ee0: 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72  +){}.      asser
6ef0: 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  t( j<pTabList->n
6f00: 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61  Src );.      pTa
6f10: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
6f20: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  j].pTab;.      i
6f30: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
6f40: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
6f50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
6f60: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
6f70: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
6f80: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
6f90: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
6fa0: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f        zCol = "ro
6fb0: 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  wid";.      }els
6fc0: 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  e{.        zCol 
6fd0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
6fe0: 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l].zName;.      
6ff0: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f  }.      if( !sho
7000: 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c  rtNames && !full
7010: 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73 70 61 6e  Names && p->span
7020: 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b  .z && p->span.z[
7030: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0] ){.        sq
7040: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
7050: 61 6d 65 28 76 2c 20 69 2c 20 28 63 68 61 72 2a  ame(v, i, (char*
7060: 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73  )p->span.z, p->s
7070: 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 65  pan.n);.      }e
7080: 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65  lse if( fullName
7090: 73 20 7c 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65  s || (!shortName
70a0: 73 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s && pTabList->n
70b0: 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20  Src>1) ){.      
70c0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
70d0: 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  0;.        char 
70e0: 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20 20 20  *zTab;. .       
70f0: 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   zTab = pTabList
7100: 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20  ->a[j].zAlias;. 
7110: 20 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e         if( fullN
7120: 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20  ames || zTab==0 
7130: 29 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a  ) zTab = pTab->z
7140: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71  Name;.        sq
7150: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
7160: 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22  zName, zTab, "."
7170: 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30  , zCol, (char*)0
7180: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7190: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
71a0: 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 50 33  (v, i, zName, P3
71b0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
71c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
71d0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
71e0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 43 6f 6c  lName(v, i, zCol
71f0: 2c 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 29 3b  , strlen(zCol));
7200: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
7210: 73 65 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a  se if( p->span.z
7220: 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d   && p->span.z[0]
7230: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7240: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
7250: 76 2c 20 69 2c 20 28 63 68 61 72 2a 29 70 2d 3e  v, i, (char*)p->
7260: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
7270: 6e 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c  n);.      /* sql
7280: 69 74 65 33 56 64 62 65 43 6f 6d 70 72 65 73 73  ite3VdbeCompress
7290: 53 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b 20  Space(v, addr); 
72a0: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
72b0: 20 20 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33      char zName[3
72c0: 30 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0];.      assert
72d0: 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  ( p->op!=TK_COLU
72e0: 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d  MN || pTabList==
72f0: 30 20 29 3b 0a 20 20 20 20 20 20 73 70 72 69 6e  0 );.      sprin
7300: 74 66 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d  tf(zName, "colum
7310: 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20  n%d", i+1);.    
7320: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
7330: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 4e  ColName(v, i, zN
7340: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ame, 0);.    }. 
7350: 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c   }.  generateCol
7360: 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c  umnTypes(pParse,
7370: 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
7380: 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  t);.}..#ifndef S
7390: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
73a0: 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
73b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
73c0: 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72  nection operator
73d0: 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72  , used for error
73e0: 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74   messages..*/.st
73f0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
7400: 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e  *selectOpName(in
7410: 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a  t id){.  char *z
7420: 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29  ;.  switch( id )
7430: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
7440: 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e  L:       z = "UN
7450: 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61  ION ALL";   brea
7460: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
7470: 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49  NTERSECT: z = "I
7480: 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65  NTERSECT";   bre
7490: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
74a0: 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22  EXCEPT:    z = "
74b0: 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72  EXCEPT";      br
74c0: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
74d0: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20  :           z = 
74e0: 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62  "UNION";       b
74f0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
7500: 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn z;.}.#endif /
7510: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
7520: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
7530: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
7540: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73  declaration.*/.s
7550: 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 53 65  tatic int prepSe
7560: 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65 2a 2c  lectStmt(Parse*,
7570: 20 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a   Select*);../*.*
7580: 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54  * Given a SELECT
7590: 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65   statement, gene
75a0: 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72  rate a Table str
75b0: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
75c0: 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73  ribes.** the res
75d0: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20  ult set of that 
75e0: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65  SELECT..*/.Table
75f0: 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53   *sqlite3ResultS
7600: 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65  etOfSelect(Parse
7610: 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 2a   *pParse, char *
7620: 7a 54 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74  zTabName, Select
7630: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61   *pSelect){.  Ta
7640: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74  ble *pTab;.  int
7650: 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73   i, j;.  ExprLis
7660: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f 6c  t *pEList;.  Col
7670: 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c  umn *aCol, *pCol
7680: 3b 0a 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c  ;..  if( prepSel
7690: 65 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20  ectStmt(pParse, 
76a0: 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  pSelect) ){.    
76b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
76c0: 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
76d0: 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c  tResolve(pParse,
76e0: 20 70 53 65 6c 65 63 74 2c 20 30 29 20 29 7b 0a   pSelect, 0) ){.
76f0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7700: 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  }.  pTab = sqlit
7710: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
7720: 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20  Table) );.  if( 
7730: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pTab==0 ){.    r
7740: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
7750: 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Tab->nRef = 1;. 
7760: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pTab->zName = z
7770: 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65  TabName ? sqlite
7780: 53 74 72 44 75 70 28 7a 54 61 62 4e 61 6d 65 29  StrDup(zTabName)
7790: 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d   : 0;.  pEList =
77a0: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
77b0: 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d  ;.  pTab->nCol =
77c0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
77d0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
77e0: 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62  nCol>0 );.  pTab
77f0: 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20  ->aCol = aCol = 
7800: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
7810: 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  zeof(pTab->aCol[
7820: 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  0])*pTab->nCol )
7830: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ;.  for(i=0, pCo
7840: 6c 3d 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e  l=aCol; i<pTab->
7850: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
7860: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 2c  +){.    Expr *p,
7870: 20 2a 70 52 3b 0a 20 20 20 20 63 68 61 72 20 2a   *pR;.    char *
7880: 7a 54 79 70 65 3b 0a 20 20 20 20 63 68 61 72 20  zType;.    char 
7890: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72  *zName;.    char
78a0: 20 2a 7a 42 61 73 65 6e 61 6d 65 3b 0a 20 20 20   *zBasename;.   
78b0: 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20 4e 61   int cnt;.    Na
78c0: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
78d0: 20 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 61     .    /* Get a
78e0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61  n appropriate na
78f0: 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  me for the colum
7900: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d  n.    */.    p =
7910: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
7920: 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
7930: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c   p->pRight==0 ||
7940: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
7950: 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  n.z==0 || p->pRi
7960: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21  ght->token.z[0]!
7970: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a  =0 );.    if( (z
7980: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
7990: 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  [i].zName)!=0 ){
79a0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
79b0: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
79c0: 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20   an "AS <name>" 
79d0: 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d  phrase, use <nam
79e0: 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a  e> as the name *
79f0: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
7a00: 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a 4e 61  sqliteStrDup(zNa
7a10: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  me);.    }else i
7a20: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  f( p->op==TK_DOT
7a30: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
7a40: 26 26 20 28 70 52 3d 70 2d 3e 70 52 69 67 68 74  && (pR=p->pRight
7a50: 29 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b 65  )!=0 && pR->toke
7a60: 6e 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e  n.z && pR->token
7a70: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f  .z[0] ){.      /
7a80: 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f 66  * For columns of
7a90: 20 74 68 65 20 66 72 6f 6d 20 41 2e 42 20 75 73   the from A.B us
7aa0: 65 20 42 20 61 73 20 74 68 65 20 6e 61 6d 65 20  e B as the name 
7ab0: 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  */.      zName =
7ac0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
7ad0: 22 25 54 22 2c 20 26 70 52 2d 3e 74 6f 6b 65 6e  "%T", &pR->token
7ae0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
7af0: 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d   p->span.z && p-
7b00: 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20  >span.z[0] ){.  
7b10: 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f      /* Use the o
7b20: 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20  riginal text of 
7b30: 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65  the column expre
7b40: 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d  ssion as its nam
7b50: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
7b60: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
7b70: 66 28 22 25 54 22 2c 20 26 70 2d 3e 73 70 61 6e  f("%T", &p->span
7b80: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
7b90: 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 65 6c      /* If all el
7ba0: 73 65 20 66 61 69 6c 73 2c 20 6d 61 6b 65 20 75  se fails, make u
7bb0: 70 20 61 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  p a name */.    
7bc0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
7bd0: 33 4d 50 72 69 6e 74 66 28 22 63 6f 6c 75 6d 6e  3MPrintf("column
7be0: 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 7d  %d", i+1);.    }
7bf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
7c00: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ote(zName);.    
7c10: 69 66 28 20 73 71 6c 69 74 65 33 54 73 64 28 29  if( sqlite3Tsd()
7c20: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7c30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
7c40: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ee(zName);.     
7c50: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
7c60: 62 6c 65 28 30 2c 20 70 54 61 62 29 3b 0a 20 20  ble(0, pTab);.  
7c70: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7c80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
7c90: 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e   sure the column
7ca0: 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e   name is unique.
7cb0: 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73    If the name is
7cc0: 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20   not unique,.   
7cd0: 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74   ** append a int
7ce0: 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65  eger to the name
7cf0: 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f   so that it beco
7d00: 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20  mes unique..    
7d10: 2a 2f 0a 20 20 20 20 7a 42 61 73 65 6e 61 6d 65  */.    zBasename
7d20: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 66 6f   = zName;.    fo
7d30: 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20  r(j=cnt=0; j<i; 
7d40: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
7d50: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61  sqlite3StrICmp(a
7d60: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  Col[j].zName, zN
7d70: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
7d80: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
7d90: 65 33 4d 50 72 69 6e 74 66 28 22 25 73 3a 25 64  e3MPrintf("%s:%d
7da0: 22 2c 20 7a 42 61 73 65 6e 61 6d 65 2c 20 2b 2b  ", zBasename, ++
7db0: 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 20  cnt);.        j 
7dc0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66  = -1;.        if
7dd0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65  ( zName==0 ) bre
7de0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
7df0: 7d 0a 20 20 20 20 69 66 28 20 7a 42 61 73 65 6e  }.    if( zBasen
7e00: 61 6d 65 21 3d 7a 4e 61 6d 65 20 29 7b 0a 20 20  ame!=zName ){.  
7e10: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
7e20: 42 61 73 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Basename);.    }
7e30: 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  .    pCol->zName
7e40: 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f   = zName;..    /
7e50: 2a 20 47 65 74 20 74 68 65 20 74 79 70 65 6e 61  * Get the typena
7e60: 6d 65 2c 20 74 79 70 65 20 61 66 66 69 6e 69 74  me, type affinit
7e70: 79 2c 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  y, and collating
7e80: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
7e90: 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 2e  e.    ** column.
7ea0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
7eb0: 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
7ec0: 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
7ed0: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65  C.pSrcList = pSe
7ee0: 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20  lect->pSrc;.    
7ef0: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 53 74  zType = sqliteSt
7f00: 72 44 75 70 28 63 6f 6c 75 6d 6e 54 79 70 65 28  rDup(columnType(
7f10: 26 73 4e 43 2c 20 70 29 29 3b 0a 20 20 20 20 70  &sNC, p));.    p
7f20: 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 7a 54 79  Col->zType = zTy
7f30: 70 65 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66  pe;.    pCol->af
7f40: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
7f50: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b  ExprAffinity(p);
7f60: 0a 20 20 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c  .    pCol->pColl
7f70: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
7f80: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29  llSeq(pParse, p)
7f90: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 2d  ;.    if( !pCol-
7fa0: 3e 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >pColl ){.      
7fb0: 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50  pCol->pColl = pP
7fc0: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
7fd0: 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  oll;.    }.  }. 
7fe0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
7ff0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62  1;.  return pTab
8000: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  ;.}../*.** Prepa
8010: 72 65 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  re a SELECT stat
8020: 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73  ement for proces
8030: 73 69 6e 67 20 62 79 20 64 6f 69 6e 67 20 74 68  sing by doing th
8040: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74  e following.** t
8050: 68 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  hings:.**.**    
8060: 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56  (1)  Make sure V
8070: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
8080: 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
8090: 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a  igned to every.*
80a0: 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e  *         elemen
80b0: 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
80c0: 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ause..**.**    (
80d0: 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  2)  Fill in the 
80e0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54  pTabList->a[].pT
80f0: 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  ab fields in the
8100: 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a   SrcList that .*
8110: 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  *         define
8120: 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
8130: 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61  When views appea
8140: 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
8150: 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20  ause,.**        
8160: 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e   fill pTabList->
8170: 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68  a[].pSelect with
8180: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
8190: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
81a0: 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20  **         that 
81b0: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
81c0: 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20  iew.  A copy is 
81d0: 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77  made of the view
81e0: 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  's SELECT.**    
81f0: 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73       statement s
8200: 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72  o that we can fr
8210: 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64  eely modify or d
8220: 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65  elete that state
8230: 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
8240: 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67  without worrying
8250: 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75   about messing u
8260: 70 20 74 68 65 20 70 72 65 73 69 73 74 65 6e 74  p the presistent
8270: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a   representation.
8280: 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68  **         of th
8290: 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20  e view..**.**   
82a0: 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20   (3)  Add terms 
82b0: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
82c0: 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74  use to accomodat
82d0: 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  e the NATURAL ke
82e0: 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20  yword.**        
82f0: 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68   on joins and th
8300: 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
8310: 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a  lause of joins..
8320: 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63  **.**    (4)  Sc
8330: 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63  an the list of c
8340: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
8350: 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74  sult set (pEList
8360: 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20  ) looking.**    
8370: 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63       for instanc
8380: 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70  es of the "*" op
8390: 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41  erator or the TA
83a0: 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  BLE.* operator..
83b0: 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f  **         If fo
83c0: 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68  und, expand each
83d0: 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79   "*" to be every
83e0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79   column in every
83f0: 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20   table.**       
8400: 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f    and TABLE.* to
8410: 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
8420: 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a   in TABLE..**.**
8430: 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63   Return 0 on suc
8440: 63 65 73 73 2e 20 20 49 66 20 74 68 65 72 65 20  cess.  If there 
8450: 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65  are problems, le
8460: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
8470: 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73  sage.** in pPars
8480: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  e and return non
8490: 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  -zero..*/.static
84a0: 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53   int prepSelectS
84b0: 74 6d 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  tmt(Parse *pPars
84c0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
84d0: 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63   int i, j, k, rc
84e0: 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
84f0: 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
8500: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62  t *pEList;.  Tab
8510: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 74 72 75  le *pTab;.  stru
8520: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
8530: 2a 70 46 72 6f 6d 3b 0a 0a 20 20 69 66 28 20 70  *pFrom;..  if( p
8540: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d  ==0 || p->pSrc==
8550: 30 20 7c 7c 20 73 71 6c 69 74 65 33 54 73 64 28  0 || sqlite3Tsd(
8560: 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  )->mallocFailed 
8570: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70 54  ) return 1;.  pT
8580: 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
8590: 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
85a0: 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61  pEList;..  /* Ma
85b0: 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e  ke sure cursor n
85c0: 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
85d0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
85e0: 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a   entries in.  **
85f0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
8600: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
8610: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
8620: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
8630: 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
8640: 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 0a  rse, p->pSrc);..
8650: 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
8660: 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69  ry table named i
8670: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
8680: 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  e of the select.
8690: 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74    If.  ** an ent
86a0: 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
86b0: 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75  lause is a subqu
86c0: 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ery instead of a
86d0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a   table or view,.
86e0: 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65    ** then create
86f0: 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
8700: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  le structure to 
8710: 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62  describe the sub
8720: 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
8730: 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
8740: 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
8750: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
8760: 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 69   pFrom++){.    i
8770: 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  f( pFrom->pTab!=
8780: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
8790: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  is statement has
87a0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72   already been pr
87b0: 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20 69  epared.  There i
87c0: 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20  s no need.      
87d0: 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72  ** to go further
87e0: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
87f0: 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( i==0 );.     
8800: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
8810: 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
8820: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e  zName==0 ){.#ifn
8830: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8840: 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 2f  SUBQUERY.      /
8850: 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
8860: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
8870: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
8880: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
8890: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  rom->pSelect!=0 
88a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72  );.      if( pFr
88b0: 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b  om->zAlias==0 ){
88c0: 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
88d0: 7a 41 6c 69 61 73 20 3d 0a 20 20 20 20 20 20 20  zAlias =.       
88e0: 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
88f0: 66 28 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65  f("sqlite_subque
8900: 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29  ry_%p_", (void*)
8910: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pFrom->pSelect);
8920: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
8930: 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
8940: 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
8950: 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
8960: 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c  b = .        sql
8970: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
8980: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 46  elect(pParse, pF
8990: 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c 20 70 46 72  rom->zAlias, pFr
89a0: 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  om->pSelect);.  
89b0: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
89c0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
89d0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
89e0: 20 20 20 2f 2a 20 54 68 65 20 69 73 54 72 61 6e     /* The isTran
89f0: 73 69 65 6e 74 20 66 6c 61 67 20 69 6e 64 69 63  sient flag indic
8a00: 61 74 65 73 20 74 68 61 74 20 74 68 65 20 54 61  ates that the Ta
8a10: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 61  ble structure ha
8a20: 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a 2a 20  s been.      ** 
8a30: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
8a40: 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20 62 65  cated and may be
8a50: 20 66 72 65 65 64 20 61 74 20 61 6e 79 20 74 69   freed at any ti
8a60: 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  me.  In other wo
8a70: 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20 70 54  rds,.      ** pT
8a80: 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  ab is not pointi
8a90: 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73 74 65  ng to a persiste
8aa0: 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
8ab0: 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 0a  re that defines.
8ac0: 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20 6f 66        ** part of
8ad0: 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a   the schema. */.
8ae0: 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73 54 72        pTab->isTr
8af0: 61 6e 73 69 65 6e 74 20 3d 20 31 3b 0a 23 65 6e  ansient = 1;.#en
8b00: 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
8b10: 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e       /* An ordin
8b20: 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65  ary table or vie
8b30: 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52  w name in the FR
8b40: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
8b50: 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
8b60: 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
8b70: 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
8b80: 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20   pTab = .       
8b90: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
8ba0: 62 6c 65 28 70 50 61 72 73 65 2c 70 46 72 6f 6d  ble(pParse,pFrom
8bb0: 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a  ->zName,pFrom->z
8bc0: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20  Database);.     
8bd0: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
8be0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
8bf0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8c00: 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69  pTab->nRef++;.#i
8c10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8c20: 54 5f 56 49 45 57 0a 20 20 20 20 20 20 69 66 28  T_VIEW.      if(
8c30: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
8c40: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
8c50: 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74 68  reach here if th
8c60: 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
8c70: 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77   a really a view
8c80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
8c90: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
8ca0: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
8cb0: 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  , pTab) ){.     
8cc0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
8cd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8ce0: 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70 53   /* If pFrom->pS
8cf0: 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61 6e  elect!=0 it mean
8d00: 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
8d10: 20 77 69 74 68 20 61 0a 20 20 20 20 20 20 20 20   with a.        
8d20: 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20 61  ** view within a
8d30: 20 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c 45   view.  The SELE
8d40: 43 54 20 73 74 72 75 63 74 75 72 65 20 68 61 73  CT structure has
8d50: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20   already been.  
8d60: 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20        ** copied 
8d70: 62 79 20 74 68 65 20 6f 75 74 65 72 20 76 69 65  by the outer vie
8d80: 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69 70  w so we can skip
8d90: 20 74 68 65 20 63 6f 70 79 20 73 74 65 70 20 68   the copy step h
8da0: 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ere.        ** i
8db0: 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65 77  n the inner view
8dc0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
8dd0: 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e       if( pFrom->
8de0: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
8df0: 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
8e00: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
8e10: 53 65 6c 65 63 74 44 75 70 28 70 54 61 62 2d 3e  SelectDup(pTab->
8e20: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
8e30: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
8e40: 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  if.    }.  }..  
8e50: 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52  /* Process NATUR
8e60: 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64  AL keywords, and
8e70: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
8e80: 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a  auses of joins..
8e90: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
8ea0: 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61  eProcessJoin(pPa
8eb0: 72 73 65 2c 20 70 29 20 29 20 72 65 74 75 72 6e  rse, p) ) return
8ec0: 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76   1;..  /* For ev
8ed0: 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63  ery "*" that occ
8ee0: 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  urs in the colum
8ef0: 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74  n list, insert t
8f00: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a  he names of.  **
8f10: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
8f20: 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64  all tables.  And
8f30: 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45   for every TABLE
8f40: 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  .* insert the na
8f50: 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20  mes.  ** of all 
8f60: 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45  columns in TABLE
8f70: 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
8f80: 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c  serted a special
8f90: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
8fa0: 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c   with the TK_ALL
8fb0: 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61   operator for ea
8fc0: 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66  ch "*" that it f
8fd0: 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  ound in the colu
8fe0: 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68  mn list..  ** Th
8ff0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
9000: 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63   just has to loc
9010: 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65  ate the TK_ALL e
9020: 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65  xpressions and e
9030: 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20  xpand.  ** each 
9040: 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20  one to the list 
9050: 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
9060: 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20  n all tables..  
9070: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
9080: 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63  t loop just chec
9090: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ks to see if the
90a0: 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f  re are any "*" o
90b0: 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68  perators.  ** th
90c0: 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e  at need expandin
90d0: 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  g..  */.  for(k=
90e0: 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
90f0: 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; k++){.    Ex
9100: 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d  pr *pE = pEList-
9110: 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[k].pExpr;.   
9120: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
9130: 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ALL ) break;.   
9140: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
9150: 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68  DOT && pE->pRigh
9160: 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  t && pE->pRight-
9170: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20  >op==TK_ALL.    
9180: 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65 66       && pE->pLef
9190: 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  t && pE->pLeft->
91a0: 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65 61  op==TK_ID ) brea
91b0: 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b  k;.  }.  rc = 0;
91c0: 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d  .  if( k<pEList-
91d0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a  >nExpr ){.    /*
91e0: 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65  .    ** If we ge
91f0: 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20  t here it means 
9200: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63  the result set c
9210: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
9220: 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f  ore "*".    ** o
9230: 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65  perators that ne
9240: 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
9250: 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  d.  Loop through
9260: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
9270: 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  .    ** in the r
9280: 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78  esult set and ex
9290: 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79  pand them one by
92a0: 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
92b0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
92c0: 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73  _item *a = pELis
92d0: 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69  t->a;.    ExprLi
92e0: 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  st *pNew = 0;.  
92f0: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50    int flags = pP
9300: 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b  arse->db->flags;
9310: 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d  .    int longNam
9320: 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  es = (flags & SQ
9330: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
9340: 73 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20  s)!=0 &&.       
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
9360: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
9370: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30  hortColNames)==0
9380: 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  ;..    for(k=0; 
9390: 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
93a0: 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   k++){.      Exp
93b0: 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78  r *pE = a[k].pEx
93c0: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  pr;.      if( pE
93d0: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a  ->op!=TK_ALL &&.
93e0: 20 20 20 20 20 20 20 20 20 20 20 28 70 45 2d 3e             (pE->
93f0: 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45  op!=TK_DOT || pE
9400: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70  ->pRight==0 || p
9410: 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54  E->pRight->op!=T
9420: 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  K_ALL) ){.      
9430: 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63    /* This partic
9440: 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ular expression 
9450: 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
9460: 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20   be expanded..  
9470: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
9480: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
9490: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e  xprListAppend(pN
94a0: 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c 20  ew, a[k].pExpr, 
94b0: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
94c0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
94d0: 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
94e0: 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d  nExpr-1].zName =
94f0: 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20   a[k].zName;.   
9500: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9510: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
9520: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9530: 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a  a[k].pExpr = 0;.
9540: 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61          a[k].zNa
9550: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  me = 0;.      }e
9560: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
9570: 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
9580: 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54  is a "*" or a "T
9590: 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64  ABLE.*" and need
95a0: 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20  s to be.        
95b0: 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a  ** expanded. */.
95c0: 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c          int tabl
95d0: 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  eSeen = 0;      
95e0: 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e  /* Set to 1 when
95f0: 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a   TABLE matches *
9600: 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  /.        char *
9610: 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  zTName;         
9620: 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61     /* text of na
9630: 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20  me of TABLE */. 
9640: 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
9650: 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
9660: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
9670: 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71 6c      zTName = sql
9680: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
9690: 6e 28 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f  n(&pE->pLeft->to
96a0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ken);.        }e
96b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
96c0: 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  TName = 0;.     
96d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
96e0: 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
96f0: 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
9700: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
9710: 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
9720: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
9730: 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
9740: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
9750: 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d  TabName = pFrom-
9760: 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  >zAlias;.       
9770: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
9780: 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30  =0 || zTabName[0
9790: 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20  ]==0 ){ .       
97a0: 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
97b0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
97c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
97d0: 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
97e0: 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c   (zTabName==0 ||
97f0: 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20   zTabName[0]==0 
9800: 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
9810: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49       sqlite3StrI
9820: 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62  Cmp(zTName, zTab
9830: 4e 61 6d 65 29 21 3d 30 29 20 29 7b 0a 20 20 20  Name)!=0) ){.   
9840: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
9850: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
9860: 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65           tableSe
9870: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
9880: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
9890: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
98a0: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
98b0: 2a 70 45 78 70 72 2c 20 2a 70 4c 65 66 74 2c 20  *pExpr, *pLeft, 
98c0: 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  *pRight;.       
98d0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
98e0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
98f0: 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20  .zName;..       
9900: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a       if( i>0 ){.
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
9920: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
9930: 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62  m *pLeft = &pTab
9940: 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20  List->a[i-1];.  
9950: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
9960: 28 70 4c 65 66 74 2d 3e 6a 6f 69 6e 74 79 70 65  (pLeft->jointype
9970: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
9980: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
9990: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c               col
99a0: 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e  umnIndex(pLeft->
99b0: 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  pTab, zName)>=0 
99c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
99d0: 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
99e0: 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
99f0: 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
9a00: 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
9a10: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
9a20: 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a  e on the right *
9a30: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
9a40: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
9a50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9a60: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
9a70: 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
9a80: 28 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 2c 20  (pLeft->pUsing, 
9a90: 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9ab0: 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61  In a join with a
9ac0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f   USING clause, o
9ad0: 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  mit columns in t
9ae0: 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  he.             
9af0: 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75     ** using clau
9b00: 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  se from the tabl
9b10: 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20  e on the right. 
9b20: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
9b30: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
9b40: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
9b50: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9b60: 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20         pRight = 
9b70: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
9b80: 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
9b90: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69           if( pRi
9ba0: 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ght==0 ) break;.
9bb0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54              setT
9bc0: 6f 6b 65 6e 28 26 70 52 69 67 68 74 2d 3e 74 6f  oken(&pRight->to
9bd0: 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ken, zName);.   
9be0: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
9bf0: 62 4e 61 6d 65 20 26 26 20 28 6c 6f 6e 67 4e 61  bName && (longNa
9c00: 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d  mes || pTabList-
9c10: 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20  >nSrc>1) ){.    
9c20: 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
9c30: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
9c40: 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  _ID, 0, 0, 0);. 
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
9c60: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
9c70: 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20  (TK_DOT, pLeft, 
9c80: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
9c90: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
9ca0: 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  xpr==0 ) break;.
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
9cc0: 74 54 6f 6b 65 6e 28 26 70 4c 65 66 74 2d 3e 74  tToken(&pLeft->t
9cd0: 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29 3b  oken, zTabName);
9ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
9cf0: 65 74 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d 3e  etToken(&pExpr->
9d00: 73 70 61 6e 2c 20 73 71 6c 69 74 65 33 4d 50 72  span, sqlite3MPr
9d10: 69 6e 74 66 28 22 25 73 2e 25 73 22 2c 20 7a 54  intf("%s.%s", zT
9d20: 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b  abName, zName));
9d30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
9d40: 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d  Expr->span.dyn =
9d50: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
9d60: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a    pExpr->token.z
9d70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
9d80: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
9d90: 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
9da0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
9db0: 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20  en.dyn = 0;.    
9dc0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
9de0: 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  pr = pRight;.   
9df0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
9e00: 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e  ->span = pExpr->
9e10: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20  token;.         
9e20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
9e30: 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29   if( longNames )
9e40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
9e50: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
9e60: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65  prListAppend(pNe
9e70: 77 2c 20 70 45 78 70 72 2c 20 26 70 45 78 70 72  w, pExpr, &pExpr
9e80: 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 20  ->span);.       
9e90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9ea0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
9eb0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9ec0: 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 70 45 78  Append(pNew, pEx
9ed0: 70 72 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b  pr, &pRight->tok
9ee0: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
9ef0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
9f00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9f10: 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20   if( !tableSeen 
9f20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
9f30: 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20   zTName ){.     
9f40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
9f50: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
9f60: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
9f70: 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20  s", zTName);.   
9f80: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
9f90: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9fa0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
9fb0: 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65  , "no tables spe
9fc0: 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20  cified");.      
9fd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9fe0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
9ff0: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
a000: 46 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20 20  Free(zTName);.  
a010: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
a020: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
a030: 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20  elete(pEList);. 
a040: 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70     p->pEList = p
a050: 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  New;.  }.  retur
a060: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
a070: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
a080: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
a090: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a0a0: 61 73 73 6f 63 69 61 74 65 73 20 65 6e 74 72 69  associates entri
a0b0: 65 73 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  es in an ORDER B
a0c0: 59 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  Y expression lis
a0d0: 74 20 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e  t with.** column
a0e0: 73 20 69 6e 20 61 20 72 65 73 75 6c 74 2e 20 20  s in a result.  
a0f0: 46 6f 72 20 65 61 63 68 20 4f 52 44 45 52 20 42  For each ORDER B
a100: 59 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  Y expression, th
a110: 65 20 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74  e opcode of.** t
a120: 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64  he top-level nod
a130: 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
a140: 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68  TK_COLUMN and th
a150: 65 20 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  e iColumn value 
a160: 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65  of.** the top-le
a170: 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c  vel node is fill
a180: 65 64 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d  ed in with colum
a190: 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  n number and the
a1a0: 20 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65   iTable.** value
a1b0: 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65   of the top-leve
a1c0: 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64  l node is filled
a1d0: 20 77 69 74 68 20 69 54 61 62 6c 65 20 70 61 72   with iTable par
a1e0: 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  ameter..**.** If
a1f0: 20 74 68 65 72 65 20 61 72 65 20 70 72 69 6f 72   there are prior
a200: 20 53 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c   SELECT clauses,
a210: 20 74 68 65 79 20 61 72 65 20 70 72 6f 63 65 73   they are proces
a220: 73 65 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61  sed first.  A ma
a230: 74 63 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72  tch.** in an ear
a240: 6c 69 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65  lier SELECT take
a250: 73 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  s precedence ove
a260: 72 20 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54  r a later SELECT
a270: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72  ..**.** Any entr
a280: 79 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  y that does not 
a290: 6d 61 74 63 68 20 69 73 20 66 6c 61 67 67 65 64  match is flagged
a2a0: 20 61 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54   as an error.  T
a2b0: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
a2c0: 65 72 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e  errors is return
a2d0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
a2e0: 74 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  t matchOrderbyTo
a2f0: 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20  Column(.  Parse 
a300: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
a310: 20 20 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20    /* A place to 
a320: 6c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73  leave error mess
a330: 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ages */.  Select
a340: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
a350: 20 20 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65    /* Match to re
a360: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  sult columns of 
a370: 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20  this SELECT */. 
a380: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
a390: 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rBy,     /* The 
a3a0: 4f 52 44 45 52 20 42 59 20 76 61 6c 75 65 73 20  ORDER BY values 
a3b0: 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74  to match against
a3c0: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
a3d0: 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
a3e0: 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
a3f0: 74 68 69 73 20 76 61 6c 75 65 20 69 6e 20 69 54  this value in iT
a400: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75  able */.  int mu
a410: 73 74 43 6f 6d 70 6c 65 74 65 20 20 20 20 20 20  stComplete      
a420: 20 20 2f 2a 20 49 66 20 54 52 55 45 20 61 6c 6c    /* If TRUE all
a430: 20 4f 52 44 45 52 20 42 59 73 20 6d 75 73 74 20   ORDER BYs must 
a440: 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e  match */.){.  in
a450: 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e  t nErr = 0;.  in
a460: 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69  t i, j;.  ExprLi
a470: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69  st *pEList;..  i
a480: 66 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c  f( pSelect==0 ||
a490: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72   pOrderBy==0 ) r
a4a0: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d  eturn 1;.  if( m
a4b0: 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20  ustComplete ){. 
a4c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
a4d0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
a4e0: 2b 2b 29 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61  ++){ pOrderBy->a
a4f0: 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a  [i].done = 0; }.
a500: 20 20 7d 0a 20 20 69 66 28 20 70 72 65 70 53 65    }.  if( prepSe
a510: 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c  lectStmt(pParse,
a520: 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20   pSelect) ){.   
a530: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
a540: 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 50   if( pSelect->pP
a550: 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20  rior ){.    if( 
a560: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
a570: 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 53 65  lumn(pParse, pSe
a580: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f  lect->pPrior, pO
a590: 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20  rderBy, iTable, 
a5a0: 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  0) ){.      retu
a5b0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
a5c0: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
a5d0: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f  ct->pEList;.  fo
a5e0: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
a5f0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
a600: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
a610: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
a620: 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  xpr;.    int iCo
a630: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  l = -1;.    if( 
a640: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
a650: 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  one ) continue;.
a660: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
a670: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
a680: 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20   &iCol) ){.     
a690: 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20   if( iCol<=0 || 
a6a0: 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  iCol>pEList->nEx
a6b0: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
a6c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
a6d0: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
a6e0: 22 4f 52 44 45 52 20 42 59 20 70 6f 73 69 74 69  "ORDER BY positi
a6f0: 6f 6e 20 25 64 20 73 68 6f 75 6c 64 20 62 65 20  on %d should be 
a700: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64  between 1 and %d
a710: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  ",.          iCo
a720: 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l, pEList->nExpr
a730: 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b  );.        nErr+
a740: 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  +;.        break
a750: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a760: 69 66 28 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74  if( !mustComplet
a770: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
a780: 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20      iCol--;.    
a790: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69  }.    for(j=0; i
a7a0: 43 6f 6c 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73  Col<0 && j<pELis
a7b0: 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  t->nExpr; j++){.
a7c0: 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74        if( pEList
a7d0: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20  ->a[j].zName && 
a7e0: 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c  (pE->op==TK_ID |
a7f0: 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  | pE->op==TK_STR
a800: 49 4e 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ING) ){.        
a810: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c  char *zName, *zL
a820: 61 62 65 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e  abel;.        zN
a830: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
a840: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
a850: 20 20 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74    zLabel = sqlit
a860: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
a870: 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  &pE->token);.   
a880: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4c 61       assert( zLa
a890: 62 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  bel!=0 );.      
a8a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
a8b0: 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62  ICmp(zName, zLab
a8c0: 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20  el)==0 ){ .     
a8d0: 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20       iCol = j;. 
a8e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a8f0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 61 62   sqliteFree(zLab
a900: 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  el);.      }.   
a910: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26     if( iCol<0 &&
a920: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
a930: 61 72 65 28 70 45 2c 20 70 45 4c 69 73 74 2d 3e  are(pE, pEList->
a940: 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[j].pExpr) ){. 
a950: 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b         iCol = j;
a960: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a970: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29     if( iCol>=0 )
a980: 7b 0a 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d  {.      pE->op =
a990: 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
a9a0: 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20    pE->iColumn = 
a9b0: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d 3e  iCol;.      pE->
a9c0: 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b  iTable = iTable;
a9d0: 0a 20 20 20 20 20 20 70 45 2d 3e 69 41 67 67 20  .      pE->iAgg 
a9e0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 4f 72 64  = -1;.      pOrd
a9f0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
aa00: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
aa10: 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 6d 75 73  f( iCol<0 && mus
aa20: 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20  tComplete ){.   
aa30: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
aa40: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
aa50: 20 20 20 22 4f 52 44 45 52 20 42 59 20 74 65 72     "ORDER BY ter
aa60: 6d 20 6e 75 6d 62 65 72 20 25 64 20 64 6f 65 73  m number %d does
aa70: 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 72   not match any r
aa80: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20 69  esult column", i
aa90: 2b 31 29 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b  +1);.      nErr+
aaa0: 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  +;.      break;.
aab0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
aac0: 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e  rn nErr;  .}.#en
aad0: 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
aae0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
aaf0: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f  UND_SELECT */../
ab00: 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20  *.** Get a VDBE 
ab10: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
ab20: 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43  rser context.  C
ab30: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
ab40: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
ab50: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
ab60: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
ab70: 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73   and leave a mes
ab80: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
ab90: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33  */.Vdbe *sqlite3
aba0: 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70  GetVdbe(Parse *p
abb0: 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
abc0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
abd0: 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  e;.  if( v==0 ){
abe0: 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d  .    v = pParse-
abf0: 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33  >pVdbe = sqlite3
ac00: 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73  VdbeCreate(pPars
ac10: 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65  e->db);.  }.  re
ac20: 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn v;.}../*.**
ac30: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69   Compute the iLi
ac40: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
ac50: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45  fields of the SE
ac60: 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68  LECT based on th
ac70: 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20  e.** pLimit and 
ac80: 70 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69  pOffset expressi
ac90: 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64  ons.  pLimit and
aca0: 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68   pOffset hold th
acb0: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  e expressions.**
acc0: 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
acd0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
ace0: 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72   statement after
acf0: 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
ad00: 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64  FFSET.** keyword
ad10: 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74  s.  Or NULL if t
ad20: 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72  hose keywords ar
ad30: 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69  e omitted. iLimi
ad40: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a  t and iOffset .*
ad50: 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65  * are the intege
ad60: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
ad70: 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f  r numbers for co
ad80: 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63  unters used to c
ad90: 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c  ompute .** the l
ada0: 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e  imit and offset.
adb0: 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
adc0: 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66   limit and/or of
add0: 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69  fset, then .** i
ade0: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
adf0: 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a  t are negative..
ae00: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
ae10: 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76  ne changes the v
ae20: 61 6c 75 65 73 20 69 66 20 69 4c 69 6d 69 74 20  alues if iLimit 
ae30: 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79  and iOffset only
ae40: 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f   if.** a limit o
ae50: 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69  r offset is defi
ae60: 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e  ned by pLimit an
ae70: 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d  d pOffset.  iLim
ae80: 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65  it and.** iOffse
ae90: 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  t should have be
aea0: 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70  en preset to app
aeb0: 72 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74  ropriate default
aec0: 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61   values.** (usua
aed0: 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61  lly but not alwa
aee0: 79 73 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20  ys -1) prior to 
aef0: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
af00: 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66  tine..** Only if
af10: 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f   pLimit!=0 or pO
af20: 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20  ffset!=0 do the 
af30: 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
af40: 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64  get.** redefined
af50: 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  .  The UNION ALL
af60: 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74   operator uses t
af70: 68 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20  his property to 
af80: 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75  force.** the reu
af90: 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c  se of the same l
afa0: 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20  imit and offset 
afb0: 72 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73  registers across
afc0: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c   multiple.** SEL
afd0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
afe0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
aff0: 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
b000: 74 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  ters(Parse *pPar
b010: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
b020: 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 2f 2a  nt iBreak){.  /*
b030: 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31   .  ** "LIMIT -1
b040: 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61  " always shows a
b050: 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20  ll rows.  There 
b060: 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e  is some.  ** con
b070: 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20 77  traversy about w
b080: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
b090: 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20  behavior should 
b0a0: 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72  be..  ** The cur
b0b0: 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
b0c0: 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22  ion interprets "
b0d0: 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e  LIMIT 0" to mean
b0e0: 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20  .  ** no rows.. 
b0f0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   */.  if( p->pLi
b100: 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  mit ){.    int i
b110: 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
b120: 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62 65 20 2a  em++;.    Vdbe *
b130: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
b140: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
b150: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
b160: 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  n;.    sqlite3Ex
b170: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
b180: 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73  ->pLimit);.    s
b190: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b1a0: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
b1b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
b1c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b1d0: 4f 50 5f 4e 65 67 61 74 69 76 65 2c 20 30 2c 20  OP_Negative, 0, 
b1e0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
b1f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
b200: 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 31  emStore, iMem, 1
b210: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
b220: 6e 74 28 28 76 2c 20 22 23 20 4c 49 4d 49 54 20  nt((v, "# LIMIT 
b230: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
b240: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b250: 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f  (v, OP_IfMemZero
b260: 2c 20 69 4d 65 6d 2c 20 69 42 72 65 61 6b 29 3b  , iMem, iBreak);
b270: 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  .    p->iLimit =
b280: 20 69 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28   iMem;.  }.  if(
b290: 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20   p->pOffset ){. 
b2a0: 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50     int iMem = pP
b2b0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
b2c0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
b2d0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
b2e0: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
b2f0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73   ) return;.    s
b300: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
b310: 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65  Parse, p->pOffse
b320: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
b330: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
b340: 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b  ustBeInt, 0, 0);
b350: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b360: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 67 61  AddOp(v, OP_Nega
b370: 74 69 76 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tive, 0, 0);.   
b380: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b390: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
b3a0: 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20  , iMem, 1);.    
b3b0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
b3c0: 22 23 20 4f 46 46 53 45 54 20 63 6f 75 6e 74 65  "# OFFSET counte
b3d0: 72 22 29 29 3b 0a 20 20 20 20 70 2d 3e 69 4f 66  r"));.    p->iOf
b3e0: 66 73 65 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d  fset = iMem;.  }
b3f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
b400: 74 65 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64  te a virtual ind
b410: 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 73 6f  ex to use for so
b420: 72 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rting..*/.static
b430: 20 76 6f 69 64 20 63 72 65 61 74 65 53 6f 72 74   void createSort
b440: 69 6e 67 49 6e 64 65 78 28 50 61 72 73 65 20 2a  ingIndex(Parse *
b450: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
b460: 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  p, ExprList *pOr
b470: 64 65 72 42 79 29 7b 0a 20 20 69 66 28 20 70 4f  derBy){.  if( pO
b480: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e  rderBy ){.    in
b490: 74 20 61 64 64 72 3b 0a 20 20 20 20 61 73 73 65  t addr;.    asse
b4a0: 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  rt( pOrderBy->iE
b4b0: 43 75 72 73 6f 72 3d 3d 30 20 29 3b 0a 20 20 20  Cursor==0 );.   
b4c0: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
b4d0: 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
b4e0: 61 62 2b 2b 3b 0a 20 20 20 20 61 64 64 72 20 3d  ab++;.    addr =
b4f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b500: 70 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  p(pParse->pVdbe,
b510: 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c   OP_OpenVirtual,
b520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b530: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72               pOr
b540: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
b550: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
b560: 2b 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  +1);.    assert(
b570: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74   p->addrOpenVirt
b580: 5b 32 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [2] == -1 );.   
b590: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74   p->addrOpenVirt
b5a0: 5b 32 5d 20 3d 20 61 64 64 72 3b 0a 20 20 7d 0a  [2] = addr;.  }.
b5b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6f 70 63  }../*.** The opc
b5c0: 6f 64 65 20 61 74 20 61 64 64 72 20 69 73 20 61  ode at addr is a
b5d0: 6e 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c  n OP_OpenVirtual
b5e0: 20 74 68 61 74 20 63 72 65 61 74 65 64 20 61 20   that created a 
b5f0: 73 6f 72 74 69 6e 67 0a 2a 2a 20 69 6e 64 65 78  sorting.** index
b600: 20 74 68 61 20 77 65 20 65 6e 64 65 64 20 75 70   tha we ended up
b610: 20 6e 6f 74 20 6e 65 65 64 69 6e 67 2e 20 20 54   not needing.  T
b620: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e  his routine chan
b630: 67 65 73 20 74 68 61 74 0a 2a 2a 20 6f 70 63 6f  ges that.** opco
b640: 64 65 20 74 6f 20 4f 50 5f 4e 6f 6f 70 2e 0a 2a  de to OP_Noop..*
b650: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
b660: 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64  createSortingInd
b670: 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
b680: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 56  , int addr){.  V
b690: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
b6a0: 3e 70 56 64 62 65 3b 0a 20 20 56 64 62 65 4f 70  >pVdbe;.  VdbeOp
b6b0: 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56   *pOp = sqlite3V
b6c0: 64 62 65 47 65 74 4f 70 28 76 2c 20 61 64 64 72  dbeGetOp(v, addr
b6d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
b6e0: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
b6f0: 2c 20 30 2c 20 30 29 3b 0a 20 20 70 4f 70 2d 3e  , 0, 0);.  pOp->
b700: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
b710: 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 30 3b  ;.  pOp->p1 = 0;
b720: 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 30 3b 0a  .  pOp->p2 = 0;.
b730: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
b740: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
b750: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74  SELECT./*.** Ret
b760: 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
b770: 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ate collating se
b780: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69  quence for the i
b790: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
b7a0: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
b7b0: 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  et for the compo
b7c0: 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65  und-select state
b7d0: 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72  ment "p".  Retur
b7e0: 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65  n NULL if.** the
b7f0: 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64   column has no d
b800: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
b810: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a   sequence..**.**
b820: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
b830: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
b840: 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
b850: 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  is taken from th
b860: 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74  e.** left-most t
b870: 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63  erm of the selec
b880: 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c  t that has a col
b890: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
b8a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
b8b0: 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43  eq *multiSelectC
b8c0: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
b8d0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
b8e0: 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f   int iCol){.  Co
b8f0: 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69  llSeq *pRet;.  i
b900: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
b910: 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69      pRet = multi
b920: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
b930: 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  arse, p->pPrior,
b940: 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b   iCol);.  }else{
b950: 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
b960: 20 7d 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30   }.  if( pRet==0
b970: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73   ){.    pRet = s
b980: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
b990: 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  q(pParse, p->pEL
b9a0: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
b9b0: 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  pr);.  }.  retur
b9c0: 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66  n pRet;.}.#endif
b9d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
b9e0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
b9f0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
ba00: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
ba10: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68  _SELECT./*.** Th
ba20: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
ba30: 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  lled to process 
ba40: 61 20 71 75 65 72 79 20 74 68 61 74 20 69 73 20  a query that is 
ba50: 72 65 61 6c 6c 79 20 74 68 65 20 75 6e 69 6f 6e  really the union
ba60: 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65 63 74  .** or intersect
ba70: 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  ion of two or mo
ba80: 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72  re separate quer
ba90: 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70  ies..**.** "p" p
baa0: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67  oints to the rig
bab0: 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74  ht-most of the t
bac0: 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65  wo queries.  the
bad0: 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a   query on the.**
bae0: 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69   left is p->pPri
baf0: 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75  or.  The left qu
bb00: 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62  ery could also b
bb10: 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  e a compound que
bb20: 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63  ry.** in which c
bb30: 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
bb40: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
bb50: 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a  recursively. .**
bb60: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
bb70: 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65  of the total que
bb80: 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69  ry are to be wri
bb90: 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74  tten into a dest
bba0: 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79  ination.** of ty
bbb0: 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61  pe eDest with pa
bbc0: 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a  rameter iParm..*
bbd0: 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20  *.** Example 1: 
bbe0: 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65   Consider a thre
bbf0: 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53  e-way compound S
bc00: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
bc10: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
bc20: 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53   FROM t1 UNION S
bc30: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20  ELECT b FROM t2 
bc40: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46  UNION SELECT c F
bc50: 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69  ROM t3.**.** Thi
bc60: 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  s statement is p
bc70: 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c  arsed up as foll
bc80: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ows:.**.**     S
bc90: 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
bca0: 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20  **      |.**    
bcb0: 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43    `----->  SELEC
bcc0: 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20  T b FROM t2.**  
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
bce0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
bcf0: 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45    `------>  SELE
bd00: 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a  CT a FROM t1.**.
bd10: 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e  ** The arrows in
bd20: 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f   the diagram abo
bd30: 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  ve represent the
bd40: 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70   Select.pPrior p
bd50: 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66  ointer..** So if
bd60: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
bd70: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65   called with p e
bd80: 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71  qual to the t3 q
bd90: 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50  uery, then.** pP
bda0: 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65  rior will be the
bdb0: 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f   t2 query.  p->o
bdc0: 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49  p will be TK_UNI
bdd0: 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ON in this case.
bde0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68  .**.** Notice th
bdf0: 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  at because of th
be00: 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72  e way SQLite par
be10: 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ses compound SEL
be20: 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64  ECTs, the.** ind
be30: 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20  ividual selects 
be40: 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f  always group fro
be50: 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  m left to right.
be60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
be70: 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61  ultiSelect(.  Pa
be80: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
be90: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
bea0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
beb0: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
bec0: 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
bed0: 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
bee0: 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
bef0: 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20  int eDest,      
bf00: 20 20 20 20 20 20 2f 2a 20 5c 5f 5f 5f 20 20 53        /* \___  S
bf10: 74 6f 72 65 20 71 75 65 72 79 20 72 65 73 75 6c  tore query resul
bf20: 74 73 20 61 73 20 73 70 65 63 69 66 69 65 64 20  ts as specified 
bf30: 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20  */.  int iParm, 
bf40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2f 20             /* / 
bf50: 20 20 20 20 62 79 20 74 68 65 73 65 20 74 77 6f      by these two
bf60: 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 20 20   parameters.    
bf70: 20 20 20 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a       */.  char *
bf80: 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20  aff             
bf90: 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73 20 53  /* If eDest is S
bfa0: 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66  RT_Union, the af
bfb0: 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f  finity string */
bfc0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
bfd0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53  QLITE_OK;   /* S
bfe0: 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d  uccess code from
bff0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
c000: 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
c010: 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
c020: 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
c030: 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
c040: 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c060: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
c070: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
c080: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
c090: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c0a0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
c0b0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
c0c0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
c0d0: 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20  derBy;   /* The 
c0e0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
c0f0: 6f 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20 61 53  on p */.  int aS
c100: 65 74 50 32 5b 32 5d 3b 20 20 20 20 20 20 20 20  etP2[2];        
c110: 2f 2a 20 53 65 74 20 50 32 20 76 61 6c 75 65 20  /* Set P2 value 
c120: 6f 66 20 74 68 65 73 65 20 6f 70 20 74 6f 20 6e  of these op to n
c130: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
c140: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 74 50 32   */.  int nSetP2
c150: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
c160: 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 69  umber of slots i
c170: 6e 20 61 53 65 74 50 32 5b 5d 20 75 73 65 64 20  n aSetP2[] used 
c180: 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  */..  /* Make su
c190: 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  re there is no O
c1a0: 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
c1b0: 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72   clause on prior
c1c0: 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a   SELECTs.  Only.
c1d0: 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72    ** the last (r
c1e0: 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43  ight-most) SELEC
c1f0: 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20  T in the series 
c200: 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45  may have an ORDE
c210: 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20  R BY or LIMIT.. 
c220: 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c   */.  if( p==0 |
c230: 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  | p->pPrior==0 )
c240: 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
c250: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
c260: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70  ect_end;.  }.  p
c270: 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
c280: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  r;.  assert( pPr
c290: 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21  ior->pRightmost!
c2a0: 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73 73  =pPrior );.  ass
c2b0: 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69  ert( pPrior->pRi
c2c0: 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69 67  ghtmost==p->pRig
c2d0: 68 74 6d 6f 73 74 20 29 3b 0a 20 20 69 66 28 20  htmost );.  if( 
c2e0: 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
c2f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
c300: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
c310: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
c320: 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
c330: 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22  r %s not before"
c340: 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
c350: 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
c360: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
c370: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
c380: 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  end;.  }.  if( p
c390: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b  Prior->pLimit ){
c3a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
c3b0: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d  rMsg(pParse,"LIM
c3c0: 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  IT clause should
c3d0: 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
c3e0: 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
c3f0: 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
c400: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
c410: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
c420: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
c430: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
c440: 72 65 20 77 65 20 68 61 76 65 20 61 20 76 61 6c  re we have a val
c450: 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e 65 2e  id query engine.
c460: 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74 65    If not, create
c470: 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f   a new one..  */
c480: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
c490: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
c4a0: 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
c4b0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
c4c0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
c4d0: 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72  nd;.  }..  /* Cr
c4e0: 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61  eate the destina
c4f0: 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  tion temporary t
c500: 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72  able if necessar
c510: 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  y.  */.  if( eDe
c520: 73 74 3d 3d 53 52 54 5f 56 69 72 74 75 61 6c 54  st==SRT_VirtualT
c530: 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
c540: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
c550: 20 20 20 61 73 73 65 72 74 28 20 6e 53 65 74 50     assert( nSetP
c560: 32 3c 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29  2<sizeof(aSetP2)
c570: 2f 73 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30  /sizeof(aSetP2[0
c580: 5d 29 20 29 3b 0a 20 20 20 20 61 53 65 74 50 32  ]) );.    aSetP2
c590: 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d 20 73 71 6c  [nSetP2++] = sql
c5a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c5b0: 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c   OP_OpenVirtual,
c5c0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
c5d0: 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c  eDest = SRT_Tabl
c5e0: 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  e;.  }..  /* Gen
c5f0: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
c600: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
c610: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
c620: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 64  nts..  */.  pOrd
c630: 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
c640: 42 79 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d  By;.  switch( p-
c650: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
c660: 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  TK_ALL: {.      
c670: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
c680: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
c690: 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ddr = 0;.       
c6a0: 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72   assert( !pPrior
c6b0: 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20  ->pLimit );.    
c6c0: 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d      pPrior->pLim
c6d0: 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
c6e0: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e          pPrior->
c6f0: 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
c700: 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 72 63  fset;.        rc
c710: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
c720: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
c730: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30   eDest, iParm, 0
c740: 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
c750: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
c760: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
c770: 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
c780: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
c790: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
c7a0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
c7b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c7c0: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
c7d0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  .        p->iLim
c7e0: 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69  it = pPrior->iLi
c7f0: 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  mit;.        p->
c800: 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72  iOffset = pPrior
c810: 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
c820: 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74     if( p->iLimit
c830: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
c840: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
c850: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
c860: 66 4d 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  fMemZero, p->iLi
c870: 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  mit, 0);.       
c880: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
c890: 76 2c 20 22 23 20 4a 75 6d 70 20 61 68 65 61 64  v, "# Jump ahead
c8a0: 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65   if LIMIT reache
c8b0: 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  d"));.        }.
c8c0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
c8d0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
c8e0: 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61  e, p, eDest, iPa
c8f0: 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  rm, 0, 0, 0, aff
c900: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50  );.        p->pP
c910: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
c920: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
c930: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
c940: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
c950: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c960: 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a      if( addr ){.
c970: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c980: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
c990: 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20   addr);.        
c9a0: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
c9b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
c9c0: 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20  * For UNION ALL 
c9d0: 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61 6c  ... ORDER BY fal
c9e0: 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
c9f0: 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20   next case */.  
ca00: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
ca10: 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65  EXCEPT:.    case
ca20: 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20   TK_UNION: {.   
ca30: 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b     int unionTab;
ca40: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
ca50: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70  mber of the temp
ca60: 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64  orary table hold
ca70: 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  ing result */.  
ca80: 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 20      int op = 0; 
ca90: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
caa0: 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
cab0: 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73  ns to apply to s
cac0: 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  elf */.      int
cad0: 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a   priorOp;     /*
cae0: 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   The SRT_ operat
caf0: 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ion to apply to 
cb00: 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f  prior selects */
cb10: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69  .      Expr *pLi
cb20: 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f  mit, *pOffset; /
cb30: 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f  * Saved values o
cb40: 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20  f p->nLimit and 
cb50: 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20  p->nOffset */.  
cb60: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20      int addr;.. 
cb70: 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 70       priorOp = p
cb80: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53  ->op==TK_ALL ? S
cb90: 52 54 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f 55  RT_Table : SRT_U
cba0: 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  nion;.      if( 
cbb0: 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26  eDest==priorOp &
cbc0: 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  & pOrderBy==0 &&
cbd0: 20 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 20 21   !p->pLimit && !
cbe0: 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
cbf0: 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20        /* We can 
cc00: 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72  reuse a temporar
cc10: 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  y table generate
cc20: 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f  d by a SELECT to
cc30: 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   our.        ** 
cc40: 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a  right..        *
cc50: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
cc60: 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20  ab = iParm;.    
cc70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cc80: 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64   /* We will need
cc90: 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f   to create our o
cca0: 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wn temporary tab
ccb0: 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20  le to hold the. 
ccc0: 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d         ** interm
ccd0: 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a  ediate results..
cce0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
ccf0: 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50     unionTab = pP
cd00: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
cd10: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
cd20: 42 79 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72  By && matchOrder
cd30: 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  byToColumn(pPars
cd40: 65 2c 20 70 2c 20 70 4f 72 64 65 72 42 79 2c 20  e, p, pOrderBy, 
cd50: 75 6e 69 6f 6e 54 61 62 2c 31 29 20 29 7b 0a 20  unionTab,1) ){. 
cd60: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
cd70: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
cd80: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
cd90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
cda0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
cdb0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
cdc0: 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 75  P_OpenVirtual, u
cdd0: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
cde0: 20 20 20 20 20 69 66 28 20 70 72 69 6f 72 4f 70       if( priorOp
cdf0: 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20  ==SRT_Table ){. 
ce00: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
ce10: 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66 28 61   nSetP2<sizeof(a
ce20: 53 65 74 50 32 29 2f 73 69 7a 65 6f 66 28 61 53  SetP2)/sizeof(aS
ce30: 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20 20 20  etP2[0]) );.    
ce40: 20 20 20 20 20 20 61 53 65 74 50 32 5b 6e 53 65        aSetP2[nSe
ce50: 74 50 32 2b 2b 5d 20 3d 20 61 64 64 72 3b 0a 20  tP2++] = addr;. 
ce60: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ce70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ce80: 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b  p->addrOpenVirt[
ce90: 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
cea0: 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
ceb0: 6e 56 69 72 74 5b 30 5d 20 3d 20 61 64 64 72 3b  nVirt[0] = addr;
cec0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 52  .          p->pR
ced0: 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 56 69  ightmost->usesVi
cee0: 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rt = 1;.        
cef0: 7d 0a 20 20 20 20 20 20 20 20 63 72 65 61 74 65  }.        create
cf00: 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61  SortingIndex(pPa
cf10: 72 73 65 2c 20 70 2c 20 70 4f 72 64 65 72 42 79  rse, p, pOrderBy
cf20: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
cf30: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
cf40: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
cf50: 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
cf60: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
cf70: 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a  our left.      *
cf80: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
cf90: 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42  !pPrior->pOrderB
cfa0: 79 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  y );.      rc = 
cfb0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
cfc0: 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 72  arse, pPrior, pr
cfd0: 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c  iorOp, unionTab,
cfe0: 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a   0, 0, 0, aff);.
cff0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
d000: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
d010: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
d020: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
d030: 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
d040: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
d050: 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  nt.      */.    
d060: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
d070: 29 7b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65  ){.         case
d080: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70 20   TK_EXCEPT:  op 
d090: 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 20 20 20  = SRT_Except;   
d0a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
d0b0: 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20  case TK_UNION:  
d0c0: 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b   op = SRT_Union;
d0d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d0e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
d0f0: 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 54 61       op = SRT_Ta
d100: 62 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  ble;    break;. 
d110: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
d120: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
d130: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
d140: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 73 61  0;.      p->disa
d150: 6c 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 70 4f  llowOrderBy = pO
d160: 72 64 65 72 42 79 21 3d 30 3b 0a 20 20 20 20 20  rderBy!=0;.     
d170: 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
d180: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  mit;.      p->pL
d190: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
d1a0: 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
d1b0: 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  fset;.      p->p
d1c0: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
d1d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
d1e0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
d1f0: 6f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c  op, unionTab, 0,
d200: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
d210: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
d220: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
d230: 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
d240: 72 42 79 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rBy;.      sqlit
d250: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  e3ExprDelete(p->
d260: 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
d270: 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
d280: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
d290: 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
d2a0: 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
d2b0: 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f   -1;.      p->iO
d2c0: 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20 20 20  ffset = -1;.    
d2d0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
d2e0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
d2f0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
d300: 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   }...      /* Co
d310: 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69  nvert the data i
d320: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
d330: 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65  table into whate
d340: 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a  ver form.      *
d350: 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20  * it is that we 
d360: 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a  currently need..
d370: 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20        */      . 
d380: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 21 3d       if( eDest!=
d390: 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e  priorOp || union
d3a0: 54 61 62 21 3d 69 50 61 72 6d 20 29 7b 0a 20 20  Tab!=iParm ){.  
d3b0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
d3c0: 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
d3d0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d3e0: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
d3f0: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
d400: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
d410: 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72  .          gener
d420: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
d430: 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c  Parse, 0, p->pEL
d440: 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ist);.        }.
d450: 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d          iBreak =
d460: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
d470: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
d480: 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
d490: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
d4a0: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  );.        compu
d4b0: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
d4c0: 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
d4d0: 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
d4e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d4f0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f   OP_Rewind, unio
d500: 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20  nTab, iBreak);. 
d510: 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
d520: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
d530: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
d540: 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e     rc = selectIn
d550: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
d560: 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e  p, p->pEList, un
d570: 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73  ionTab, p->pELis
d580: 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  t->nExpr,.      
d590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5a0: 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2c         pOrderBy,
d5b0: 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72   -1, eDest, iPar
d5c0: 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  m, .            
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5e0: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
d5f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
d600: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
d610: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
d620: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
d630: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
d640: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
d650: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
d660: 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
d670: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d680: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
d690: 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74  t, unionTab, iSt
d6a0: 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  art);.        sq
d6b0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
d6c0: 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
d6d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d6e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d6f0: 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62  _Close, unionTab
d700: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
d710: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
d720: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
d730: 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  ERSECT: {.      
d740: 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a  int tab1, tab2;.
d750: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
d760: 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
d770: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69  .      Expr *pLi
d780: 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20  mit, *pOffset;. 
d790: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a       int addr;..
d7a0: 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45        /* INTERSE
d7b0: 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  CT is different 
d7c0: 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20  from the others 
d7d0: 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65  since it require
d7e0: 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74  s.      ** two t
d7f0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
d800: 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69    Hence it has i
d810: 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65  ts own case.  Be
d820: 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  gin.      ** by 
d830: 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74  allocating the t
d840: 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65  ables we will ne
d850: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
d860: 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65     tab1 = pParse
d870: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
d880: 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab2 = pParse->n
d890: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Tab++;.      if(
d8a0: 20 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61 74   pOrderBy && mat
d8b0: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
d8c0: 6e 28 70 50 61 72 73 65 2c 70 2c 70 4f 72 64 65  n(pParse,p,pOrde
d8d0: 72 42 79 2c 74 61 62 31 2c 31 29 20 29 7b 0a 20  rBy,tab1,1) ){. 
d8e0: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
d8f0: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
d900: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
d910: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 72 65 61      }.      crea
d920: 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70  teSortingIndex(p
d930: 50 61 72 73 65 2c 20 70 2c 20 70 4f 72 64 65 72  Parse, p, pOrder
d940: 42 79 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72  By);..      addr
d950: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
d960: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69  dOp(v, OP_OpenVi
d970: 72 74 75 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b  rtual, tab1, 0);
d980: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d990: 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 30  ->addrOpenVirt[0
d9a0: 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
d9b0: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74   p->addrOpenVirt
d9c0: 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [0] = addr;.    
d9d0: 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d    p->pRightmost-
d9e0: 3e 75 73 65 73 56 69 72 74 20 3d 20 31 3b 0a 20  >usesVirt = 1;. 
d9f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
da00: 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20  pEList );..     
da10: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
da20: 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ECTs to our left
da30: 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
da40: 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20  table "tab1"..  
da50: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
da60: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
da70: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
da80: 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 2c  SRT_Union, tab1,
da90: 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a   0, 0, 0, aff);.
daa0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
dab0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
dac0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
dad0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
dae0: 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
daf0: 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65  t SELECT into te
db00: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
db10: 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ab2".      */.  
db20: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
db30: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
db40: 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 74  P_OpenVirtual, t
db50: 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab2, 0);.      a
db60: 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
db70: 65 6e 56 69 72 74 5b 31 5d 20 3d 3d 20 2d 31 20  enVirt[1] == -1 
db80: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
db90: 4f 70 65 6e 56 69 72 74 5b 31 5d 20 3d 20 61 64  OpenVirt[1] = ad
dba0: 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  dr;.      p->pPr
dbb0: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
dbc0: 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
dbd0: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
dbe0: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
dbf0: 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
dc00: 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
dc10: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
dc20: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
dc30: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 53 52  ct(pParse, p, SR
dc40: 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 2c 20 30  T_Union, tab2, 0
dc50: 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
dc60: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
dc70: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 73 71  pPrior;.      sq
dc80: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
dc90: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
dca0: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
dcb0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
dcc0: 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
dcd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
dce0: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
dcf0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
dd00: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
dd10: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
dd20: 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74   to take the int
dd30: 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  ersection of the
dd40: 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20   two temporary. 
dd50: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a       ** tables..
dd60: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
dd70: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
dd80: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44   );.      if( eD
dd90: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
dda0: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e  k ){.        gen
ddb0: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
ddc0: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70  (pParse, 0, p->p
ddd0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  EList);.      }.
dde0: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
ddf0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
de00: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43  bel(v);.      iC
de10: 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
de20: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
de30: 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
de40: 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
de50: 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
de60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
de70: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
de80: 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b  nd, tab1, iBreak
de90: 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20  );.      iStart 
dea0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
deb0: 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c  Op(v, OP_RowKey,
dec0: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
ded0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dee0: 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  p(v, OP_NotFound
def0: 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 29 3b 0a  , tab2, iCont);.
df00: 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63        rc = selec
df10: 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
df20: 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
df30: 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74   tab1, p->pEList
df40: 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df60: 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2c 20        pOrderBy, 
df70: 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  -1, eDest, iParm
df80: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfa0: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30  iCont, iBreak, 0
dfb0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
dfc0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
dfd0: 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
dfe0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
dff0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e000: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
e010: 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
e020: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e030: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e040: 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61  Next, tab1, iSta
e050: 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
e060: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
e070: 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
e080: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e090: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
e0a0: 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  e, tab2, 0);.   
e0b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e0c0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
e0d0: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
e0e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e0f0: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
e100: 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e  e all SELECTs in
e110: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68   the statement h
e120: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
e130: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a  ber of elements.
e140: 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65    ** in their re
e150: 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a  sult sets..  */.
e160: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
e170: 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70  ist && pPrior->p
e180: 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70  EList );.  if( p
e190: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
e1a0: 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d  =pPrior->pEList-
e1b0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71  >nExpr ){.    sq
e1c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
e1d0: 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74  arse, "SELECTs t
e1e0: 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  o the left and r
e1f0: 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20  ight of %s".    
e200: 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20    " do not have 
e210: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
e220: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
e230: 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  s", selectOpName
e240: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
e250: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
e260: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
e270: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
e280: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
e290: 75 6d 6e 73 20 69 6e 20 74 65 6d 70 6f 72 61 72  umns in temporar
e2a0: 79 20 74 61 62 6c 65 73 0a 20 20 2a 2f 0a 20 20  y tables.  */.  
e2b0: 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
e2c0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 77 68 69 6c 65  ->nExpr;.  while
e2d0: 28 20 6e 53 65 74 50 32 20 29 7b 0a 20 20 20 20  ( nSetP2 ){.    
e2e0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
e2f0: 65 50 32 28 76 2c 20 61 53 65 74 50 32 5b 2d 2d  eP2(v, aSetP2[--
e300: 6e 53 65 74 50 32 5d 2c 20 6e 43 6f 6c 29 3b 0a  nSetP2], nCol);.
e310: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
e320: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
e330: 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 65 69  ences used by ei
e340: 74 68 65 72 20 74 68 65 20 4f 52 44 45 52 20 42  ther the ORDER B
e350: 59 20 63 6c 61 75 73 65 20 6f 72 0a 20 20 2a 2a  Y clause or.  **
e360: 20 62 79 20 61 6e 79 20 74 65 6d 70 6f 72 61 72   by any temporar
e370: 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20  y tables needed 
e380: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
e390: 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
e3a0: 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68  ..  ** Attach th
e3b0: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
e3c0: 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f  ure to all tempo
e3d0: 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 49 6e  rary tables.  In
e3e0: 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 4f 52  voke the.  ** OR
e3f0: 44 45 52 20 42 59 20 70 72 6f 63 65 73 73 69 6e  DER BY processin
e400: 67 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  g if there is an
e410: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
e420: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
e430: 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20   section is run 
e440: 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  by the right-mos
e450: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
e460: 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45  nt only..  ** SE
e470: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
e480: 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61  to the left alwa
e490: 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  ys skip this par
e4a0: 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  t.  The right-mo
e4b0: 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d  st.  ** SELECT m
e4c0: 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74  ight also skip t
e4d0: 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68  his part if it h
e4e0: 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  as no ORDER BY c
e4f0: 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e  lause and.  ** n
e500: 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72  o temp tables ar
e510: 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  e required..  */
e520: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
e530: 7c 7c 20 70 2d 3e 75 73 65 73 56 69 72 74 20 29  || p->usesVirt )
e540: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  {.    int i;    
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e560: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
e570: 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e  ter */.    KeyIn
e580: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20  fo *pKeyInfo;   
e590: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
e5a0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
e5b0: 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  or the result se
e5c0: 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20  t */.    Select 
e5d0: 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
e5e0: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
e5f0: 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45  oping through SE
e600: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
e610: 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  */.    CollSeq *
e620: 2a 61 70 43 6f 6c 6c 3b 0a 20 20 20 20 43 6f 6c  *apColl;.    Col
e630: 6c 53 65 71 20 2a 2a 61 43 6f 70 79 3b 0a 0a 20  lSeq **aCopy;.. 
e640: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
e650: 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20  ightmost==p );. 
e660: 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
e670: 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f  liteMalloc(sizeo
e680: 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f  f(*pKeyInfo)+nCo
e690: 6c 2a 32 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  l*2*sizeof(CollS
e6a0: 65 71 2a 29 20 2b 20 6e 43 6f 6c 29 3b 0a 20 20  eq*) + nCol);.  
e6b0: 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20    if( !pKeyInfo 
e6c0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
e6d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
e6e0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
e6f0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a  ect_end;.    }..
e700: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e      pKeyInfo->en
e710: 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  c = pParse->db->
e720: 65 6e 63 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  enc;.    pKeyInf
e730: 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c  o->nField = nCol
e740: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  ;..    for(i=0, 
e750: 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d  apColl=pKeyInfo-
e760: 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  >aColl; i<nCol; 
e770: 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a  i++, apColl++){.
e780: 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
e790: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
e7a0: 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
e7b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a  ;.      if( 0==*
e7c0: 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  apColl ){.      
e7d0: 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 50 61 72    *apColl = pPar
e7e0: 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
e7f0: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
e800: 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ..    for(pLoop=
e810: 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  p; pLoop; pLoop=
e820: 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  pLoop->pPrior){.
e830: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
e840: 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
e850: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f    int addr = pLo
e860: 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74  op->addrOpenVirt
e870: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
e880: 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20   addr<0 ){.     
e890: 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69       /* If [0] i
e8a0: 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31  s unused then [1
e8b0: 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64  ] is also unused
e8c0: 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20  .  So we can.   
e8d0: 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
e8e0: 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73   safely abort as
e8f0: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72   soon as the fir
e900: 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69  st unused slot i
e910: 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  s found */.     
e920: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
e930: 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74  op->addrOpenVirt
e940: 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20  [1]<0 );.       
e950: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
e960: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
e970: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
e980: 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a  v, addr, nCol);.
e990: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e9a0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
e9b0: 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79  ddr, (char*)pKey
e9c0: 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  Info, P3_KEYINFO
e9d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
e9e0: 0a 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  ..    if( pOrder
e9f0: 42 79 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  By ){.      stru
ea00: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
ea10: 20 2a 70 4f 54 65 72 6d 20 3d 20 70 4f 72 64 65   *pOTerm = pOrde
ea20: 72 42 79 2d 3e 61 3b 0a 20 20 20 20 20 20 69 6e  rBy->a;.      in
ea30: 74 20 6e 4f 72 64 65 72 42 79 45 78 70 72 20 3d  t nOrderByExpr =
ea40: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
ea50: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
ea60: 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 53 6f 72  ;.      u8 *pSor
ea70: 74 4f 72 64 65 72 3b 0a 0a 20 20 20 20 20 20 61  tOrder;..      a
ea80: 43 6f 70 79 20 3d 20 28 43 6f 6c 6c 53 65 71 2a  Copy = (CollSeq*
ea90: 2a 29 26 70 4b 65 79 49 6e 66 6f 5b 31 5d 3b 0a  *)&pKeyInfo[1];.
eaa0: 20 20 20 20 20 20 70 53 6f 72 74 4f 72 64 65 72        pSortOrder
eab0: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f   = pKeyInfo->aSo
eac0: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
ead0: 61 43 6f 70 79 5b 6e 43 6f 6c 5d 3b 0a 20 20 20  aCopy[nCol];.   
eae0: 20 20 20 6d 65 6d 63 70 79 28 61 43 6f 70 79 2c     memcpy(aCopy,
eaf0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
eb00: 2c 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 43 6f  , nCol*sizeof(Co
eb10: 6c 6c 53 65 71 2a 29 29 3b 0a 20 20 20 20 20 20  llSeq*));.      
eb20: 61 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66  apColl = pKeyInf
eb30: 6f 2d 3e 61 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  o->aColl;.      
eb40: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
eb50: 72 42 79 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4f  rByExpr; i++, pO
eb60: 54 65 72 6d 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b  Term++, apColl++
eb70: 2c 20 70 53 6f 72 74 4f 72 64 65 72 2b 2b 29 7b  , pSortOrder++){
eb80: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
eb90: 45 78 70 72 20 3d 20 70 4f 54 65 72 6d 2d 3e 70  Expr = pOTerm->p
eba0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 63 68  Expr;.        ch
ebb0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4f 54 65  ar *zName = pOTe
ebc0: 72 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  rm->zName;.     
ebd0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
ebe0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
ebf0: 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
ec00: 6e 3c 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  n<nCol );.      
ec10: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
ec20: 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c           *apColl
ec30: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
ec40: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
ec50: 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20  zName, -1);.    
ec60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ec70: 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 61       *apColl = a
ec80: 43 6f 70 79 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  Copy[pExpr->iCol
ec90: 75 6d 6e 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  umn];.        }.
eca0: 20 20 20 20 20 20 20 20 2a 70 53 6f 72 74 4f 72          *pSortOr
ecb0: 64 65 72 20 3d 20 70 4f 54 65 72 6d 2d 3e 73 6f  der = pOTerm->so
ecc0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d  rtOrder;.      }
ecd0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
ece0: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20  ->pRightmost==p 
ecf0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
ed00: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74   p->addrOpenVirt
ed10: 5b 32 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  [2]>=0 );.      
ed20: 61 64 64 72 20 3d 20 70 2d 3e 61 64 64 72 4f 70  addr = p->addrOp
ed30: 65 6e 56 69 72 74 5b 32 5d 3b 0a 20 20 20 20 20  enVirt[2];.     
ed40: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
ed50: 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 70 2d  geP2(v, addr, p-
ed60: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 32  >pEList->nExpr+2
ed70: 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  );.      pKeyInf
ed80: 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 4f 72 64  o->nField = nOrd
ed90: 65 72 42 79 45 78 70 72 3b 0a 20 20 20 20 20 20  erByExpr;.      
eda0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
edb0: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP3(v, addr, (ch
edc0: 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33  ar*)pKeyInfo, P3
edd0: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
ede0: 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  );.      pKeyInf
edf0: 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 65 6e  o = 0;.      gen
ee00: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50  erateSortTail(pP
ee10: 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 2d 3e 70  arse, p, v, p->p
ee20: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44  EList->nExpr, eD
ee30: 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  est, iParm);.   
ee40: 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 46 72   }..    sqliteFr
ee50: 65 65 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  ee(pKeyInfo);.  
ee60: 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  }..multi_select_
ee70: 65 6e 64 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  end:.  return rc
ee80: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
ee90: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
eea0: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69  ND_SELECT */..#i
eeb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
eec0: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 53 63 61  T_VIEW./*.** Sca
eed0: 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78  n through the ex
eee0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
eef0: 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72   Replace every r
ef00: 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61  eference to.** a
ef10: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
ef20: 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77   number iTable w
ef30: 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
ef40: 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20  e iColumn-th.** 
ef50: 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e  entry in pEList.
ef60: 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66    (But leave ref
ef70: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52  erences to the R
ef80: 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20  OWID column .** 
ef90: 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a  unchanged.).**.*
efa0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
efb0: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c  s part of the fl
efc0: 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75  attening procedu
efd0: 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a  re.  A subquery.
efe0: 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20  ** whose result 
eff0: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
f000: 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73  y pEList appears
f010: 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65   as entry in the
f020: 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
f030: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68  of a SELECT such
f040: 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63   that the VDBE c
f050: 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
f060: 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63  o that.** FORM c
f070: 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69  lause entry is i
f080: 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  Table.  This rou
f090: 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65  tine make the ne
f0a0: 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e  cessary .** chan
f0b0: 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20  ges to pExpr so 
f0c0: 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64  that it refers d
f0d0: 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73  irectly to the s
f0e0: 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f  ource table.** o
f0f0: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72  f the subquery r
f100: 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74  ather the result
f110: 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71   set of the subq
f120: 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
f130: 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
f140: 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74  st(ExprList*,int
f150: 2c 45 78 70 72 4c 69 73 74 2a 29 3b 20 20 2f 2a  ,ExprList*);  /*
f160: 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20 2a 2f   Forward Decl */
f170: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
f180: 73 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20  stSelect(Select 
f190: 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
f1a0: 20 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64   *);  /* Forward
f1b0: 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69 63 20   Decl */.static 
f1c0: 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 28 45  void substExpr(E
f1d0: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
f1e0: 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74  iTable, ExprList
f1f0: 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 66 28   *pEList){.  if(
f200: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
f210: 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  rn;.  if( pExpr-
f220: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
f230: 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
f240: 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  =iTable ){.    i
f250: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
f260: 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  n<0 ){.      pEx
f270: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
f280: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f290: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20     Expr *pNew;. 
f2a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
f2b0: 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d  ist!=0 && pExpr-
f2c0: 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d  >iColumn<pEList-
f2d0: 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
f2e0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
f2f0: 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
f300: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70  ->pRight==0 && p
f310: 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  Expr->pList==0 )
f320: 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70  ;.      pNew = p
f330: 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e  EList->a[pExpr->
f340: 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a  iColumn].pExpr;.
f350: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
f360: 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ew!=0 );.      p
f370: 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d  Expr->op = pNew-
f380: 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72  >op;.      asser
f390: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
f3a0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
f3b0: 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r->pLeft = sqlit
f3c0: 65 33 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e  e3ExprDup(pNew->
f3d0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73  pLeft);.      as
f3e0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
f3f0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
f400: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20  pExpr->pRight = 
f410: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
f420: 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  New->pRight);.  
f430: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
f440: 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  r->pList==0 );. 
f450: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73       pExpr->pLis
f460: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
f470: 69 73 74 44 75 70 28 70 4e 65 77 2d 3e 70 4c 69  istDup(pNew->pLi
f480: 73 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  st);.      pExpr
f490: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77 2d  ->iTable = pNew-
f4a0: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
f4b0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
f4c0: 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  pNew->iColumn;. 
f4d0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
f4e0: 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20   = pNew->iAgg;. 
f4f0: 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65       sqlite3Toke
f500: 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 74 6f  nCopy(&pExpr->to
f510: 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65  ken, &pNew->toke
f520: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
f530: 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70  3TokenCopy(&pExp
f540: 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d 3e  r->span, &pNew->
f550: 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 70 45 78  span);.      pEx
f560: 70 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  pr->pSelect = sq
f570: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
f580: 4e 65 77 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  New->pSelect);. 
f590: 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67       pExpr->flag
f5a0: 73 20 3d 20 70 4e 65 77 2d 3e 66 6c 61 67 73 3b  s = pNew->flags;
f5b0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
f5c0: 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 45      substExpr(pE
f5d0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  xpr->pLeft, iTab
f5e0: 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
f5f0: 20 73 75 62 73 74 45 78 70 72 28 70 45 78 70 72   substExpr(pExpr
f600: 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65  ->pRight, iTable
f610: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
f620: 75 62 73 74 53 65 6c 65 63 74 28 70 45 78 70 72  ubstSelect(pExpr
f630: 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c  ->pSelect, iTabl
f640: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
f650: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 45  substExprList(pE
f660: 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62  xpr->pList, iTab
f670: 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
f680: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
f690: 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78 70  ubstExprList(Exp
f6a0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e  rList *pList, in
f6b0: 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69  t iTable, ExprLi
f6c0: 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69  st *pEList){.  i
f6d0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
f6e0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
f6f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
f700: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
f710: 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 4c      substExpr(pL
f720: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
f730: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
f740: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
f750: 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
f760: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
f770: 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20  Table, ExprList 
f780: 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 66 28 20  *pEList){.  if( 
f790: 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  !p ) return;.  s
f7a0: 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
f7b0: 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20  pEList, iTable, 
f7c0: 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
f7d0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
f7e0: 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45  upBy, iTable, pE
f7f0: 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78  List);.  substEx
f800: 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
f810: 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  By, iTable, pELi
f820: 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
f830: 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61  (p->pHaving, iTa
f840: 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
f850: 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 57 68  substExpr(p->pWh
f860: 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ere, iTable, pEL
f870: 69 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ist);.}.#endif /
f880: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
f890: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
f8a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f8b0: 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
f8c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
f8d0: 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
f8e0: 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f   subqueries in o
f8f0: 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a  rder to speed.**
f900: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20   execution.  It 
f910: 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20  returns 1 if it 
f920: 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e  makes changes an
f930: 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65  d 0 if no flatte
f940: 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a  ning.** occurs..
f950: 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
f960: 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
f970: 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
f980: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
f990: 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
f9a0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
f9b0: 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
f9c0: 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
f9d0: 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
f9e0: 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
f9f0: 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
fa00: 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
fa10: 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
fa20: 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
fa30: 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
fa40: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
fa50: 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
fa60: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
fa70: 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
fa80: 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
fa90: 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
faa0: 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
fab0: 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
fac0: 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
fad0: 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
fae0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
faf0: 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
fb00: 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
fb10: 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
fb20: 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
fb30: 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
fb40: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
fb50: 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
fb60: 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
fb70: 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
fb80: 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
fb90: 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
fba0: 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
fbb0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
fbc0: 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
fbd0: 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
fbe0: 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
fbf0: 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
fc00: 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69  this simpificati
fc10: 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
fc20: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
fc30: 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
fc40: 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
fc50: 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
fc60: 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
fc70: 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
fc80: 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
fc90: 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
fca0: 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
fcb0: 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
fcc0: 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
fcd0: 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
fce0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
fcf0: 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
fd00: 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
fd10: 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
fd20: 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
fd30: 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
fd40: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
fd50: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
fd60: 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
fd70: 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72  ate or the outer
fd80: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
fd90: 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  join..**.**   (3
fda0: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
fdb0: 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
fdc0: 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
fdd0: 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f  ft outer join, o
fde0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20  r.**        the 
fdf0: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
fe00: 69 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20  itself a join.  
fe10: 28 54 69 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a  (Ticket #306).**
fe20: 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
fe30: 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
fe40: 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f  ISTINCT or the o
fe50: 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
fe60: 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
fe70: 20 20 28 35 29 20 20 54 68 65 20 73 75 62 71 75    (5)  The subqu
fe80: 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49  ery is not DISTI
fe90: 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  NCT or the outer
fea0: 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
feb0: 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
fec0: 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
fed0: 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75    (6)  The subqu
fee0: 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
fef0: 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
ff00: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
ff10: 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
ff20: 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
ff30: 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
ff40: 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63  ery has a FROM c
ff50: 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  lause..**.**   (
ff60: 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  8)  The subquery
ff70: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
ff80: 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
ff90: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
ffa0: 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39  join..**.**   (9
ffb0: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
ffc0: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
ffd0: 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
ffe0: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
fff0: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
10000 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
10010 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65  (10)  The subque
10020 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
10030 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
10040 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
10050 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
10060 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
10070 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62  *  (11)  The sub
10080 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
10090 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
100a0 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52   both have ORDER
100b0 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a   BY clauses..**.
100c0 2a 2a 20 20 28 31 32 29 20 20 54 68 65 20 73 75  **  (12)  The su
100d0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68  bquery is not th
100e0 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
100f0 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
10100 4e 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20  N or the.**     
10110 20 20 20 73 75 62 71 75 65 72 79 20 68 61 73 20     subquery has 
10120 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
10130 20 20 28 61 64 64 65 64 20 62 79 20 74 69 63 6b    (added by tick
10140 65 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 49  et #350).**.** I
10150 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  n this routine, 
10160 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  the "p" paramete
10170 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
10180 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
10190 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65  y..** The subque
101a0 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61  ry is p->pSrc->a
101b0 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20  [iFrom].  isAgg 
101c0 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
101d0 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73  uter query.** us
101e0 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e  es aggregates an
101f0 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  d subqueryIsAgg 
10200 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73  is true if the s
10210 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
10220 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  regates..**.** I
10230 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
10240 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74  not attempted, t
10250 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
10260 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72   no-op and retur
10270 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74  ns 0..** If flat
10280 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70  tening is attemp
10290 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ted this routine
102a0 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a   returns 1..**.*
102b0 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70  * All of the exp
102c0 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
102d0 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62   must occur on b
102e0 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75  oth the outer qu
102f0 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ery and.** the s
10300 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74  ubquery before t
10310 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
10320 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10330 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
10340 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
10350 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ,       /* The p
10360 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
10370 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
10380 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10390 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
103a0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
103b0 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
103c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
103d0 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
103e0 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
103f0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
10400 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20  nt isAgg,       
10410 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
10420 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
10430 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
10440 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ions */.  int su
10450 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f  bqueryIsAgg    /
10460 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75  * True if the su
10470 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
10480 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
10490 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  */.){.  Select *
104a0 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54  pSub;       /* T
104b0 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f  he inner query o
104c0 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a  r "subquery" */.
104d0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
104e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
104f0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
10500 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
10510 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72   SrcList *pSubSr
10520 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
10530 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
10540 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70  ubquery */.  Exp
10550 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
10560 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
10570 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  et of the outer 
10580 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
10590 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f  Parent;        /
105a0 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  * VDBE cursor nu
105b0 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62  mber of the pSub
105c0 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70   result set temp
105d0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
105e0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
105f0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
10600 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
10610 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10620 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
10630 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
10640 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
10650 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20  em *pSubitem;   
10660 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
10670 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  */..  /* Check t
10680 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
10690 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
106a0 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
106b0 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ot..  */.  if( p
106c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
106d0 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
106e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
106f0 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
10700 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
10710 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d   );.  pSubitem =
10720 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d   &pSrc->a[iFrom]
10730 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69  ;.  pSub = pSubi
10740 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
10750 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20  assert( pSub!=0 
10760 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26  );.  if( isAgg &
10770 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
10780 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
10790 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
107a0 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  && pSrc->nSrc>1 
107b0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53  ) return 0;.  pS
107c0 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
107d0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
107e0 75 62 53 72 63 20 29 3b 0a 20 20 69 66 28 20 28  ubSrc );.  if( (
107f0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
10800 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 20 70 53  p->pLimit) || pS
10810 75 62 2d 3e 70 4f 66 66 73 65 74 20 7c 7c 20 0a  ub->pOffset || .
10820 20 20 20 20 20 20 28 70 53 75 62 2d 3e 70 4c 69        (pSub->pLi
10830 6d 69 74 20 26 26 20 69 73 41 67 67 29 20 29 20  mit && isAgg) ) 
10840 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
10850 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  pSubSrc->nSrc==0
10860 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
10870 66 28 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69  f( pSub->isDisti
10880 6e 63 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53  nct && (pSrc->nS
10890 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
108a0 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
108b0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 69 73  .  }.  if( p->is
108c0 44 69 73 74 69 6e 63 74 20 26 26 20 73 75 62 71  Distinct && subq
108d0 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75  ueryIsAgg ) retu
108e0 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 2d 3e  rn 0;.  if( (p->
108f0 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20  disallowOrderBy 
10900 7c 7c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 20  || p->pOrderBy) 
10910 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
10920 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  y ) return 0;.. 
10930 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
10940 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3:  If the subqu
10950 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d  ery is a join, m
10960 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
10970 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e  query is .  ** n
10980 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72  ot used as the r
10990 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
109a0 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20  an outer join.  
109b0 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  Examples of why 
109c0 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  this.  ** is not
109d0 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
109e0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
109f0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
10a00 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a  t2 JOIN t3).  **
10a10 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
10a20 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
10a30 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
10a40 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
10a50 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
10a60 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20  N t2) JOIN t3.  
10a70 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  **.  ** which is
10a80 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20   not at all the 
10a90 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f  same thing..  */
10aa0 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
10ab0 6e 53 72 63 3e 31 20 26 26 20 69 46 72 6f 6d 3e  nSrc>1 && iFrom>
10ac0 30 20 26 26 20 28 70 53 72 63 2d 3e 61 5b 69 46  0 && (pSrc->a[iF
10ad0 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20  rom-1].jointype 
10ae0 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29  & JT_OUTER)!=0 )
10af0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
10b00 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69    }..  /* Restri
10b10 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68  ction 12:  If th
10b20 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  e subquery is th
10b30 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
10b40 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a  of a left outer.
10b50 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20    ** join, make 
10b60 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
10b70 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63  y has no WHERE c
10b80 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65  lause..  ** An e
10b90 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
10ba0 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  his is not allow
10bb0 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
10bc0 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
10bd0 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54  TER JOIN (SELECT
10be0 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   * FROM t2 WHERE
10bf0 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20   t2.x>0).  **.  
10c00 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
10c10 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
10c20 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
10c30 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
10c40 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
10c50 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a  2) WHERE t2.x>0.
10c60 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68    **.  ** But th
10c70 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69  e t2.x>0 test wi
10c80 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f  ll always fail o
10c90 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20  n a NULL row of 
10ca0 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65  t2, which.  ** e
10cb0 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65  ffectively conve
10cc0 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f  rts the OUTER JO
10cd0 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52  IN into an INNER
10ce0 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66   JOIN..  */.  if
10cf0 28 20 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 53  ( iFrom>0 && (pS
10d00 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a  rc->a[iFrom-1].j
10d10 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
10d20 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20 26 26  ER)!=0 .      &&
10d30 20 70 53 75 62 2d 3e 70 57 68 65 72 65 21 3d 30   pSub->pWhere!=0
10d40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
10d50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
10d60 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
10d70 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c 61  nt, it means fla
10d80 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
10d90 74 74 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a  tted for the.  *
10da0 2a 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79  * iFrom-th entry
10db0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
10dc0 75 73 65 20 69 6e 20 74 68 65 20 6f 75 74 65 72  use in the outer
10dd0 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20   query..  */..  
10de0 2f 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f 66 20 74  /* Move all of t
10df0 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73  he FROM elements
10e00 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
10e10 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74   into the.  ** t
10e20 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
10e30 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
10e40 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  y.  Before doing
10e50 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a   this, remember.
10e60 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20    ** the cursor 
10e70 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f  number for the o
10e80 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75  riginal outer qu
10e90 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74  ery FROM element
10ea0 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74   in.  ** iParent
10eb0 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63  .  The iParent c
10ec0 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72  ursor will never
10ed0 20 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65   be used.  Subse
10ee0 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20  quent code.  ** 
10ef0 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73  will scan expres
10f00 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f  sions looking fo
10f10 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65  r iParent refere
10f20 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65  nces and replace
10f30 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65  .  ** those refe
10f40 72 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72  rences with expr
10f50 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73  essions that res
10f60 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71  olve to the subq
10f70 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65  uery FROM.  ** e
10f80 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e  lements we are n
10f90 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20  ow copying in.. 
10fa0 20 2a 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d 20   */.  iParent = 
10fb0 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f  pSubitem->iCurso
10fc0 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e  r;.  {.    int n
10fd0 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63  SubSrc = pSubSrc
10fe0 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e 74 20  ->nSrc;.    int 
10ff0 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69  jointype = pSubi
11000 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 0a  tem->jointype;..
11010 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
11020 65 54 61 62 6c 65 28 30 2c 20 70 53 75 62 69 74  eTable(0, pSubit
11030 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73  em->pTab);.    s
11040 71 6c 69 74 65 46 72 65 65 28 70 53 75 62 69 74  qliteFree(pSubit
11050 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
11060 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
11070 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  Subitem->zName);
11080 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
11090 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73  pSubitem->zAlias
110a0 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53  );.    if( nSubS
110b0 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  rc>1 ){.      in
110c0 74 20 65 78 74 72 61 20 3d 20 6e 53 75 62 53 72  t extra = nSubSr
110d0 63 20 2d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  c - 1;.      for
110e0 28 69 3d 31 3b 20 69 3c 6e 53 75 62 53 72 63 3b  (i=1; i<nSubSrc;
110f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
11100 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
11110 4c 69 73 74 41 70 70 65 6e 64 28 70 53 72 63 2c  ListAppend(pSrc,
11120 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
11130 20 20 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20        p->pSrc = 
11140 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28  pSrc;.      for(
11150 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20  i=pSrc->nSrc-1; 
11160 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20  i-extra>=iFrom; 
11170 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 70 53  i--){.        pS
11180 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d  rc->a[i] = pSrc-
11190 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20  >a[i-extra];.   
111a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
111b0 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72  or(i=0; i<nSubSr
111c0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  c; i++){.      p
111d0 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20  Src->a[i+iFrom] 
111e0 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b  = pSubSrc->a[i];
111f0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
11200 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c  SubSrc->a[i], 0,
11210 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d   sizeof(pSubSrc-
11220 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20  >a[i]));.    }. 
11230 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d     pSrc->a[iFrom
11240 2b 6e 53 75 62 53 72 63 2d 31 5d 2e 6a 6f 69 6e  +nSubSrc-1].join
11250 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
11260 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62  .  }..  /* Now b
11270 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
11280 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
11290 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
112a0 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72 65 66 65  s for .  ** refe
112b0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50  rences to the iP
112c0 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74  arent in the out
112d0 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2a 20 0a  er query..  ** .
112e0 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
112f0 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  **.  **   SELECT
11300 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
11310 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
11320 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
11330 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
11340 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20    **   \        
11350 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
11360 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71  ___________ subq
11370 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  uery __________/
11380 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20 2a 2a            /.  **
11390 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
113a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
113b0 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
113c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
113d0 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a  _____/.  **.  **
113e0 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72   We look at ever
113f0 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
11400 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
11410 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
11420 77 65 20 73 65 65 0a 20 20 2a 2a 20 22 61 22 20  we see.  ** "a" 
11430 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78  we substitute "x
11440 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c  *3" and every pl
11450 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77  ace we see "b" w
11460 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b  e substitute "y+
11470 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 73 75 62 73  10"..  */.  subs
11480 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c  tExprList(p->pEL
11490 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ist, iParent, pS
114a0 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70  ub->pEList);.  p
114b0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
114c0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
114d0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
114e0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
114f0 70 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  pr;.    if( pLis
11500 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30  t->a[i].zName==0
11510 20 26 26 20 28 70 45 78 70 72 20 3d 20 70 4c 69   && (pExpr = pLi
11520 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d  st->a[i].pExpr)-
11530 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20  >span.z!=0 ){.  
11540 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
11550 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
11560 72 4e 44 75 70 28 28 63 68 61 72 2a 29 70 45 78  rNDup((char*)pEx
11570 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70  pr->span.z, pExp
11580 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  r->span.n);.    
11590 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67  }.  }.  if( isAg
115a0 67 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  g ){.    substEx
115b0 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  prList(p->pGroup
115c0 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
115d0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
115e0 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61  substExpr(p->pHa
115f0 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70  ving, iParent, p
11600 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
11610 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f  }.  if( pSub->pO
11620 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 61 73  rderBy ){.    as
11630 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
11640 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70  y==0 );.    p->p
11650 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e  OrderBy = pSub->
11660 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 53  pOrderBy;.    pS
11670 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ub->pOrderBy = 0
11680 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
11690 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
116a0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
116b0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72  ->pOrderBy, iPar
116c0 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
116d0 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  t);.  }.  if( pS
116e0 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20  ub->pWhere ){.  
116f0 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74    pWhere = sqlit
11700 65 33 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e  e3ExprDup(pSub->
11710 70 57 68 65 72 65 29 3b 0a 20 20 7d 65 6c 73 65  pWhere);.  }else
11720 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30  {.    pWhere = 0
11730 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62 71  ;.  }.  if( subq
11740 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
11750 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 76   assert( p->pHav
11760 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  ing==0 );.    p-
11770 3e 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57  >pHaving = p->pW
11780 68 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68  here;.    p->pWh
11790 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
117a0 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
117b0 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
117c0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
117d0 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
117e0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
117f0 70 2d 3e 70 48 61 76 69 6e 67 2c 20 73 71 6c 69  p->pHaving, sqli
11800 74 65 33 45 78 70 72 44 75 70 28 70 53 75 62 2d  te3ExprDup(pSub-
11810 3e 70 48 61 76 69 6e 67 29 29 3b 0a 20 20 20 20  >pHaving));.    
11820 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
11830 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  pBy==0 );.    p-
11840 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
11850 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
11860 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a  Sub->pGroupBy);.
11870 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62    }else{.    sub
11880 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  stExpr(p->pWhere
11890 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
118a0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d  >pEList);.    p-
118b0 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
118c0 33 45 78 70 72 41 6e 64 28 70 2d 3e 70 57 68 65  3ExprAnd(p->pWhe
118d0 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 7d  re, pWhere);.  }
118e0 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74  ..  /* The flatt
118f0 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69  ened query is di
11900 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72  stinct if either
11910 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68   the inner or th
11920 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65  e.  ** outer que
11930 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20  ry is distinct. 
11940 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44 69 73  .  */.  p->isDis
11950 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
11960 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69  tinct || pSub->i
11970 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a  sDistinct;..  /*
11980 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e  .  ** SELECT ...
11990 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
119a0 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54  . LIMIT a OFFSET
119b0 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53   b) LIMIT x OFFS
119c0 45 54 20 79 3b 0a 20 20 2a 2f 0a 20 20 69 66 28  ET y;.  */.  if(
119d0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
119e0 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
119f0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20   pSub->pLimit;. 
11a00 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20     pSub->pLimit 
11a10 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  = 0;.  }..  /* F
11a20 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20  inially, delete 
11a30 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20  what is left of 
11a40 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  the subquery and
11a50 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63   return.  ** suc
11a60 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  cess..  */.  sql
11a70 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
11a80 28 70 53 75 62 29 3b 0a 20 20 72 65 74 75 72 6e  (pSub);.  return
11a90 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
11aa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
11ab0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79   */../*.** Analy
11ac0 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  ze the SELECT st
11ad0 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 69  atement passed i
11ae0 6e 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  n as an argument
11af0 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a   to see if it.**
11b00 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e   is a simple min
11b10 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
11b20 79 2e 20 20 49 66 20 69 74 20 69 73 20 61 6e 64  y.  If it is and
11b30 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e 20   this query can 
11b40 62 65 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 20  be.** satisfied 
11b50 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 73  using a single s
11b60 65 65 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e  eek to the begin
11b70 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20 61  ning or end of a
11b80 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e  n index,.** then
11b90 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f   generate the co
11ba0 64 65 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45  de for this SELE
11bb0 43 54 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e  CT and return 1.
11bc0 20 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74    If this is not
11bd0 20 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d 69   a .** simple mi
11be0 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
11bf0 72 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ry, then return 
11c00 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c  0;.**.** A simpl
11c10 79 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  y min() or max()
11c20 20 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b   query looks lik
11c30 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
11c40 20 53 45 4c 45 43 54 20 6d 69 6e 28 61 29 20 46   SELECT min(a) F
11c50 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20 20  ROM table;.**   
11c60 20 53 45 4c 45 43 54 20 6d 61 78 28 61 29 20 46   SELECT max(a) F
11c70 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a  ROM table;.**.**
11c80 20 54 68 65 20 71 75 65 72 79 20 6d 61 79 20 68   The query may h
11c90 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ave only a singl
11ca0 65 20 74 61 62 6c 65 20 69 6e 20 69 74 73 20 46  e table in its F
11cb0 52 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20 54  ROM argument.  T
11cc0 68 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20 6e  here.** can be n
11cd0 6f 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41  o GROUP BY or HA
11ce0 56 49 4e 47 20 6f 72 20 57 48 45 52 45 20 63 6c  VING or WHERE cl
11cf0 61 75 73 65 73 2e 20 20 54 68 65 20 72 65 73 75  auses.  The resu
11d00 6c 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20 62  lt set must.** b
11d10 65 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d  e the min() or m
11d20 61 78 28 29 20 6f 66 20 61 20 73 69 6e 67 6c 65  ax() of a single
11d30 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74   column of the t
11d40 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75 6d  able.  The colum
11d50 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e 28  n.** in the min(
11d60 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74  ) or max() funct
11d70 69 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e 64 65  ion must be inde
11d80 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  xed..**.** The p
11d90 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 69  arameters to thi
11da0 73 20 72 6f 75 74 69 6e 65 20 61 72 65 20 74 68  s routine are th
11db0 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20 73 71  e same as for sq
11dc0 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2e 0a 2a  lite3Select()..*
11dd0 2a 20 53 65 65 20 74 68 65 20 68 65 61 64 65 72  * See the header
11de0 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74   comment on that
11df0 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64   routine for add
11e00 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
11e10 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
11e20 6e 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51  nt simpleMinMaxQ
11e30 75 65 72 79 28 50 61 72 73 65 20 2a 70 50 61 72  uery(Parse *pPar
11e40 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
11e50 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50  nt eDest, int iP
11e60 61 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70 45  arm){.  Expr *pE
11e70 78 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  xpr;.  int iCol;
11e80 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
11e90 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
11ea0 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 56 64 62   int base;.  Vdb
11eb0 65 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65 6b  e *v;.  int seek
11ec0 4f 70 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  Op;.  ExprList *
11ed0 70 45 4c 69 73 74 2c 20 2a 70 4c 69 73 74 2c 20  pEList, *pList, 
11ee0 65 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  eList;.  struct 
11ef0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 65 4c  ExprList_item eL
11f00 69 73 74 49 74 65 6d 3b 0a 20 20 53 72 63 4c 69  istItem;.  SrcLi
11f10 73 74 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  st *pSrc;.  int 
11f20 62 72 6b 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  brk;.  int iDb;.
11f30 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
11f40 65 65 20 69 66 20 74 68 69 73 20 71 75 65 72 79  ee if this query
11f50 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e   is a simple min
11f60 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
11f70 79 2e 20 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20  y.  Return.  ** 
11f80 7a 65 72 6f 20 69 66 20 69 74 20 69 73 20 20 6e  zero if it is  n
11f90 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ot..  */.  if( p
11fa0 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20 70 2d  ->pGroupBy || p-
11fb0 3e 70 48 61 76 69 6e 67 20 7c 7c 20 70 2d 3e 70  >pHaving || p->p
11fc0 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
11fd0 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ;.  pSrc = p->pS
11fe0 72 63 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e  rc;.  if( pSrc->
11ff0 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e  nSrc!=1 ) return
12000 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   0;.  pEList = p
12010 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20  ->pEList;.  if( 
12020 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
12030 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
12040 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Expr = pEList->a
12050 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [0].pExpr;.  if(
12060 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
12070 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65  GG_FUNCTION ) re
12080 74 75 72 6e 20 30 3b 0a 20 20 70 4c 69 73 74 20  turn 0;.  pList 
12090 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
120a0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c    if( pList==0 |
120b0 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  | pList->nExpr!=
120c0 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
120d0 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  if( pExpr->token
120e0 2e 6e 21 3d 33 20 29 20 72 65 74 75 72 6e 20 30  .n!=3 ) return 0
120f0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
12100 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70  trNICmp((char*)p
12110 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d  Expr->token.z,"m
12120 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20  in",3)==0 ){.   
12130 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77   seekOp = OP_Rew
12140 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ind;.  }else if(
12150 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
12160 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74  ((char*)pExpr->t
12170 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d  oken.z,"max",3)=
12180 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70  =0 ){.    seekOp
12190 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d 65   = OP_Last;.  }e
121a0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
121b0 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d  0;.  }.  pExpr =
121c0 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78   pList->a[0].pEx
121d0 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  pr;.  if( pExpr-
121e0 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
121f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f   return 0;.  iCo
12200 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
12210 6d 6e 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72  mn;.  pTab = pSr
12220 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 0a  c->a[0].pTab;...
12230 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
12240 6f 20 68 65 72 65 2c 20 69 74 20 6d 65 61 6e 73  o here, it means
12250 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66   the query is of
12260 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 6f 72   the correct for
12270 6d 2e 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  m..  ** Check to
12280 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   make sure we ha
12290 76 65 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20  ve an index and 
122a0 6d 61 6b 65 20 70 49 64 78 20 70 6f 69 6e 74 20  make pIdx point 
122b0 74 6f 20 74 68 65 0a 20 20 2a 2a 20 61 70 70 72  to the.  ** appr
122c0 6f 70 72 69 61 74 65 20 69 6e 64 65 78 2e 20 20  opriate index.  
122d0 49 66 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20  If the min() or 
122e0 6d 61 78 28 29 20 69 73 20 6f 6e 20 61 6e 20 49  max() is on an I
122f0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 0a 20  NTEGER PRIMARY. 
12300 20 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20   ** key column, 
12310 6e 6f 20 69 6e 64 65 78 20 69 73 20 6e 65 63 65  no index is nece
12320 73 73 61 72 79 20 73 6f 20 73 65 74 20 70 49 64  ssary so set pId
12330 78 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e  x to NULL.  If n
12340 6f 0a 20 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e  o.  ** usable in
12350 64 65 78 20 69 73 20 66 6f 75 6e 64 2c 20 72 65  dex is found, re
12360 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69  turn 0..  */.  i
12370 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
12380 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c   pIdx = 0;.  }el
12390 73 65 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  se{.    CollSeq 
123a0 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
123b0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
123c0 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  se, pExpr);.    
123d0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
123e0 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
123f0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
12400 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
12410 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29  dx->nColumn>=1 )
12420 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
12430 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69  ->aiColumn[0]==i
12440 43 6f 6c 20 26 26 20 70 49 64 78 2d 3e 6b 65 79  Col && pIdx->key
12450 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 3d 3d 70  Info.aColl[0]==p
12460 43 6f 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20  Coll ) break;.  
12470 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78    }.    if( pIdx
12480 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
12490 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69    }..  /* Identi
124a0 66 79 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20  fy column types 
124b0 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  if we will be us
124c0 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  ing the callback
124d0 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65  .  This.  ** ste
124e0 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  p is skipped if 
124f0 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f  the output is go
12500 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 6f  ing to a table o
12510 72 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  r a memory cell.
12520 0a 20 20 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  .  ** The column
12530 20 6e 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65   names have alre
12540 61 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74  ady been generat
12550 65 64 20 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e  ed in the callin
12560 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  g function..  */
12570 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
12580 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
12590 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
125a0 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  rn 0;..  /* If t
125b0 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73  he output is des
125c0 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70  tined for a temp
125d0 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65  orary table, ope
125e0 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20  n that table..  
125f0 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
12600 53 52 54 5f 56 69 72 74 75 61 6c 54 61 62 20 29  SRT_VirtualTab )
12610 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
12620 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
12630 6e 56 69 72 74 75 61 6c 2c 20 69 50 61 72 6d 2c  nVirtual, iParm,
12640 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47   1);.  }..  /* G
12650 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74  enerating code t
12660 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 20 6f  o find the min o
12670 72 20 74 68 65 20 6d 61 78 2e 20 20 42 61 73 69  r the max.  Basi
12680 63 61 6c 6c 79 20 61 6c 6c 20 77 65 20 68 61 76  cally all we hav
12690 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
126a0 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 6f  find the first o
126b0 72 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  r the last entry
126c0 20 69 6e 20 74 68 65 20 63 68 6f 73 65 6e 20 69   in the chosen i
126d0 6e 64 65 78 2e 20 20 49 66 0a 20 20 2a 2a 20 74  ndex.  If.  ** t
126e0 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  he min() or max(
126f0 29 20 69 73 20 6f 6e 20 74 68 65 20 49 4e 54 45  ) is on the INTE
12700 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
12710 20 74 68 65 6e 20 66 69 6e 64 20 74 68 65 20 66   then find the f
12720 69 72 73 74 0a 20 20 2a 2a 20 6f 72 20 6c 61 73  irst.  ** or las
12730 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6d  t entry in the m
12740 61 69 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ain table..  */.
12750 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
12760 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
12770 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
12780 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
12790 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
127a0 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
127b0 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c  .  sqlite3TableL
127c0 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
127d0 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
127e0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
127f0 62 61 73 65 20 3d 20 70 53 72 63 2d 3e 61 5b 30  base = pSrc->a[0
12800 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 62 72 6b  ].iCursor;.  brk
12810 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
12820 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f  keLabel(v);.  co
12830 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
12840 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 62  ers(pParse, p, b
12850 72 6b 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d  rk);.  if( pSrc-
12860 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3d 3d 30  >a[0].pSelect==0
12870 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
12880 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
12890 20 62 61 73 65 2c 20 69 44 62 2c 20 70 54 61 62   base, iDb, pTab
128a0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
128b0 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 3d 3d    }.  if( pIdx==
128c0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
128d0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65  VdbeAddOp(v, see
128e0 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20  kOp, base, 0);. 
128f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45   }else{.    /* E
12900 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 63  ven though the c
12910 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20 6f 70  ursor used to op
12920 65 6e 20 74 68 65 20 69 6e 64 65 78 20 68 65 72  en the index her
12930 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20  e is closed.    
12940 2a 2a 20 61 73 20 73 6f 6f 6e 20 61 73 20 61 20  ** as soon as a 
12950 73 69 6e 67 6c 65 20 76 61 6c 75 65 20 68 61 73  single value has
12960 20 62 65 65 6e 20 72 65 61 64 20 66 72 6f 6d 20   been read from 
12970 69 74 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 0a  it, allocate it.
12980 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 28 70 50      ** using (pP
12990 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 29 20 74 6f  arse->nTab++) to
129a0 20 70 72 65 76 65 6e 74 20 74 68 65 20 63 75 72   prevent the cur
129b0 73 6f 72 20 69 64 20 66 72 6f 6d 20 62 65 69 6e  sor id from bein
129c0 67 20 0a 20 20 20 20 2a 2a 20 72 65 75 73 65 64  g .    ** reused
129d0 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74  . This is import
129e0 61 6e 74 20 66 6f 72 20 73 74 61 74 65 6d 65 6e  ant for statemen
129f0 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 0a  ts of the form .
12a00 20 20 20 20 2a 2a 20 22 49 4e 53 45 52 54 20 49      ** "INSERT I
12a10 4e 54 4f 20 78 20 53 45 4c 45 43 54 20 6d 61 78  NTO x SELECT max
12a20 28 29 20 46 52 4f 4d 20 78 22 2e 0a 20 20 20 20  () FROM x"..    
12a30 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 3b  */.    int iIdx;
12a40 0a 20 20 20 20 69 49 64 78 20 3d 20 70 50 61 72  .    iIdx = pPar
12a50 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
12a60 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53  assert( pIdx->pS
12a70 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
12a80 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69  hema );.    sqli
12a90 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12aa0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c  OP_Integer, iDb,
12ab0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12ac0 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
12ad0 65 6e 52 65 61 64 2c 20 69 49 64 78 2c 20 70 49  enRead, iIdx, pI
12ae0 64 78 2d 3e 74 6e 75 6d 2c 0a 20 20 20 20 20 20  dx->tnum,.      
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
12b00 61 72 2a 29 26 70 49 64 78 2d 3e 6b 65 79 49 6e  ar*)&pIdx->keyIn
12b10 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P3_KEYINFO);
12b20 0a 20 20 20 20 69 66 28 20 73 65 65 6b 4f 70 3d  .    if( seekOp=
12b30 3d 4f 50 5f 52 65 77 69 6e 64 20 29 7b 0a 20 20  =OP_Rewind ){.  
12b40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12b50 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  ddOp(v, OP_Null,
12b60 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
12b70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
12b80 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
12b90 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 65   1, 0);.      se
12ba0 65 6b 4f 70 20 3d 20 4f 50 5f 4d 6f 76 65 47 74  ekOp = OP_MoveGt
12bb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
12bc0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12bd0 73 65 65 6b 4f 70 2c 20 69 49 64 78 2c 20 30 29  seekOp, iIdx, 0)
12be0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12bf0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
12c00 52 6f 77 69 64 2c 20 69 49 64 78 2c 20 30 29 3b  Rowid, iIdx, 0);
12c10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12c20 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
12c30 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20  e, iIdx, 0);.   
12c40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12c50 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20  p(v, OP_MoveGe, 
12c60 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  base, 0);.  }.  
12c70 65 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20 31 3b  eList.nExpr = 1;
12c80 0a 20 20 6d 65 6d 73 65 74 28 26 65 4c 69 73 74  .  memset(&eList
12c90 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
12ca0 65 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20 20 65  eListItem));.  e
12cb0 4c 69 73 74 2e 61 20 3d 20 26 65 4c 69 73 74 49  List.a = &eListI
12cc0 74 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b 30  tem;.  eList.a[0
12cd0 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ].pExpr = pExpr;
12ce0 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  .  selectInnerLo
12cf0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 26 65  op(pParse, p, &e
12d00 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d  List, 0, 0, 0, -
12d10 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  1, eDest, iParm,
12d20 20 62 72 6b 2c 20 62 72 6b 2c 20 30 29 3b 0a 20   brk, brk, 0);. 
12d30 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
12d40 6c 76 65 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29  lveLabel(v, brk)
12d50 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12d60 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
12d70 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 0a 20  , base, 0);.  . 
12d80 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
12d90 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 64 20  .** Analyze and 
12da0 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
12db0 50 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 61  P BY clause in a
12dc0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
12dd0 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  t.  Return.** th
12de0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
12df0 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 41  rs seen..**.** A
12e00 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
12e10 4f 55 50 20 42 59 20 69 73 20 61 20 6c 69 73 74  OUP BY is a list
12e20 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2e   of expressions.
12e30 20 20 49 66 20 61 6e 79 20 65 78 70 72 65 73 73    If any express
12e40 69 6f 6e 0a 2a 2a 20 69 73 20 61 6e 20 69 6e 74  ion.** is an int
12e50 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 2c 20 74  eger constant, t
12e60 68 65 6e 20 74 68 61 74 20 65 78 70 72 65 73 73  hen that express
12e70 69 6f 6e 20 69 73 20 72 65 70 6c 61 63 65 64 20  ion is replaced 
12e80 62 79 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  by the.** corres
12e90 70 6f 6e 64 69 6e 67 20 65 6e 74 72 79 20 69 6e  ponding entry in
12ea0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
12eb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
12ec0 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70  rocessOrderGroup
12ed0 42 79 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  By(.  NameContex
12ee0 74 20 2a 70 4e 43 2c 20 20 20 20 20 2f 2a 20 4e  t *pNC,     /* N
12ef0 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74  ame context of t
12f00 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
12f10 65 6e 74 2e 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ent. */.  ExprLi
12f20 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
12f30 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
12f40 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
12f50 73 65 20 74 6f 20 62 65 20 70 72 6f 63 65 73 73  se to be process
12f60 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
12f70 61 72 20 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a  ar *zType     /*
12f80 20 45 69 74 68 65 72 20 22 4f 52 44 45 52 22 20   Either "ORDER" 
12f90 6f 72 20 22 47 52 4f 55 50 22 2c 20 61 73 20 61  or "GROUP", as a
12fa0 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b  ppropriate */.){
12fb0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
12fc0 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
12fd0 4e 43 2d 3e 70 45 4c 69 73 74 3b 20 20 20 20 20  NC->pEList;     
12fe0 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
12ff0 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
13000 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
13010 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
13020 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  ;     /* The res
13030 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
13040 45 4c 45 43 54 20 2a 2f 0a 20 20 61 73 73 65 72  ELECT */.  asser
13050 74 28 20 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20  t( pEList );..  
13060 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
13070 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
13080 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
13090 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
130a0 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20      int iCol;.  
130b0 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72    Expr *pE = pOr
130c0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
130d0 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  r;.    if( sqlit
130e0 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
130f0 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20  pE, &iCol) ){.  
13100 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 26      if( iCol>0 &
13110 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e  & iCol<=pEList->
13120 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
13130 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
13140 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20 20 20  te(pE);.        
13150 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
13160 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69  [i].pExpr = sqli
13170 74 65 33 45 78 70 72 44 75 70 28 70 45 4c 69 73  te3ExprDup(pELis
13180 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78  t->a[iCol-1].pEx
13190 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pr);.      }else
131a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
131b0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
131c0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 25  , .           "%
131d0 73 20 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  s BY column numb
131e0 65 72 20 25 64 20 6f 75 74 20 6f 66 20 72 61 6e  er %d out of ran
131f0 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22  ge - should be "
13200 0a 20 20 20 20 20 20 20 20 20 20 20 22 62 65 74  .           "bet
13210 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20  ween 1 and %d", 
13220 7a 54 79 70 65 2c 20 69 43 6f 6c 2c 20 70 45 4c  zType, iCol, pEL
13230 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
13240 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
13250 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13260 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
13270 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 70 4e 43  ResolveNames(pNC
13280 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 72  , pE) ){.      r
13290 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
132a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
132b0 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29  prIsConstant(pE)
132c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
132d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
132e0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25 73 20  ,.          "%s 
132f0 42 59 20 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f  BY terms must no
13300 74 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72  t be non-integer
13310 20 63 6f 6e 73 74 61 6e 74 73 22 2c 20 7a 54 79   constants", zTy
13320 70 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  pe);.      retur
13330 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
13340 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
13350 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13360 20 72 65 73 6f 6c 76 65 73 20 61 6e 79 20 6e 61   resolves any na
13370 6d 65 73 20 75 73 65 64 20 69 6e 20 74 68 65 20  mes used in the 
13380 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
13390 65 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 53 45  e.** supplied SE
133a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
133b0 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  If the SELECT st
133c0 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 72 65  atement being re
133d0 73 6f 6c 76 65 64 0a 2a 2a 20 69 73 20 61 20 73  solved.** is a s
133e0 75 62 2d 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  ub-select, then 
133f0 70 4f 75 74 65 72 4e 43 20 69 73 20 61 20 70 6f  pOuterNC is a po
13400 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4e 61 6d  inter to the Nam
13410 65 43 6f 6e 74 65 78 74 20 0a 2a 2a 20 6f 66 20  eContext .** of 
13420 74 68 65 20 70 61 72 65 6e 74 20 53 45 4c 45 43  the parent SELEC
13430 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  T..*/.int sqlite
13440 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 0a  3SelectResolve(.
13450 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
13460 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13470 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
13480 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
13490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
134a0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
134b0 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
134c0 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
134d0 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 54   *pOuterNC  /* T
134e0 68 65 20 6f 75 74 65 72 20 6e 61 6d 65 20 63 6f  he outer name co
134f0 6e 74 65 78 74 2e 20 4d 61 79 20 62 65 20 4e 55  ntext. May be NU
13500 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  LL. */.){.  Expr
13510 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
13520 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
13530 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   set. */.  int i
13540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13550 20 20 20 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f 6f        /* For-loo
13560 70 20 76 61 72 69 61 62 6c 65 20 75 73 65 64 20  p variable used 
13570 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63  in multiple plac
13580 65 73 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  es */.  NameCont
13590 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20  ext sNC;        
135a0 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d 65     /* Local name
135b0 2d 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78  -context */.  Ex
135c0 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
135d0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
135e0 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20  group by clause 
135f0 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  */..  /* If this
13600 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e   routine has run
13610 20 62 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 20   before, return 
13620 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f 0a  immediately. */.
13630 20 20 69 66 28 20 70 2d 3e 69 73 52 65 73 6f 6c    if( p->isResol
13640 76 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ved ){.    asser
13650 74 28 20 21 70 4f 75 74 65 72 4e 43 20 29 3b 0a  t( !pOuterNC );.
13660 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13670 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  E_OK;.  }.  p->i
13680 73 52 65 73 6f 6c 76 65 64 20 3d 20 31 3b 0a 0a  sResolved = 1;..
13690 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68 61    /* If there ha
136a0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
136b0 65 72 72 6f 72 73 2c 20 64 6f 20 6e 6f 74 68 69  errors, do nothi
136c0 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ng. */.  if( pPa
136d0 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20  rse->nErr>0 ){. 
136e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
136f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
13700 2a 20 50 72 65 70 61 72 65 20 74 68 65 20 73 65  * Prepare the se
13710 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2e 20  lect statement. 
13720 54 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61  This call will a
13730 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 63 75 72 73  llocate all curs
13740 6f 72 73 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  ors.  ** require
13750 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  d to handle the 
13760 74 61 62 6c 65 73 20 61 6e 64 20 73 75 62 71 75  tables and subqu
13770 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
13780 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  M clause..  */. 
13790 20 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53   if( prepSelectS
137a0 74 6d 74 28 70 50 61 72 73 65 2c 20 70 29 20 29  tmt(pParse, p) )
137b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
137c0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
137d0 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65    /* Resolve the
137e0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
137f0 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
13800 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68  FSET clauses. Th
13810 65 73 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74  ese.  ** are not
13820 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66 65   allowed to refe
13830 72 20 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20  r to any names, 
13840 73 6f 20 70 61 73 73 20 61 6e 20 65 6d 70 74 79  so pass an empty
13850 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20   NameContext..  
13860 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  */.  memset(&sNC
13870 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
13880 29 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20  );.  sNC.pParse 
13890 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20  = pParse;.  if( 
138a0 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
138b0 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d  veNames(&sNC, p-
138c0 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a 20 20 20 20  >pLimit) ||.    
138d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73    sqlite3ExprRes
138e0 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20  olveNames(&sNC, 
138f0 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20  p->pOffset) ){. 
13900 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13910 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
13920 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 63  * Set up the loc
13930 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20  al name-context 
13940 74 6f 20 70 61 73 73 20 74 6f 20 45 78 70 72 52  to pass to ExprR
13950 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 74 6f  esolveNames() to
13960 0a 20 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68  .  ** resolve th
13970 65 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73  e expression-lis
13980 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 61 6c  t..  */.  sNC.al
13990 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 73 4e  lowAgg = 1;.  sN
139a0 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e  C.pSrcList = p->
139b0 70 53 72 63 3b 0a 20 20 73 4e 43 2e 70 4e 65 78  pSrc;.  sNC.pNex
139c0 74 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 0a 20  t = pOuterNC;.. 
139d0 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65   /* Resolve name
139e0 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
139f0 73 65 74 2e 20 2a 2f 0a 20 20 70 45 4c 69 73 74  set. */.  pEList
13a00 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
13a10 69 66 28 20 21 70 45 4c 69 73 74 20 29 20 72 65  if( !pEList ) re
13a20 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
13a30 52 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  R;.  for(i=0; i<
13a40 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
13a50 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
13a60 58 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  X = pEList->a[i]
13a70 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
13a80 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
13a90 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 58  veNames(&sNC, pX
13aa0 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
13ab0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
13ac0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
13ad0 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
13ae0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
13af0 6f 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ons in the resul
13b00 74 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47 52  t-set, and no GR
13b10 4f 55 50 20 42 59 20 0a 20 20 2a 2a 20 65 78 70  OUP BY .  ** exp
13b20 72 65 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20  ression, do not 
13b30 61 6c 6c 6f 77 20 61 67 67 72 65 67 61 74 65 73  allow aggregates
13b40 20 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6f   in any of the o
13b50 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73  ther expressions
13b60 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
13b70 20 21 70 2d 3e 69 73 41 67 67 20 29 3b 0a 20 20   !p->isAgg );.  
13b80 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
13b90 72 6f 75 70 42 79 3b 0a 20 20 69 66 28 20 70 47  roupBy;.  if( pG
13ba0 72 6f 75 70 42 79 20 7c 7c 20 73 4e 43 2e 68 61  roupBy || sNC.ha
13bb0 73 41 67 67 20 29 7b 0a 20 20 20 20 70 2d 3e 69  sAgg ){.    p->i
13bc0 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  sAgg = 1;.  }els
13bd0 65 7b 0a 20 20 20 20 73 4e 43 2e 61 6c 6c 6f 77  e{.    sNC.allow
13be0 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Agg = 0;.  }..  
13bf0 2f 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20 63  /* If a HAVING c
13c00 6c 61 75 73 65 20 69 73 20 70 72 65 73 65 6e 74  lause is present
13c10 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
13c20 74 20 62 65 20 61 20 47 52 4f 55 50 20 42 59 20  t be a GROUP BY 
13c30 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  clause..  */.  i
13c40 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 26 26  f( p->pHaving &&
13c50 20 21 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20   !pGroupBy ){.  
13c60 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13c70 67 28 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f  g(pParse, "a GRO
13c80 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  UP BY clause is 
13c90 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
13ca0 48 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 72 65  HAVING");.    re
13cb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
13cc0 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  R;.  }..  /* Add
13cd0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
13ce0 6c 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d 65  list to the name
13cf0 2d 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65 20  -context before 
13d00 70 61 72 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  parsing the.  **
13d10 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
13d20 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ns in the SELECT
13d30 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
13d40 20 69 73 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a   is so that.  **
13d50 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
13d60 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
13d70 20 28 65 74 63 2e 29 20 63 61 6e 20 72 65 66 65   (etc.) can refe
13d80 72 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 73  r to expressions
13d90 20 62 79 0a 20 20 2a 2a 20 61 6c 69 61 73 65 73   by.  ** aliases
13da0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
13db0 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 69  et..  **.  ** Mi
13dc0 6e 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20 74 68  nor point: If th
13dd0 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
13de0 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
13df0 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a  ion will be.  **
13e00 20 72 65 2d 65 76 61 6c 75 61 74 65 64 20 66 6f   re-evaluated fo
13e10 72 20 65 61 63 68 20 72 65 66 65 72 65 6e 63 65  r each reference
13e20 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73   to it..  */.  s
13e30 4e 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  NC.pEList = p->p
13e40 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71 6c  EList;.  if( sql
13e50 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
13e60 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57  ames(&sNC, p->pW
13e70 68 65 72 65 29 20 7c 7c 0a 20 20 20 20 20 20 73  here) ||.      s
13e80 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
13e90 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
13ea0 70 48 61 76 69 6e 67 29 20 7c 7c 0a 20 20 20 20  pHaving) ||.    
13eb0 20 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72    processOrderGr
13ec0 6f 75 70 42 79 28 26 73 4e 43 2c 20 70 2d 3e 70  oupBy(&sNC, p->p
13ed0 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
13ee0 29 20 7c 7c 0a 20 20 20 20 20 20 70 72 6f 63 65  ) ||.      proce
13ef0 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26  ssOrderGroupBy(&
13f00 73 4e 43 2c 20 70 47 72 6f 75 70 42 79 2c 20 22  sNC, pGroupBy, "
13f10 47 52 4f 55 50 22 29 0a 20 20 29 7b 0a 20 20 20  GROUP").  ){.   
13f20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
13f30 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
13f40 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 47 52  Make sure the GR
13f50 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 64 6f  OUP BY clause do
13f60 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
13f70 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
13f80 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ns..  */.  if( p
13f90 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73  GroupBy ){.    s
13fa0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
13fb0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20  tem *pItem;.  . 
13fc0 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
13fd0 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69  m=pGroupBy->a; i
13fe0 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
13ff0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
14000 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
14010 61 73 50 72 6f 70 65 72 74 79 28 70 49 74 65 6d  asProperty(pItem
14020 2d 3e 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29  ->pExpr, EP_Agg)
14030 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
14040 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14050 73 65 2c 20 22 61 67 67 72 65 67 61 74 65 20 66  se, "aggregate f
14060 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  unctions are not
14070 20 61 6c 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20   allowed in ".  
14080 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20 47            "the G
14090 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 22 29  ROUP BY clause")
140a0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
140b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
140c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
140d0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
140e0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
140f0 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61  eset the aggrega
14100 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a  te accumulator..
14110 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67  **.** The aggreg
14120 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
14130 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f  is a set of memo
14140 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f  ry cells that ho
14150 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61  ld.** intermedia
14160 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65  te results while
14170 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20   calculating an 
14180 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73  aggregate.  This
14190 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d 70  .** routine simp
141a0 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20  ly stores NULLs 
141b0 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20  in all of those 
141c0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f  memory cells..*/
141d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
141e0 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  etAccumulator(Pa
141f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
14200 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
14210 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
14220 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
14230 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
14240 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e  gInfo_func *pFun
14250 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66  c;.  if( pAggInf
14260 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66  o->nFunc+pAggInf
14270 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  o->nColumn==0 ){
14280 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
14290 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
142a0 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
142b0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
142c0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
142d0 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 70 41 67 67 49  P_MemNull, pAggI
142e0 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
142f0 6d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  m, 0);.  }.  for
14300 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d  (pFunc=pAggInfo-
14310 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70  >aFunc, i=0; i<p
14320 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
14330 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20  i++, pFunc++){. 
14340 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14350 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c  dOp(v, OP_MemNul
14360 6c 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 2c 20  l, pFunc->iMem, 
14370 30 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  0);.    if( pFun
14380 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20  c->iDistinct>=0 
14390 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
143a0 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72  E = pFunc->pExpr
143b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
143c0 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  pList==0 || pE->
143d0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  pList->nExpr!=1 
143e0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
143f0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
14400 65 2c 20 22 44 49 53 54 49 4e 43 54 20 69 6e 20  e, "DISTINCT in 
14410 61 67 67 72 65 67 61 74 65 20 6d 75 73 74 20 62  aggregate must b
14420 65 20 66 6f 6c 6c 6f 77 65 64 20 22 0a 20 20 20  e followed ".   
14430 20 20 20 20 20 20 20 20 22 62 79 20 61 6e 20 65          "by an e
14440 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20  xpression");.   
14450 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
14460 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
14470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14480 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
14490 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
144a0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
144b0 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20   pE->pList);.   
144c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
144d0 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69  Op3(v, OP_OpenVi
144e0 72 74 75 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44  rtual, pFunc->iD
144f0 69 73 74 69 6e 63 74 2c 20 30 2c 20 0a 20 20 20  istinct, 0, .   
14500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14510 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
14520 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
14530 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
14540 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
14550 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
14560 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a  he OP_AggFinaliz
14570 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65  e opcode for eve
14580 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ry aggregate fun
14590 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  ction.** in the 
145a0 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
145b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
145c0 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e  d finalizeAggFun
145d0 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50  ctions(Parse *pP
145e0 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
145f0 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
14600 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
14610 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
14620 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
14630 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69  unc *pF;.  for(i
14640 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
14650 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
14660 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
14670 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c  pF++){.    ExprL
14680 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
14690 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20  >pExpr->pList;. 
146a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
146b0 33 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c  3(v, OP_AggFinal
146c0 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73  , pF->iMem, pLis
146d0 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
146e0 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20   : 0,.          
146f0 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
14700 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 33  d*)pF->pFunc, P3
14710 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d  _FUNCDEF);.  }.}
14720 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74  ../*.** Update t
14730 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d  he accumulator m
14740 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
14750 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73  an aggregate bas
14760 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72  ed on.** the cur
14770 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
14780 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
14790 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d  void updateAccum
147a0 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
147b0 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
147c0 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
147d0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
147e0 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
147f0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
14800 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63  unc *pF;.  struc
14810 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
14820 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e  C;..  pAggInfo->
14830 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
14840 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
14850 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
14860 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
14870 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
14880 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20    int nArg;.    
14890 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30  int addrNext = 0
148a0 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
148b0 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
148c0 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69 66  r->pList;.    if
148d0 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
148e0 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e   nArg = pList->n
148f0 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
14900 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
14910 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
14920 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
14930 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20       nArg = 0;. 
14940 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
14950 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
14960 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20  .      addrNext 
14970 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
14980 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
14990 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31   assert( nArg==1
149a0 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44 69   );.      codeDi
149b0 73 74 69 6e 63 74 28 76 2c 20 70 46 2d 3e 69 44  stinct(v, pF->iD
149c0 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78  istinct, addrNex
149d0 74 2c 20 31 2c 20 32 29 3b 0a 20 20 20 20 7d 0a  t, 1, 2);.    }.
149e0 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e      if( pF->pFun
149f0 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29  c->needCollSeq )
14a00 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
14a10 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
14a20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
14a30 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
14a40 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
14a50 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
14a60 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c  =pList->a; !pCol
14a70 6c 20 26 26 20 6a 3c 70 4c 69 73 74 2d 3e 6e 45  l && j<pList->nE
14a80 78 70 72 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; j++, pItem+
14a90 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  +){.        pCol
14aa0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
14ab0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
14ac0 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
14ad0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
14ae0 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
14af0 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
14b00 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
14b10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
14b20 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
14b30 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20   OP_CollSeq, 0, 
14b40 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
14b50 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P3_COLLSEQ);. 
14b60 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
14b70 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67  VdbeOp3(v, OP_Ag
14b80 67 53 74 65 70 2c 20 70 46 2d 3e 69 4d 65 6d 2c  gStep, pF->iMem,
14b90 20 6e 41 72 67 2c 20 28 76 6f 69 64 2a 29 70 46   nArg, (void*)pF
14ba0 2d 3e 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43  ->pFunc, P3_FUNC
14bb0 44 45 46 29 3b 0a 20 20 20 20 69 66 28 20 61 64  DEF);.    if( ad
14bc0 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  drNext ){.      
14bd0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
14be0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e  veLabel(v, addrN
14bf0 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ext);.    }.  }.
14c00 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41    for(i=0, pC=pA
14c10 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c  ggInfo->aCol; i<
14c20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
14c30 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b  ulator; i++, pC+
14c40 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
14c50 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
14c60 70 43 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  pC->pExpr);.    
14c70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14c80 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
14c90 20 70 43 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20   pC->iMem, 1);. 
14ca0 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64   }.  pAggInfo->d
14cb0 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 7d  irectMode = 0;.}
14cc0 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
14cd0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 67  e code for the g
14ce0 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74  iven SELECT stat
14cf0 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
14d00 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73   results are dis
14d10 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72 69  tributed in vari
14d20 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64 69  ous ways dependi
14d30 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c  ng on the.** val
14d40 75 65 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20  ue of eDest and 
14d50 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
14d60 20 65 44 65 73 74 20 56 61 6c 75 65 20 20 20 20   eDest Value    
14d70 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20     Result.**    
14d80 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20   ------------   
14d90 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
14da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
14dc0 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b      SRT_Callback
14dd0 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 63      Invoke the c
14de0 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63 68  allback for each
14df0 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
14e00 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  lt..**.**     SR
14e10 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53 74  T_Mem         St
14e20 6f 72 65 20 66 69 72 73 74 20 72 65 73 75 6c 74  ore first result
14e30 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
14e40 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iParm.**.**     
14e50 53 52 54 5f 53 65 74 20 20 20 20 20 20 20 20 20  SRT_Set         
14e60 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73  Store results as
14e70 20 6b 65 79 73 20 6f 66 20 74 61 62 6c 65 20 69   keys of table i
14e80 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
14e90 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20  SRT_Union       
14ea0 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73  Store results as
14eb0 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70   a key in a temp
14ec0 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
14ed0 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  m.**.**     SRT_
14ee0 45 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f  Except      Remo
14ef0 76 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  ve results from 
14f00 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
14f10 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ble iParm..**.**
14f20 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20       SRT_Table  
14f30 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
14f40 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  ts in temporary 
14f50 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a  table iParm.**.*
14f60 2a 20 54 68 65 20 74 61 62 6c 65 20 61 62 6f 76  * The table abov
14f70 65 20 69 73 20 69 6e 63 6f 6d 70 6c 65 74 65 2e  e is incomplete.
14f80 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 44 69    Additional eDi
14f90 73 74 20 76 61 6c 75 65 20 68 61 76 65 20 62 65  st value have be
14fa0 20 61 64 64 65 64 0a 2a 2a 20 73 69 6e 63 65 20   added.** since 
14fb0 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 77 61 73  this comment was
14fc0 20 77 72 69 74 74 65 6e 2e 20 20 53 65 65 20 74   written.  See t
14fd0 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
14fe0 6f 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  op() function fo
14ff0 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c 65 74 65 20  r.** a complete 
15000 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 61  listing of the a
15010 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66  llowed values of
15020 20 65 44 65 73 74 20 61 6e 64 20 74 68 65 69 72   eDest and their
15030 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a   meanings..**.**
15040 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
15050 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
15060 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
15070 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a  any errors are.*
15080 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  * encountered, t
15090 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  hen an appropria
150a0 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
150b0 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70   is left in.** p
150c0 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
150d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
150e0 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65  ne does NOT free
150f0 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
15100 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e  cture passed in.
15110 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
15120 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20   function needs 
15130 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a  to do that..**.*
15140 2a 20 54 68 65 20 70 50 61 72 65 6e 74 2c 20 70  * The pParent, p
15150 61 72 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70  arentTab, and *p
15160 50 61 72 65 6e 74 41 67 67 20 66 69 65 6c 64 73  ParentAgg fields
15170 20 61 72 65 20 66 69 6c 6c 65 64 20 69 6e 20 69   are filled in i
15180 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54  f this.** SELECT
15190 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2e 20   is a subquery. 
151a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
151b0 79 20 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65  y try to combine
151c0 20 74 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20   this SELECT.** 
151d0 77 69 74 68 20 69 74 73 20 70 61 72 65 6e 74 20  with its parent 
151e0 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  to form a single
151f0 20 66 6c 61 74 20 71 75 65 72 79 2e 20 20 49 6e   flat query.  In
15200 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69   so doing, it mi
15210 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68  ght.** change th
15220 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 66  e parent query f
15230 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67  rom a non-aggreg
15240 61 74 65 20 74 6f 20 61 6e 20 61 67 67 72 65 67  ate to an aggreg
15250 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f  ate query..** Fo
15260 72 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 74  r that reason, t
15270 68 65 20 70 50 61 72 65 6e 74 41 67 67 20 66 6c  he pParentAgg fl
15280 61 67 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ag is passed as 
15290 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74  a pointer, so it
152a0 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67  .** can be chang
152b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  ed..**.** Exampl
152c0 65 20 31 3a 20 20 20 54 68 65 20 6d 65 61 6e 69  e 1:   The meani
152d0 6e 67 20 6f 66 20 74 68 65 20 70 50 61 72 65 6e  ng of the pParen
152e0 74 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  t parameter..**.
152f0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
15300 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c  ROM t1 JOIN (SEL
15310 45 43 54 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20  ECT x, count(*) 
15320 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33  FROM t2) JOIN t3
15330 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20 20 20 20  ;.**    \       
15340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
15350 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
15360 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20   _______/       
15370 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20 20 20 20   /.**     \     
15380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153b0 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f   /.**      \____
153c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
153d0 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f   outer query ___
153e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
153f0 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  /.**.** This rou
15400 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
15410 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
15420 72 79 20 66 69 72 73 74 2e 20 20 20 46 6f 72 20  ry first.   For 
15430 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50  that call,.** pP
15440 61 72 65 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55  arent will be NU
15450 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74 68 65 20  LL.  During the 
15460 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68  processing of th
15470 65 20 6f 75 74 65 72 20 71 75 65 72 79 2c 20 74  e outer query, t
15480 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  his .** routine 
15490 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  is called recurs
154a0 69 76 65 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20  ively to handle 
154b0 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 46  the subquery.  F
154c0 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65  or the recursive
154d0 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e  .** call, pParen
154e0 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  t will point to 
154f0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
15500 20 20 42 65 63 61 75 73 65 20 74 68 65 20 73 75    Because the su
15510 62 71 75 65 72 79 20 69 73 0a 2a 2a 20 74 68 65  bquery is.** the
15520 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20   second element 
15530 69 6e 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a  in a three-way j
15540 6f 69 6e 2c 20 74 68 65 20 70 61 72 65 6e 74 54  oin, the parentT
15550 61 62 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c  ab parameter wil
15560 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68 65 20 32  l.** be 1 (the 2
15570 6e 64 20 76 61 6c 75 65 20 6f 66 20 61 20 30 2d  nd value of a 0-
15580 69 6e 64 65 78 65 64 20 61 72 72 61 79 2e 29 0a  indexed array.).
15590 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
155a0 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
155b0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
155c0 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
155d0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
155e0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
155f0 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
15600 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
15610 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 65  oded. */.  int e
15620 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Dest,           
15630 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
15640 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c  ose of the resul
15650 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ts */.  int iPar
15660 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m,             /
15670 2a 20 41 20 70 61 72 61 6d 65 74 65 72 20 75 73  * A parameter us
15680 65 64 20 62 79 20 74 68 65 20 65 44 65 73 74 20  ed by the eDest 
15690 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
156a0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61  */.  Select *pPa
156b0 72 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20 41  rent,       /* A
156c0 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 66 6f  nother SELECT fo
156d0 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20  r which this is 
156e0 61 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20  a sub-query */. 
156f0 20 69 6e 74 20 70 61 72 65 6e 74 54 61 62 2c 20   int parentTab, 
15700 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
15710 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 70 53 72   in pParent->pSr
15720 63 20 6f 66 20 74 68 69 73 20 71 75 65 72 79 20  c of this query 
15730 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61 72 65 6e  */.  int *pParen
15740 74 41 67 67 2c 20 20 20 20 20 20 20 2f 2a 20 54  tAgg,       /* T
15750 72 75 65 20 69 66 20 70 50 61 72 65 6e 74 20 75  rue if pParent u
15760 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
15770 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61  nctions */.  cha
15780 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20 20  r *aff          
15790 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20      /* If eDest 
157a0 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68  is SRT_Union, th
157b0 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
157c0 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  g */.){.  int i,
157d0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
157e0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
157f0 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  s */.  WhereInfo
15800 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a   *pWInfo;     /*
15810 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c   Return from sql
15820 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
15830 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
15840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15850 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  The virtual mach
15860 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ine under constr
15870 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
15880 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20  isAgg;          
15890 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73     /* True for s
158a0 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65  elect lists like
158b0 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20   "count(*)" */. 
158c0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
158d0 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t;      /* List 
158e0 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78  of columns to ex
158f0 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c  tract. */.  SrcL
15900 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20  ist *pTabList;  
15910 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
15920 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66  bles to select f
15930 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  rom */.  Expr *p
15940 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
15950 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
15960 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
15970 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
15980 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a  *pOrderBy;    /*
15990 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
159a0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
159b0 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
159c0 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f   *pGroupBy;    /
159d0 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63  * The GROUP BY c
159e0 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
159f0 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
15a00 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20  Having;         
15a10 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c  /* The HAVING cl
15a20 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
15a30 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69  LL */.  int isDi
15a40 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f  stinct;        /
15a50 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49  * True if the DI
15a60 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
15a70 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
15a80 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20  nt distinct;    
15a90 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
15aa0 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
15ab0 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20  stinct set */.  
15ac0 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20  int rc = 1;     
15ad0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
15ae0 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74  to return from t
15af0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
15b00 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e    int addrSortIn
15b10 64 65 78 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  dex;     /* Addr
15b20 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65  ess of an OP_Ope
15b30 6e 56 69 72 74 75 61 6c 20 69 6e 73 74 72 75 63  nVirtual instruc
15b40 74 69 6f 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66  tion */.  AggInf
15b50 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20  o sAggInfo;     
15b60 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
15b70 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74  used by aggregat
15b80 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69  e queries */.  i
15b90 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20  nt iEnd;        
15ba0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
15bb0 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74   of the end of t
15bc0 68 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69  he query */..  i
15bd0 66 28 20 73 71 6c 69 74 65 33 54 73 64 28 29 2d  f( sqlite3Tsd()-
15be0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
15bf0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
15c00 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31   p==0 ) return 1
15c10 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
15c20 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
15c30 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
15c40 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
15c50 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  n 1;.  memset(&s
15c60 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  AggInfo, 0, size
15c70 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a  of(sAggInfo));..
15c80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15c90 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
15ca0 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  ECT.  /* If ther
15cb0 65 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65  e is are a seque
15cc0 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20  nce of queries, 
15cd0 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f  do the earlier o
15ce0 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a  nes first..  */.
15cf0 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
15d00 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52  ){.    if( p->pR
15d10 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20  ightmost==0 ){. 
15d20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f       Select *pLo
15d30 6f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4c  op;.      for(pL
15d40 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c  oop=p; pLoop; pL
15d50 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f  oop=pLoop->pPrio
15d60 72 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f  r){.        pLoo
15d70 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  p->pRightmost = 
15d80 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
15d90 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
15da0 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
15db0 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  p, eDest, iParm,
15dc0 20 61 66 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69   aff);.  }.#endi
15dd0 66 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  f..  pOrderBy = 
15de0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
15df0 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
15e00 72 62 79 28 65 44 65 73 74 29 20 29 7b 0a 20 20  rby(eDest) ){.  
15e10 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
15e20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
15e30 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
15e40 65 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 20  e(pParse, p, 0) 
15e50 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
15e60 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d  ct_end;.  }.  p-
15e70 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
15e80 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  erBy;..  /* Make
15e90 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f 66   local copies of
15ea0 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   the parameters 
15eb0 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e 0a  for this query..
15ec0 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 20    */.  pTabList 
15ed0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68  = p->pSrc;.  pWh
15ee0 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
15ef0 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
15f00 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
15f10 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
15f20 67 3b 0a 20 20 69 73 41 67 67 20 3d 20 70 2d 3e  g;.  isAgg = p->
15f30 69 73 41 67 67 3b 0a 20 20 69 73 44 69 73 74 69  isAgg;.  isDisti
15f40 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
15f50 6e 63 74 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  nct;.  pEList = 
15f60 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
15f70 20 70 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74   pEList==0 ) got
15f80 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
15f90 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74   /* .  ** Do not
15fa0 20 65 76 65 6e 20 61 74 74 65 6d 70 74 20 74 6f   even attempt to
15fb0 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20 63 6f   generate any co
15fc0 64 65 20 69 66 20 77 65 20 68 61 76 65 20 61 6c  de if we have al
15fd0 72 65 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20  ready seen.  ** 
15fe0 65 72 72 6f 72 73 20 62 65 66 6f 72 65 20 74 68  errors before th
15ff0 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74  is routine start
16000 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  s..  */.  if( pP
16010 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67  arse->nErr>0 ) g
16020 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
16030 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67  .  /* If writing
16040 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65   to memory or ge
16050 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20  nerating a set. 
16060 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   ** only a singl
16070 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20  e column may be 
16080 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66  output..  */.#if
16090 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
160a0 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
160b0 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20  (eDest==SRT_Mem 
160c0 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65  || eDest==SRT_Se
160d0 74 29 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  t) && pEList->nE
160e0 78 70 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c  xpr>1 ){.    sql
160f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
16100 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e  rse, "only a sin
16110 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77  gle result allow
16120 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20  ed for ".       
16130 22 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  "a SELECT that i
16140 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
16150 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 67  ression");.    g
16160 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
16170 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
16180 20 4f 52 44 45 52 20 42 59 20 69 73 20 69 67 6e   ORDER BY is ign
16190 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65  ored for some de
161a0 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f  stinations..  */
161b0 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65  .  if( Ignorable
161c0 4f 72 64 65 72 62 79 28 65 44 65 73 74 29 20 29  Orderby(eDest) )
161d0 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d  {.    pOrderBy =
161e0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65   0;.  }..  /* Be
161f0 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63  gin generating c
16200 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ode..  */.  v = 
16210 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
16220 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
16230 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
16240 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e  _end;..  /* Iden
16250 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  tify column name
16260 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20  s if we will be 
16270 75 73 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 20  using them in a 
16280 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a  callback.  This.
16290 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69    ** step is ski
162a0 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70  pped if the outp
162b0 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 73  ut is going to s
162c0 6f 6d 65 20 6f 74 68 65 72 20 64 65 73 74 69 6e  ome other destin
162d0 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  ation..  */.  if
162e0 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
162f0 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e  lback ){.    gen
16300 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
16310 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
16320 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t, pEList);.  }.
16330 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
16340 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
16350 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
16360 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  ROM clause.  */.
16370 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
16380 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
16390 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
163a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
163b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
163c0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
163d0 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
163e0 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
163f0 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69  ntext = 0;.    i
16400 6e 74 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f  nt needRestoreCo
16410 6e 74 65 78 74 3b 0a 20 20 20 20 73 74 72 75 63  ntext;.    struc
16420 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
16430 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
16440 74 2d 3e 61 5b 69 5d 3b 0a 0a 20 20 20 20 69 66  t->a[i];..    if
16450 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
16460 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
16470 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
16480 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
16490 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65   zSavedAuthConte
164a0 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75  xt = pParse->zAu
164b0 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20  thContext;.     
164c0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
164d0 6e 74 65 78 74 20 3d 20 70 49 74 65 6d 2d 3e 7a  ntext = pItem->z
164e0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e 65 65 64  Name;.      need
164f0 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d  RestoreContext =
16500 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
16510 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65       needRestore
16520 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20  Context = 0;.   
16530 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65   }.    sqlite3Se
16540 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 49 74  lect(pParse, pIt
16550 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54  em->pSelect, SRT
16560 5f 56 69 72 74 75 61 6c 54 61 62 2c 20 0a 20 20  _VirtualTab, .  
16570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16580 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70  Item->iCursor, p
16590 2c 20 69 2c 20 26 69 73 41 67 67 2c 20 30 29 3b  , i, &isAgg, 0);
165a0 0a 20 20 20 20 69 66 28 20 6e 65 65 64 52 65 73  .    if( needRes
165b0 74 6f 72 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20  toreContext ){. 
165c0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75       pParse->zAu
165d0 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
165e0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  edAuthContext;. 
165f0 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73     }.    pTabLis
16600 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
16610 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
16620 65 72 65 3b 0a 20 20 20 20 69 66 28 20 21 49 67  ere;.    if( !Ig
16630 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 65  norableOrderby(e
16640 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70  Dest) ){.      p
16650 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
16660 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20  derBy;.    }.   
16670 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
16680 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 48 61  GroupBy;.    pHa
16690 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
166a0 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63  g;.    isDistinc
166b0 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
166c0 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  t;.  }.#endif.. 
166d0 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68   /* Check for th
166e0 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f  e special case o
166f0 66 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  f a min() or max
16700 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 69  () function by i
16710 74 73 65 6c 66 0a 20 20 2a 2a 20 69 6e 20 74 68  tself.  ** in th
16720 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20  e result set..  
16730 2a 2f 0a 20 20 69 66 28 20 73 69 6d 70 6c 65 4d  */.  if( simpleM
16740 69 6e 4d 61 78 51 75 65 72 79 28 70 50 61 72 73  inMaxQuery(pPars
16750 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61  e, p, eDest, iPa
16760 72 6d 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  rm) ){.    rc = 
16770 30 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  0;.    goto sele
16780 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
16790 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
167a0 66 20 74 68 69 73 20 69 73 20 61 20 73 75 62 71  f this is a subq
167b0 75 65 72 79 20 74 68 61 74 20 63 61 6e 20 62 65  uery that can be
167c0 20 22 66 6c 61 74 74 65 6e 65 64 22 20 69 6e 74   "flattened" int
167d0 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20  o its parent..  
167e0 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
167f0 20 69 73 20 61 20 70 6f 73 73 69 62 6c 69 74 79   is a possiblity
16800 2c 20 64 6f 20 73 6f 20 61 6e 64 20 72 65 74 75  , do so and retu
16810 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  rn immediately. 
16820 20 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53   .  */.#ifndef S
16830 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
16840 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 26 26    if( pParent &&
16850 20 70 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20   pParentAgg &&. 
16860 20 20 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71       flattenSubq
16870 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 50 61  uery(pParse, pPa
16880 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c  rent, parentTab,
16890 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 69 73   *pParentAgg, is
168a0 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Agg) ){.    if( 
168b0 69 73 41 67 67 20 29 20 2a 70 50 61 72 65 6e 74  isAgg ) *pParent
168c0 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74  Agg = 1;.    got
168d0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
168e0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
168f0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
16900 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 72  DER BY clause, r
16910 65 73 6f 6c 76 65 20 61 6e 79 20 63 6f 6c 6c 61  esolve any colla
16920 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 0a 20  tion sequences. 
16930 20 2a 2a 20 6e 61 6d 65 73 20 74 68 61 74 20 68   ** names that h
16940 61 76 65 20 62 65 65 6e 20 65 78 70 6c 69 63 69  ave been explici
16950 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 61 6e  tly specified an
16960 64 20 63 72 65 61 74 65 20 61 20 73 6f 72 74 69  d create a sorti
16970 6e 67 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20  ng index..  **. 
16980 20 2a 2a 20 54 68 69 73 20 73 6f 72 74 69 6e 67   ** This sorting
16990 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64   index might end
169a0 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64   up being unused
169b0 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e   if the data can
169c0 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63   be .  ** extrac
169d0 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65  ted in pre-sorte
169e0 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61  d order.  If tha
169f0 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
16a00 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f  hen the.  ** OP_
16a10 4f 70 65 6e 56 69 72 74 75 61 6c 20 69 6e 73 74  OpenVirtual inst
16a20 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  ruction will be 
16a30 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50  changed to an OP
16a40 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20  _Noop once.  ** 
16a50 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74 68  we figure out th
16a60 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  at the sorting i
16a70 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65 64  ndex is not need
16a80 65 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f 72  ed.  The addrSor
16a90 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72 69  tIndex.  ** vari
16aa0 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
16ab0 66 61 63 69 6c 69 74 61 74 65 20 74 68 61 74 20  facilitate that 
16ac0 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  change..  */.  i
16ad0 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
16ae0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
16af0 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 3b 0a  st_item *pTerm;.
16b00 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
16b10 79 49 6e 66 6f 3b 0a 20 20 20 20 66 6f 72 28 69  yInfo;.    for(i
16b20 3d 30 2c 20 70 54 65 72 6d 3d 70 4f 72 64 65 72  =0, pTerm=pOrder
16b30 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64 65 72 42  By->a; i<pOrderB
16b40 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  y->nExpr; i++, p
16b50 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Term++){.      i
16b60 66 28 20 70 54 65 72 6d 2d 3e 7a 4e 61 6d 65 20  f( pTerm->zName 
16b70 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ){.        pTerm
16b80 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d  ->pExpr->pColl =
16b90 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
16ba0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 54  llSeq(pParse, pT
16bb0 65 72 6d 2d 3e 7a 4e 61 6d 65 2c 20 2d 31 29 3b  erm->zName, -1);
16bc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16bd0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
16be0 45 72 72 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Err ){.      got
16bf0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
16c00 20 20 7d 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f    }.    pKeyInfo
16c10 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
16c20 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
16c30 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 4f  OrderBy);.    pO
16c40 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
16c50 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
16c60 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  +;.    p->addrOp
16c70 65 6e 56 69 72 74 5b 32 5d 20 3d 20 61 64 64 72  enVirt[2] = addr
16c80 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20  SortIndex =.    
16c90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
16ca0 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74  3(v, OP_OpenVirt
16cb0 75 61 6c 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69  ual, pOrderBy->i
16cc0 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42  ECursor, pOrderB
16cd0 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 0a 20 20 20  y->nExpr+2, .   
16ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cf0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
16d00 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  Info, P3_KEYINFO
16d10 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c  _HANDOFF);.  }el
16d20 73 65 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74  se{.    addrSort
16d30 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a  Index = -1;.  }.
16d40 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69  .  /* Set the li
16d50 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45  miter..  */.  iE
16d60 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
16d70 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
16d80 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
16d90 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
16da0 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 49 66   iEnd);..  /* If
16db0 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64   the output is d
16dc0 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65  estined for a te
16dd0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f  mporary table, o
16de0 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  pen that table..
16df0 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
16e00 3d 3d 53 52 54 5f 56 69 72 74 75 61 6c 54 61 62  ==SRT_VirtualTab
16e10 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
16e20 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
16e30 70 65 6e 56 69 72 74 75 61 6c 2c 20 69 50 61 72  penVirtual, iPar
16e40 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  m, pEList->nExpr
16e50 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  );.  }..  /* Ope
16e60 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  n a virtual inde
16e70 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  x to use for the
16e80 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
16e90 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74   */.  if( isDist
16ea0 69 6e 63 74 20 29 7b 0a 20 20 20 20 4b 65 79 49  inct ){.    KeyI
16eb0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
16ec0 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50     distinct = pP
16ed0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
16ee0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
16ef0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
16f00 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
16f10 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
16f20 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
16f30 65 6e 56 69 72 74 75 61 6c 2c 20 64 69 73 74 69  enVirtual, disti
16f40 6e 63 74 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  nct, 0, .       
16f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f60 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
16f70 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P3_KEYINFO_HAN
16f80 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DOFF);.  }else{.
16f90 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d      distinct = -
16fa0 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 67 67  1;.  }..  /* Agg
16fb0 72 65 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d 61  regate and non-a
16fc0 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
16fd0 20 61 72 65 20 68 61 6e 64 6c 65 64 20 64 69 66   are handled dif
16fe0 66 65 72 65 6e 74 6c 79 20 2a 2f 0a 20 20 69 66  ferently */.  if
16ff0 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f  ( !isAgg && pGro
17000 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  upBy==0 ){.    /
17010 2a 20 54 68 69 73 20 63 61 73 65 20 69 73 20 66  * This case is f
17020 6f 72 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  or non-aggregate
17030 20 71 75 65 72 69 65 73 0a 20 20 20 20 2a 2a 20   queries.    ** 
17040 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61  Begin the databa
17050 73 65 20 73 63 61 6e 0a 20 20 20 20 2a 2f 0a 20  se scan.    */. 
17060 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
17070 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
17080 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
17090 70 57 68 65 72 65 2c 20 26 70 4f 72 64 65 72 42  pWhere, &pOrderB
170a0 79 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  y);.    if( pWIn
170b0 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
170c0 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a  ect_end;..    /*
170d0 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65   If sorting inde
170e0 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74  x that was creat
170f0 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50  ed by a prior OP
17100 5f 4f 70 65 6e 56 69 72 74 75 61 6c 20 0a 20 20  _OpenVirtual .  
17110 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
17120 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65   ended up not be
17130 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e  ing needed, then
17140 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f   change the OP_O
17150 70 65 6e 56 69 72 74 75 61 6c 0a 20 20 20 20 2a  penVirtual.    *
17160 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  * into an OP_Noo
17170 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  p..    */.    if
17180 28 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e  ( addrSortIndex>
17190 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d  =0 && pOrderBy==
171a0 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 63 72 65  0 ){.      uncre
171b0 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28  ateSortingIndex(
171c0 70 50 61 72 73 65 2c 20 61 64 64 72 53 6f 72 74  pParse, addrSort
171d0 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d  Index);.      p-
171e0 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d  >addrOpenVirt[2]
171f0 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20   = -1;.    }..  
17200 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61    /* Use the sta
17210 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70  ndard inner loop
17220 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17230 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
17240 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73  pParse, p, pELis
17250 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42  t, 0, 0, pOrderB
17260 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65  y, distinct, eDe
17270 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
17280 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20 70          iParm, p
17290 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
172a0 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
172b0 2c 20 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20  , aff) ){.      
172c0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
172d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
172e0 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
172f0 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
17300 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  */.    sqlite3Wh
17310 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
17320 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
17330 54 68 69 73 20 69 73 20 74 68 65 20 70 72 6f 63  This is the proc
17340 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
17350 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a  gate queries */.
17360 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
17370 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  sNC;    /* Name 
17380 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63  context for proc
17390 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
173a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
173b0 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20      int iAMem;  
173c0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
173d0 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
173e0 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74   storing current
173f0 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
17400 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20   int iBMem;     
17410 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
17420 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72  m address for pr
17430 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20  evious GROUP BY 
17440 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46  */.    int iUseF
17450 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  lag;       /* Me
17460 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e  m address holdin
17470 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e  g flag indicatin
17480 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a  g that at least.
17490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174a0 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72          ** one r
174b0 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ow of the input 
174c0 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  to the aggregato
174d0 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  r has been.     
174e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174f0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
17500 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72  */.    int iAbor
17510 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65  tFlag;     /* Me
17520 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20  m address which 
17530 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f  causes query abo
17540 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  rt if positive *
17550 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42  /.    int groupB
17560 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77  ySort;    /* Row
17570 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72  s come from sour
17580 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ce in GROUP BY o
17590 72 64 65 72 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a  rder */...    /*
175a0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
175b0 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 61 64  ariables hold ad
175c0 64 72 65 73 73 65 73 20 6f 72 20 6c 61 62 65 6c  dresses or label
175d0 73 20 66 6f 72 20 70 61 72 74 73 20 6f 66 20 74  s for parts of t
175e0 68 65 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61  he.    ** virtua
175f0 6c 20 6d 61 63 68 69 6e 65 20 70 72 6f 67 72 61  l machine progra
17600 6d 20 77 65 20 61 72 65 20 70 75 74 74 69 6e 67  m we are putting
17610 20 74 6f 67 65 74 68 65 72 20 2a 2f 0a 20 20 20   together */.   
17620 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52   int addrOutputR
17630 6f 77 3b 20 20 20 20 20 20 2f 2a 20 53 74 61 72  ow;      /* Star
17640 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20  t of subroutine 
17650 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72  that outputs a r
17660 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20  esult row */.   
17670 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72   int addrSetAbor
17680 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  t;       /* Set 
17690 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61  the abort flag a
176a0 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20  nd return */.   
176b0 20 69 6e 74 20 61 64 64 72 49 6e 69 74 69 61 6c   int addrInitial
176c0 69 7a 65 4c 6f 6f 70 3b 20 2f 2a 20 53 74 61 72  izeLoop; /* Star
176d0 74 20 6f 66 20 63 6f 64 65 20 74 68 61 74 20 69  t of code that i
176e0 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 69  nitializes the i
176f0 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
17700 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f   int addrTopOfLo
17710 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54 6f 70 20  op;      /* Top 
17720 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  of the input loo
17730 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  p */.    int add
17740 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 3b 20  rGroupByChange; 
17750 20 2f 2a 20 43 6f 64 65 20 74 68 61 74 20 72 75   /* Code that ru
17760 6e 73 20 77 68 65 6e 20 61 6e 79 20 47 52 4f 55  ns when any GROU
17770 50 20 42 59 20 74 65 72 6d 20 63 68 61 6e 67 65  P BY term change
17780 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  s */.    int add
17790 72 50 72 6f 63 65 73 73 52 6f 77 3b 20 20 20 20  rProcessRow;    
177a0 20 2f 2a 20 43 6f 64 65 20 74 6f 20 70 72 6f 63   /* Code to proc
177b0 65 73 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 70  ess a single inp
177c0 75 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e  ut row */.    in
177d0 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
177e0 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
177f0 61 6c 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 2a  all processing *
17800 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f  /.    int addrSo
17810 72 74 69 6e 67 49 64 78 3b 20 20 20 20 20 2f 2a  rtingIdx;     /*
17820 20 54 68 65 20 4f 50 5f 4f 70 65 6e 56 69 72 74   The OP_OpenVirt
17830 75 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74  ual for the sort
17840 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ing index */.   
17850 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20   int addrReset; 
17860 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72           /* Subr
17870 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74  outine for reset
17880 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c  ting the accumul
17890 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 61 64 64  ator */..    add
178a0 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  rEnd = sqlite3Vd
178b0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
178c0 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
178d0 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
178e0 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
178f0 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72  MN and make entr
17900 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41  ies in.    ** sA
17910 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54  ggInfo for all T
17920 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e  K_AGG_FUNCTION n
17930 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  odes in expressi
17940 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ons of the.    *
17950 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
17960 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  nt..    */.    m
17970 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
17980 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
17990 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
179a0 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53  arse;.    sNC.pS
179b0 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
179c0 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49  t;.    sNC.pAggI
179d0 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b  nfo = &sAggInfo;
179e0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53  .    sAggInfo.nS
179f0 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70  ortingColumn = p
17a00 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70  GroupBy ? pGroup
17a10 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b  By->nExpr+1 : 0;
17a20 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47  .    sAggInfo.pG
17a30 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
17a40 79 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  y;.    if( sqlit
17a50 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
17a60 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73  List(&sNC, pELis
17a70 74 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  t) ){.      goto
17a80 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
17a90 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
17aa0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
17ab0 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65  List(&sNC, pOrde
17ac0 72 42 79 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  rBy) ){.      go
17ad0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
17ae0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 48 61     }.    if( pHa
17af0 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65 33 45  ving && sqlite3E
17b00 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
17b10 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69  ates(&sNC, pHavi
17b20 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ng) ){.      got
17b30 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
17b40 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
17b50 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20  .nAccumulator = 
17b60 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
17b70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
17b80 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
17b90 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
17ba0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
17bb0 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
17bc0 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b   sAggInfo.aFunc[
17bd0 69 5d 2e 70 45 78 70 72 2d 3e 70 4c 69 73 74 29  i].pExpr->pList)
17be0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
17bf0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
17c00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
17c10 66 28 20 73 71 6c 69 74 65 33 54 73 64 28 29 2d  f( sqlite3Tsd()-
17c20 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
17c30 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
17c40 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73  ..    /* Process
17c50 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
17c60 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59  es with GROUP BY
17c70 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65   is very differe
17c80 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75  nt and.    ** mu
17c90 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20  ch more complex 
17ca0 74 68 61 20 61 67 67 72 65 67 61 74 65 73 20 77  tha aggregates w
17cb0 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42  ithout a GROUP B
17cc0 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  Y..    */.    if
17cd0 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
17ce0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
17cf0 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e  yInfo;  /* Keyin
17d00 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
17d10 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63  r the group by c
17d20 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 20 20 20 20  lause */..      
17d30 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73  /* Create labels
17d40 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65   that we will be
17d50 20 6e 65 65 64 69 6e 67 0a 20 20 20 20 20 20 2a   needing.      *
17d60 2f 0a 20 20 20 20 20 0a 20 20 20 20 20 20 61 64  /.     .      ad
17d70 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70  drInitializeLoop
17d80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
17d90 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
17da0 20 20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61    addrGroupByCha
17db0 6e 67 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nge = sqlite3Vdb
17dc0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
17dd0 20 20 20 20 20 61 64 64 72 50 72 6f 63 65 73 73       addrProcess
17de0 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
17df0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
17e00 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
17e10 65 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20  e is a GROUP BY 
17e20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20  clause we might 
17e30 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69  need a sorting i
17e40 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ndex to.      **
17e50 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20   implement it.  
17e60 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f  Allocate that so
17e70 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e  rting index now.
17e80 20 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75    If it turns ou
17e90 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  t.      ** that 
17ea0 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69  we do not need i
17eb0 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65  t after all, the
17ec0 20 4f 70 65 6e 56 69 72 74 75 61 6c 20 69 6e 73   OpenVirtual ins
17ed0 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  truction.      *
17ee0 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  * will be conver
17ef0 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e  ted into a Noop.
17f00 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20    .      */.    
17f10 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
17f20 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e  ngIdx = pParse->
17f30 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b  nTab++;.      pK
17f40 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
17f50 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
17f60 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a  rse, pGroupBy);.
17f70 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e        addrSortin
17f80 67 49 64 78 20 3d 0a 20 20 20 20 20 20 20 20 20  gIdx =.         
17f90 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
17fa0 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61  v, OP_OpenVirtua
17fb0 6c 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  l, sAggInfo.sort
17fc0 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20  ingIdx,.        
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fe0 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
17ff0 6e 67 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  ngColumn,.      
18000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18010 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
18020 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P3_KEYINFO_H
18030 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20  ANDOFF);..      
18040 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  /* Initialize me
18050 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75  mory locations u
18060 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20  sed by GROUP BY 
18070 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73  aggregate proces
18080 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sing.      */.  
18090 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 70      iUseFlag = p
180a0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
180b0 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20       iAbortFlag 
180c0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
180d0 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20  ;.      iAMem = 
180e0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
180f0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
18100 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45   += pGroupBy->nE
18110 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d  xpr;.      iBMem
18120 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   = pParse->nMem;
18130 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
18140 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
18150 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >nExpr;.      sq
18160 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
18170 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20  , OP_MemInt, 0, 
18180 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
18190 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
181a0 76 2c 20 22 23 20 63 6c 65 61 72 20 61 62 6f 72  v, "# clear abor
181b0 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
181c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
181d0 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20  p(v, OP_MemInt, 
181e0 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  0, iUseFlag);.  
181f0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
18200 28 76 2c 20 22 23 20 69 6e 64 69 63 61 74 65 20  (v, "# indicate 
18210 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74  accumulator empt
18220 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  y"));.      sqli
18230 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
18240 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
18250 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b  InitializeLoop);
18260 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
18270 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
18280 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
18290 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
182a0 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  e result.      *
182b0 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62  * set.  This sub
182c0 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f  routine first lo
182d0 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46  oks at the iUseF
182e0 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61  lag.  If iUseFla
182f0 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65  g.      ** is le
18300 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
18310 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75   to zero, the su
18320 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f  broutine is a no
18330 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a  -op.  If.      *
18340 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  * the processing
18350 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71   calls for the q
18360 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74  uery to abort, t
18370 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  his subroutine. 
18380 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e       ** incremen
18390 74 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61  ts the iAbortFla
183a0 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  g memory locatio
183b0 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  n before returni
183c0 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  ng in.      ** o
183d0 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74  rder to signal t
183e0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f  he caller to abo
183f0 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  rt..      */.   
18400 20 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20     addrSetAbort 
18410 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
18420 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
18430 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18440 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74  dOp(v, OP_MemInt
18450 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29  , 1, iAbortFlag)
18460 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
18470 65 6e 74 28 28 76 2c 20 22 23 20 73 65 74 20 61  ent((v, "# set a
18480 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
18490 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
184a0 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75 72  ddOp(v, OP_Retur
184b0 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
184c0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
184d0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
184e0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
184f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18500 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73  p(v, OP_IfMemPos
18510 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72  , iUseFlag, addr
18520 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20  OutputRow+2);.  
18530 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
18540 28 76 2c 20 22 23 20 47 72 6f 75 70 62 79 20 72  (v, "# Groupby r
18550 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20  esult generator 
18560 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a  entry point"));.
18570 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18580 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74  eAddOp(v, OP_Ret
18590 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  urn, 0, 0);.    
185a0 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e    finalizeAggFun
185b0 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26  ctions(pParse, &
185c0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
185d0 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
185e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
185f0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
18600 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
18610 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 31 29 3b  OutputRow+1, 1);
18620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
18630 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  c = selectInnerL
18640 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
18650 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  ->pEList, 0, 0, 
18660 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  pOrderBy,.      
18670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18680 20 20 20 20 20 64 69 73 74 69 6e 63 74 2c 20 65       distinct, e
18690 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20  Dest, iParm, .  
186a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186b0 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74           addrOut
186c0 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65  putRow+1, addrSe
186d0 74 41 62 6f 72 74 2c 20 61 66 66 29 3b 0a 20 20  tAbort, aff);.  
186e0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
186f0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
18700 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
18710 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18720 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75  AddOp(v, OP_Retu
18730 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  rn, 0, 0);.     
18740 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
18750 20 22 23 20 65 6e 64 20 67 72 6f 75 70 62 79 20   "# end groupby 
18760 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72  result generator
18770 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  "));..      /* G
18780 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
18790 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72  tine that will r
187a0 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62  eset the group-b
187b0 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20  y accumulator.  
187c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
187d0 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33  rReset = sqlite3
187e0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
187f0 76 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41  v);.      resetA
18800 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
18810 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
18820 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18830 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75  AddOp(v, OP_Retu
18840 72 6e 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20  rn, 0, 0);..    
18850 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f    /* Begin a loo
18860 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72  p that will extr
18870 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72  act all source r
18880 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20  ows in GROUP BY 
18890 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20  order..      ** 
188a0 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c  This might invol
188b0 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20  ve two separate 
188c0 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50  loops with an OP
188d0 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e  _Sort in between
188e0 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74  , or.      ** it
188f0 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67   might be a sing
18900 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65  le loop that use
18910 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78  s an index to ex
18920 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f  tract informatio
18930 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68  n.      ** in th
18940 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f  e right order to
18950 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20   begin with..   
18960 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
18970 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
18980 62 65 6c 28 76 2c 20 61 64 64 72 49 6e 69 74 69  bel(v, addrIniti
18990 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20 20 20  alizeLoop);.    
189a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
189b0 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  Op(v, OP_Gosub, 
189c0 30 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  0, addrReset);. 
189d0 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
189e0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
189f0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
18a00 2c 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f 75  , pWhere, &pGrou
18a10 70 42 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBy);.      if( 
18a20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
18a30 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
18a40 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d     if( pGroupBy=
18a50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
18a60 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69   The optimizer i
18a70 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65  s able to delive
18a80 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20  r rows in group 
18a90 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20  by order so.    
18aa0 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74      ** we do not
18ab0 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20   have to sort.  
18ac0 54 68 65 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75  The OP_OpenVirtu
18ad0 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  al table will be
18ae0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63  .        ** canc
18af0 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61  elled later beca
18b00 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65  use we still nee
18b10 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65  d to use the pKe
18b20 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f  yInfo.        */
18b30 0a 20 20 20 20 20 20 20 20 70 47 72 6f 75 70 42  .        pGroupB
18b40 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
18b50 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
18b60 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sort = 0;.      
18b70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
18b80 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e  * Rows are comin
18b90 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72  g out in undeter
18ba0 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65  mined order.  We
18bb0 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20   have to push.  
18bc0 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f        ** each ro
18bd0 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67  w into a sorting
18be0 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74   index, terminat
18bf0 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  e the first loop
18c00 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
18c10 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20  n loop over the 
18c20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e  sorting index in
18c30 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
18c40 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20  e output.       
18c50 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72   ** in sorted or
18c60 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  der.        */. 
18c70 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
18c80 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rt = 1;.        
18c90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
18ca0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
18cb0 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20  pGroupBy);.     
18cc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18cd0 64 4f 70 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e  dOp(v, OP_Sequen
18ce0 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  ce, sAggInfo.sor
18cf0 74 69 6e 67 49 64 78 2c 20 30 29 3b 0a 20 20 20  tingIdx, 0);.   
18d00 20 20 20 20 20 6a 20 3d 20 70 47 72 6f 75 70 42       j = pGroupB
18d10 79 2d 3e 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20  y->nExpr+1;.    
18d20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
18d30 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
18d40 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
18d50 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
18d60 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67  col *pCol = &sAg
18d70 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20  gInfo.aCol[i];. 
18d80 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
18d90 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
18da0 3c 6a 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  <j ) continue;. 
18db0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
18dc0 6c 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  l->iColumn<0 ){.
18dd0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
18de0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
18df0 4f 50 5f 52 6f 77 69 64 2c 20 70 43 6f 6c 2d 3e  OP_Rowid, pCol->
18e00 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20  iTable, 0);.    
18e10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18e20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18e30 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
18e40 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54  Column, pCol->iT
18e50 61 62 6c 65 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c  able, pCol->iCol
18e60 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  umn);.          
18e70 7d 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b  }.          j++;
18e80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18e90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18ea0 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
18eb0 63 6f 72 64 2c 20 6a 2c 20 30 29 3b 0a 20 20 20  cord, j, 0);.   
18ec0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18ed0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49  AddOp(v, OP_IdxI
18ee0 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  nsert, sAggInfo.
18ef0 73 6f 72 74 69 6e 67 49 64 78 2c 20 30 29 3b 0a  sortingIdx, 0);.
18f00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
18f10 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
18f20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18f30 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
18f40 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Sort, sAggInfo.s
18f50 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45  ortingIdx, addrE
18f60 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  nd);.        Vdb
18f70 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
18f80 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29  GROUP BY sort"))
18f90 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e  ;.        sAggIn
18fa0 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78  fo.useSortingIdx
18fb0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 1;.      }.. 
18fc0 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65       /* Evaluate
18fd0 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
18fe0 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20  UP BY terms and 
18ff0 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c  store in b0, b1,
19000 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20   b2....      ** 
19010 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f  (b0 is memory lo
19020 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20  cation iBMem+0, 
19030 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61  b1 is iBMem+1, a
19040 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20  nd so forth).   
19050 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61     ** Then compa
19060 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  re the current G
19070 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67  ROUP BY terms ag
19080 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20  ainst the GROUP 
19090 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a  BY terms.      *
190a0 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  * from the previ
190b0 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c  ous row currentl
190c0 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20  y stored in a0, 
190d0 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20  a1, a2....      
190e0 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  */.      addrTop
190f0 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  OfLoop = sqlite3
19100 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
19110 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  v);.      for(j=
19120 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; j<pGroupBy->n
19130 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
19140 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
19150 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ort ){.         
19160 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19170 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
19180 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
19190 49 64 78 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20  Idx, j);.       
191a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
191b0 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63    sAggInfo.direc
191c0 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20  tMode = 1;.     
191d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
191e0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72  Code(pParse, pGr
191f0 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70  oupBy->a[j].pExp
19200 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
19210 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19220 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
19230 53 74 6f 72 65 2c 20 69 42 4d 65 6d 2b 6a 2c 20  Store, iBMem+j, 
19240 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  j<pGroupBy->nExp
19250 72 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  r-1);.      }.  
19260 20 20 20 20 66 6f 72 28 6a 3d 70 47 72 6f 75 70      for(j=pGroup
19270 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 6a 3e 3d  By->nExpr-1; j>=
19280 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 20  0; j--){.       
19290 20 69 66 28 20 6a 3c 70 47 72 6f 75 70 42 79 2d   if( j<pGroupBy-
192a0 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20  >nExpr-1 ){.    
192b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
192c0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
192d0 4c 6f 61 64 2c 20 69 42 4d 65 6d 2b 6a 2c 20 30  Load, iBMem+j, 0
192e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
192f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19300 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c  AddOp(v, OP_MemL
19310 6f 61 64 2c 20 69 41 4d 65 6d 2b 6a 2c 20 30 29  oad, iAMem+j, 0)
19320 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  ;.        if( j=
19330 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
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 45 71 2c 20 30 78 32 30 30  (v, OP_Eq, 0x200
19360 2c 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77  , addrProcessRow
19370 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
19380 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
19390 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
193a0 4f 50 5f 4e 65 2c 20 30 78 32 30 30 2c 20 61 64  OP_Ne, 0x200, ad
193b0 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 29  drGroupByChange)
193c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
193d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
193e0 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28  hangeP3(v, -1, (
193f0 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2d 3e  void*)pKeyInfo->
19400 61 43 6f 6c 6c 5b 6a 5d 2c 20 50 33 5f 43 4f 4c  aColl[j], P3_COL
19410 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  LSEQ);.      }..
19420 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
19430 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73  e code that runs
19440 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52   whenever the GR
19450 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a  OUP BY changes..
19460 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 20        ** Change 
19470 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  in the GROUP BY 
19480 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20  are detected by 
19490 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
194a0 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  e.      ** block
194b0 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
194c0 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69   no changes, thi
194d0 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70  s block is skipp
194e0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
194f0 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
19500 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67  copies current g
19510 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e  roup by terms in
19520 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20   b0,b1,b2,....  
19530 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61      ** over to a
19540 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65  0,a1,a2.  It the
19550 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70  n calls the outp
19560 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  ut subroutine.  
19570 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74      ** and reset
19580 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  s the aggregate 
19590 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
195a0 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61  sters in prepara
195b0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f  tion.      ** fo
195c0 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50  r the next GROUP
195d0 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20   BY batch..     
195e0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
195f0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
19600 6c 28 76 2c 20 61 64 64 72 47 72 6f 75 70 42 79  l(v, addrGroupBy
19610 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 66  Change);.      f
19620 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70  or(j=0; j<pGroup
19630 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  By->nExpr; j++){
19640 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19650 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
19660 4d 65 6d 4d 6f 76 65 2c 20 69 41 4d 65 6d 2b 6a  MemMove, iAMem+j
19670 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
19680 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
19690 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
196a0 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 4f  _Gosub, 0, addrO
196b0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
196c0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
196d0 20 22 23 20 6f 75 74 70 75 74 20 6f 6e 65 20 72   "# output one r
196e0 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ow"));.      sql
196f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
19700 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 41   OP_IfMemPos, iA
19710 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e  bortFlag, addrEn
19720 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  d);.      VdbeCo
19730 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 63 68 65  mment((v, "# che
19740 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  ck abort flag"))
19750 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19760 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
19770 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 52 65 73  osub, 0, addrRes
19780 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  et);.      VdbeC
19790 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 72 65  omment((v, "# re
197a0 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22  set accumulator"
197b0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ));..      /* Up
197c0 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61  date the aggrega
197d0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20  te accumulators 
197e0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  based on the con
197f0 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tent of.      **
19800 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
19810 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
19820 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
19830 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 50  veLabel(v, addrP
19840 72 6f 63 65 73 73 52 6f 77 29 3b 0a 20 20 20 20  rocessRow);.    
19850 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
19860 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
19870 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
19880 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
19890 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20  , OP_MemInt, 1, 
198a0 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
198b0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
198c0 20 22 23 20 69 6e 64 69 63 61 74 65 20 64 61 74   "# indicate dat
198d0 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72  a in accumulator
198e0 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  "));..      /* E
198f0 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  nd of the loop. 
19900 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
19910 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
19920 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19930 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
19940 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Next, sAggInfo.s
19950 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54  ortingIdx, addrT
19960 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  opOfLoop);.     
19970 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19980 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
19990 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
199a0 20 75 6e 63 72 65 61 74 65 53 6f 72 74 69 6e 67   uncreateSorting
199b0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 61 64  Index(pParse, ad
199c0 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20  drSortingIdx);. 
199d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
199e0 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61   Output the fina
199f0 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a  l row of result.
19a00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
19a10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
19a20 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20  v, OP_Gosub, 0, 
19a30 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
19a40 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
19a50 74 28 28 76 2c 20 22 23 20 6f 75 74 70 75 74 20  t((v, "# output 
19a60 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 20 20  final row"));.  
19a70 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e      .    } /* en
19a80 64 69 66 20 70 47 72 6f 75 70 42 79 20 2a 2f 0a  dif pGroupBy */.
19a90 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20      else {.     
19aa0 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75   /* This case ru
19ab0 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67  ns if the aggreg
19ac0 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50  ate has no GROUP
19ad0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65   BY clause.  The
19ae0 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  .      ** proces
19af0 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d  sing is much sim
19b00 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65  pler since there
19b10 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   is only a singl
19b20 65 20 72 6f 77 0a 20 20 20 20 20 20 2a 2a 20 6f  e row.      ** o
19b30 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20  f output..      
19b40 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 74 41 63  */.      resetAc
19b50 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
19b60 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
19b70 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
19b80 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
19b90 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
19ba0 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20   pWhere, 0);.   
19bb0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
19bc0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
19bd0 6e 64 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65  nd;.      update
19be0 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
19bf0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
19c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
19c10 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
19c20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
19c30 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
19c40 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
19c50 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
19c60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 61 76  ;.      if( pHav
19c70 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
19c80 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
19c90 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
19ca0 67 2c 20 61 64 64 72 45 6e 64 2c 20 31 29 3b 0a  g, addrEnd, 1);.
19cb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65        }.      se
19cc0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
19cd0 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
19ce0 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c  st, 0, 0, 0, -1,
19cf0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
19d00 20 20 20 20 20 20 20 20 65 44 65 73 74 2c 20 69          eDest, i
19d10 50 61 72 6d 2c 20 61 64 64 72 45 6e 64 2c 20 61  Parm, addrEnd, a
19d20 64 64 72 45 6e 64 2c 20 61 66 66 29 3b 0a 20 20  ddrEnd, aff);.  
19d30 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
19d40 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
19d50 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  v, addrEnd);.   
19d60 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61   .  } /* endif a
19d70 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
19d80 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  /..  /* If there
19d90 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
19da0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20  clause, then we 
19db0 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65  need to sort the
19dc0 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e   results.  ** an
19dd0 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74  d send them to t
19de0 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20  he callback one 
19df0 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  by one..  */.  i
19e00 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
19e10 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
19e20 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76  ail(pParse, p, v
19e30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
19e40 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a   eDest, iParm);.
19e50 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
19e60 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
19e70 59 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77  Y.  /* If this w
19e80 61 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 77  as a subquery, w
19e90 65 20 68 61 76 65 20 6e 6f 77 20 63 6f 6e 76 65  e have now conve
19ea0 72 74 65 64 20 74 68 65 20 73 75 62 71 75 65 72  rted the subquer
19eb0 79 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 65  y into a.  ** te
19ec0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20  mporary table.  
19ed0 53 6f 20 64 65 6c 65 74 65 20 74 68 65 20 73 75  So delete the su
19ee0 62 71 75 65 72 79 20 73 74 72 75 63 74 75 72 65  bquery structure
19ef0 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
19f00 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74  .  ** to prevent
19f10 20 74 68 69 73 20 73 75 62 71 75 65 72 79 20 66   this subquery f
19f20 72 6f 6d 20 62 65 69 6e 67 20 65 76 61 6c 75 61  rom being evalua
19f30 74 65 64 20 61 67 61 69 6e 20 61 6e 64 20 74 6f  ted again and to
19f40 20 66 6f 72 63 65 20 74 68 65 0a 20 20 2a 2a 20   force the.  ** 
19f50 74 68 65 20 75 73 65 20 6f 66 20 74 68 65 20 74  the use of the t
19f60 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a  emporary table..
19f70 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65    */.  if( pPare
19f80 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nt ){.    assert
19f90 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d  ( pParent->pSrc-
19fa0 3e 6e 53 72 63 3e 70 61 72 65 6e 74 54 61 62 20  >nSrc>parentTab 
19fb0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
19fc0 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b  Parent->pSrc->a[
19fd0 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65  parentTab].pSele
19fe0 63 74 3d 3d 70 20 29 3b 0a 20 20 20 20 73 71 6c  ct==p );.    sql
19ff0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
1a000 28 70 29 3b 0a 20 20 20 20 70 50 61 72 65 6e 74  (p);.    pParent
1a010 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74  ->pSrc->a[parent
1a020 54 61 62 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30  Tab].pSelect = 0
1a030 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1a040 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
1a050 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a  skip this query.
1a060 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1a070 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1a080 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54  , iEnd);..  /* T
1a090 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75  he SELECT was su
1a0a0 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64  ccessfully coded
1a0b0 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75  .   Set the retu
1a0c0 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a  rn code to 0.  *
1a0d0 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f  * to indicate no
1a0e0 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20   errors..  */.  
1a0f0 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  rc = 0;..  /* Co
1a100 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68  ntrol jumps to h
1a110 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ere if an error 
1a120 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  is encountered a
1a130 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20  bove, or upon.  
1a140 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f  ** successful co
1a150 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45  ding of the SELE
1a160 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f  CT..  */.select_
1a170 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46 72 65  end:.  sqliteFre
1a180 65 28 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29  e(sAggInfo.aCol)
1a190 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 73  ;.  sqliteFree(s
1a1a0 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a  AggInfo.aFunc);.
1a1b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a       return rc;.}.