/ Hex Artifact Content
Login

Artifact 0e4d3627fec4a445b45f6cb471f68aab9c97a8b3:


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 31  select.c,v 1.281
0200: 20 32 30 30 35 2f 31 32 2f 30 36 20 31 32 3a 35   2005/12/06 12:5
0210: 32 3a 35 39 20 64 61 6e 69 65 6c 6b 31 39 37 37  2:59 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 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72  Cmp(p->z, keywor
0d60: 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20  ds[j].zKeyword, 
0d70: 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p->n)==0 ){.    
0d80: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
0d90: 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65  keywords[j].code
0da0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
0db0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
0dc0: 20 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f 66     if( j>=sizeof
0dd0: 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f  (keywords)/sizeo
0de0: 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20 29  f(keywords[0]) )
0df0: 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  {.      jointype
0e00: 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20   |= JT_ERROR;.  
0e10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0e20: 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20  .  }.  if(.     
0e30: 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  (jointype & (JT_
0e40: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29  INNER|JT_OUTER))
0e50: 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  ==(JT_INNER|JT_O
0e60: 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a  UTER) ||.     (j
0e70: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52  ointype & JT_ERR
0e80: 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  OR)!=0.  ){.    
0e90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 31  const char *zSp1
0ea0: 20 3d 20 22 20 22 3b 0a 20 20 20 20 63 6f 6e 73   = " ";.    cons
0eb0: 74 20 63 68 61 72 20 2a 7a 53 70 32 20 3d 20 22  t char *zSp2 = "
0ec0: 20 22 3b 0a 20 20 20 20 69 66 28 20 70 42 3d 3d   ";.    if( pB==
0ed0: 30 20 29 7b 20 7a 53 70 31 2b 2b 3b 20 7d 0a 20  0 ){ zSp1++; }. 
0ee0: 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20     if( pC==0 ){ 
0ef0: 7a 53 70 32 2b 2b 3b 20 7d 0a 20 20 20 20 73 71  zSp2++; }.    sq
0f00: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
0f10: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f  arse, "unknown o
0f20: 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f  r unsupported jo
0f30: 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20  in type: ".     
0f40: 20 20 22 25 54 25 73 25 54 25 73 25 54 22 2c 20    "%T%s%T%s%T", 
0f50: 70 41 2c 20 7a 53 70 31 2c 20 70 42 2c 20 7a 53  pA, zSp1, pB, zS
0f60: 70 32 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69  p2, pC);.    joi
0f70: 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52  ntype = JT_INNER
0f80: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f  ;.  }else if( jo
0f90: 69 6e 74 79 70 65 20 26 20 4a 54 5f 52 49 47 48  intype & JT_RIGH
0fa0: 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
0fb0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
0fc0: 20 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61   .      "RIGHT a
0fd0: 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f  nd FULL OUTER JO
0fe0: 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72  INs are not curr
0ff0: 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22  ently supported"
1000: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
1010: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a  = JT_INNER;.  }.
1020: 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70    return jointyp
1030: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
1040: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  rn the index of 
1050: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61  a column in a ta
1060: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  ble.  Return -1 
1070: 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a  if the column.**
1080: 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
1090: 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  d in the table..
10a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
10b0: 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20  lumnIndex(Table 
10c0: 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61  *pTab, const cha
10d0: 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  r *zCol){.  int 
10e0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
10f0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
1100: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1110: 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61  3StrICmp(pTab->a
1120: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43  Col[i].zName, zC
1130: 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ol)==0 ) return 
1140: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
1150: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  -1;.}../*.** Set
1160: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
1170: 74 6f 6b 65 6e 20 74 6f 20 61 20 27 5c 30 30 30  token to a '\000
1180: 27 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  '-terminated str
1190: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
11a0: 6f 69 64 20 73 65 74 54 6f 6b 65 6e 28 54 6f 6b  oid setToken(Tok
11b0: 65 6e 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  en *p, const cha
11c0: 72 20 2a 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20  r *z){.  p->z = 
11d0: 7a 3b 0a 20 20 70 2d 3e 6e 20 3d 20 7a 20 3f 20  z;.  p->n = z ? 
11e0: 73 74 72 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20  strlen(z) : 0;. 
11f0: 20 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a 7d 0a 0a   p->dyn = 0;.}..
1200: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 20  /*.** Create an 
1210: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
1220: 66 6f 72 20 61 6e 20 69 64 65 6e 74 69 66 69 65  for an identifie
1230: 72 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  r with the name 
1240: 6f 66 20 7a 4e 61 6d 65 0a 2a 2f 0a 73 74 61 74  of zName.*/.stat
1250: 69 63 20 45 78 70 72 20 2a 63 72 65 61 74 65 49  ic Expr *createI
1260: 64 45 78 70 72 28 63 6f 6e 73 74 20 63 68 61 72  dExpr(const char
1270: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 54 6f 6b 65   *zName){.  Toke
1280: 6e 20 64 75 6d 6d 79 3b 0a 20 20 73 65 74 54 6f  n dummy;.  setTo
1290: 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a 4e 61 6d  ken(&dummy, zNam
12a0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e);.  return sql
12b0: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20  ite3Expr(TK_ID, 
12c0: 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 7d  0, 0, &dummy);.}
12d0: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 74  .../*.** Add a t
12e0: 65 72 6d 20 74 6f 20 74 68 65 20 57 48 45 52 45  erm to the WHERE
12f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 2a   expression in *
1300: 70 70 45 78 70 72 20 74 68 61 74 20 72 65 71 75  ppExpr that requ
1310: 69 72 65 73 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c  ires the.** zCol
1320: 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 65 71   column to be eq
1330: 75 61 6c 20 69 6e 20 74 68 65 20 74 77 6f 20 74  ual in the two t
1340: 61 62 6c 65 73 20 70 54 61 62 31 20 61 6e 64 20  ables pTab1 and 
1350: 70 54 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  pTab2..*/.static
1360: 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65   void addWhereTe
1370: 72 6d 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  rm(.  const char
1380: 20 2a 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20 2f   *zCol,        /
1390: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
13a0: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lumn */.  const 
13b0: 54 61 62 6c 65 20 2a 70 54 61 62 31 2c 20 20 20  Table *pTab1,   
13c0: 20 20 20 2f 2a 20 46 69 72 73 74 20 74 61 62 6c     /* First tabl
13d0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
13e0: 72 20 2a 7a 41 6c 69 61 73 31 2c 20 20 20 20 20  r *zAlias1,     
13f0: 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 66 69 72  /* Alias for fir
1400: 73 74 20 74 61 62 6c 65 2e 20 20 4d 61 79 20 62  st table.  May b
1410: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73  e NULL */.  cons
1420: 74 20 54 61 62 6c 65 20 2a 70 54 61 62 32 2c 20  t Table *pTab2, 
1430: 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 74       /* Second t
1440: 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  able */.  const 
1450: 63 68 61 72 20 2a 7a 41 6c 69 61 73 32 2c 20 20  char *zAlias2,  
1460: 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20     /* Alias for 
1470: 73 65 63 6f 6e 64 20 74 61 62 6c 65 2e 20 20 4d  second table.  M
1480: 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1490: 69 6e 74 20 69 52 69 67 68 74 4a 6f 69 6e 54 61  int iRightJoinTa
14a0: 62 6c 65 2c 20 20 20 20 20 2f 2a 20 56 44 42 45  ble,     /* VDBE
14b0: 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
14c0: 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20  right table */. 
14d0: 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72 20 20   Expr **ppExpr  
14e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
14f0: 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65   the equality te
1500: 72 6d 20 74 6f 20 74 68 69 73 20 65 78 70 72 65  rm to this expre
1510: 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78  ssion */.){.  Ex
1520: 70 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c  pr *pE1a, *pE1b,
1530: 20 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a   *pE1c;.  Expr *
1540: 70 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45  pE2a, *pE2b, *pE
1550: 32 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a  2c;.  Expr *pE;.
1560: 0a 20 20 70 45 31 61 20 3d 20 63 72 65 61 74 65  .  pE1a = create
1570: 49 64 45 78 70 72 28 7a 43 6f 6c 29 3b 0a 20 20  IdExpr(zCol);.  
1580: 70 45 32 61 20 3d 20 63 72 65 61 74 65 49 64 45  pE2a = createIdE
1590: 78 70 72 28 7a 43 6f 6c 29 3b 0a 20 20 69 66 28  xpr(zCol);.  if(
15a0: 20 7a 41 6c 69 61 73 31 3d 3d 30 20 29 7b 0a 20   zAlias1==0 ){. 
15b0: 20 20 20 7a 41 6c 69 61 73 31 20 3d 20 70 54 61     zAlias1 = pTa
15c0: 62 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  b1->zName;.  }. 
15d0: 20 70 45 31 62 20 3d 20 63 72 65 61 74 65 49 64   pE1b = createId
15e0: 45 78 70 72 28 7a 41 6c 69 61 73 31 29 3b 0a 20  Expr(zAlias1);. 
15f0: 20 69 66 28 20 7a 41 6c 69 61 73 32 3d 3d 30 20   if( zAlias2==0 
1600: 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73 32 20 3d  ){.    zAlias2 =
1610: 20 70 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20   pTab2->zName;. 
1620: 20 7d 0a 20 20 70 45 32 62 20 3d 20 63 72 65 61   }.  pE2b = crea
1630: 74 65 49 64 45 78 70 72 28 7a 41 6c 69 61 73 32  teIdExpr(zAlias2
1640: 29 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c 69  );.  pE1c = sqli
1650: 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20  te3Expr(TK_DOT, 
1660: 70 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b 0a  pE1b, pE1a, 0);.
1670: 20 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65 33    pE2c = sqlite3
1680: 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45 32  Expr(TK_DOT, pE2
1690: 62 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70  b, pE2a, 0);.  p
16a0: 45 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  E = sqlite3Expr(
16b0: 54 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45 32  TK_EQ, pE1c, pE2
16c0: 63 2c 20 30 29 3b 0a 20 20 45 78 70 72 53 65 74  c, 0);.  ExprSet
16d0: 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
16e0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 70 45 2d  FromJoin);.  pE-
16f0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
1700: 20 3d 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62   = iRightJoinTab
1710: 6c 65 3b 0a 20 20 2a 70 70 45 78 70 72 20 3d 20  le;.  *ppExpr = 
1720: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 2a  sqlite3ExprAnd(*
1730: 70 70 45 78 70 72 2c 20 70 45 29 3b 0a 7d 0a 0a  ppExpr, pE);.}..
1740: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50  /*.** Set the EP
1750: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
1760: 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20  ty on all terms 
1770: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  of the given exp
1780: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20  ression..** And 
1790: 73 65 74 20 74 68 65 20 45 78 70 72 2e 69 52 69  set the Expr.iRi
17a0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20  ghtJoinTable to 
17b0: 69 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79  iTable for every
17c0: 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20   term in the.** 
17d0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
17e0: 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  * The EP_FromJoi
17f0: 6e 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73  n property is us
1800: 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61  ed on terms of a
1810: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  n expression to 
1820: 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54  tell.** the LEFT
1830: 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63   OUTER JOIN proc
1840: 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61  essing logic tha
1850: 74 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70  t this term is p
1860: 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f  art of the.** jo
1870: 69 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73  in restriction s
1880: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
1890: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
18a0: 73 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72  se and not a par
18b0: 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65  t.** of the more
18c0: 20 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63   general WHERE c
18d0: 6c 61 75 73 65 2e 20 20 54 68 65 73 65 20 74 65  lause.  These te
18e0: 72 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76  rms are moved ov
18f0: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45  er to the.** WHE
1900: 52 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67  RE clause during
1910: 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67   join processing
1920: 20 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20   but we need to 
1930: 72 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68  remember that th
1940: 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64  ey.** originated
1950: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
1960: 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ING clause..**.*
1970: 2a 20 54 68 65 20 45 78 70 72 2e 69 52 69 67 68  * The Expr.iRigh
1980: 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73  tJoinTable tells
1990: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
19a0: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61  e processing tha
19b0: 74 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  t the.** express
19c0: 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ion depends on t
19d0: 61 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54  able iRightJoinT
19e0: 61 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61  able even if tha
19f0: 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a  t table is not.*
1a00: 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e  * explicitly men
1a10: 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78  tioned in the ex
1a20: 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20  pression.  That 
1a30: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e  information is n
1a40: 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73  eeded.** for cas
1a50: 65 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  es like this:.**
1a60: 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
1a70: 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
1a80: 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
1a90: 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a  b AND t1.x=5.**.
1aa0: 2a 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c 61  ** The where cla
1ab0: 75 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66  use needs to def
1ac0: 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20  er the handling 
1ad0: 6f 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a  of the t1.x=5.**
1ae0: 20 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65   term until afte
1af0: 72 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66  r the t2 loop of
1b00: 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74   the join.  In t
1b10: 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55  hat way, a.** NU
1b20: 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62  LL t2 row will b
1b30: 65 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65  e inserted whene
1b40: 76 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66  ver t1.x!=5.  If
1b50: 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65   we do not.** de
1b60: 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67  fer the handling
1b70: 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77   of t1.x=5, it w
1b80: 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64  ill be processed
1b90: 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20   immediately.** 
1ba0: 61 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f  after the t1 loo
1bb0: 70 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20  p and rows with 
1bc0: 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76  t1.x!=5 will nev
1bd0: 65 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20  er appear in.** 
1be0: 74 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63  the output, whic
1bf0: 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a  h is incorrect..
1c00: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1c10: 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20  etJoinExpr(Expr 
1c20: 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b  *p, int iTable){
1c30: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
1c40: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
1c50: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
1c60: 6e 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67 68  n);.    p->iRigh
1c70: 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 69 54 61  tJoinTable = iTa
1c80: 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e  ble;.    setJoin
1c90: 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69  Expr(p->pLeft, i
1ca0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20  Table);.    p = 
1cb0: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a  p->pRight;.  } .
1cc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1cd0: 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20  utine processes 
1ce0: 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61  the join informa
1cf0: 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43  tion for a SELEC
1d00: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
1d10: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
1d20: 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74  uses are convert
1d30: 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65  ed into extra te
1d40: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
1d50: 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55   clause..** NATU
1d60: 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63  RAL joins also c
1d70: 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52  reate extra WHER
1d80: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  E clause terms..
1d90: 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20  **.** The terms 
1da0: 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  of a FROM clause
1db0: 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
1dc0: 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72  n the Select.pSr
1dd0: 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  c structure..** 
1de0: 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61  The left most ta
1df0: 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73 74  ble is the first
1e00: 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74   entry in Select
1e10: 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67 68  .pSrc.  The righ
1e20: 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20  t-most.** table 
1e30: 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  is the last entr
1e40: 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65  y.  The join ope
1e50: 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e  rator is held in
1e60: 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a   the entry to.**
1e70: 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73   the left.  Thus
1e80: 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e   entry 0 contain
1e90: 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  s the join opera
1ea0: 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e  tor for the join
1eb0: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72   between.** entr
1ec0: 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e  ies 0 and 1.  An
1ed0: 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  y ON or USING cl
1ee0: 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65 64  auses associated
1ef0: 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61   with the join a
1f00: 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63  re.** also attac
1f10: 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20  hed to the left 
1f20: 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  entry..**.** Thi
1f30: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1f40: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1f50: 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
1f60: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1f70: 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  t sqliteProcessJ
1f80: 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  oin(Parse *pPars
1f90: 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
1fa0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc0: 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69   /* All tables i
1fd0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1fe0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  e */.  int i, j;
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2000: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2010: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72  ounters */.  str
2020: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2030: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20   *pLeft;     /* 
2040: 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67  Left table being
2050: 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72   joined */.  str
2060: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2070: 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20   *pRight;    /* 
2080: 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e  Right table bein
2090: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70  g joined */..  p
20a0: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
20b0: 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e   pLeft = &pSrc->
20c0: 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d  a[0];.  pRight =
20d0: 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f   &pLeft[1];.  fo
20e0: 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
20f0: 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67  Src-1; i++, pRig
2100: 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a  ht++, pLeft++){.
2110: 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74      Table *pLeft
2120: 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61  Tab = pLeft->pTa
2130: 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52  b;.    Table *pR
2140: 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68 74  ightTab = pRight
2150: 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 69 66 28  ->pTab;..    if(
2160: 20 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c 7c 20   pLeftTab==0 || 
2170: 70 52 69 67 68 74 54 61 62 3d 3d 30 20 29 20 63  pRightTab==0 ) c
2180: 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
2190: 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41   When the NATURA
21a0: 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  L keyword is pre
21b0: 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20  sent, add WHERE 
21c0: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72  clause terms for
21d0: 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f  .    ** every co
21e0: 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77  lumn that the tw
21f0: 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e  o tables have in
2200: 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a   common..    */.
2210: 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6a      if( pLeft->j
2220: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
2230: 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66  URAL ){.      if
2240: 28 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 7c 7c 20  ( pLeft->pOn || 
2250: 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 20 29 7b  pLeft->pUsing ){
2260: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2270: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2280: 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e   "a NATURAL join
2290: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a   may not have ".
22a0: 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f             "an O
22b0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
22c0: 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  e", 0);.        
22d0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
22e0: 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
22f0: 20 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e 43 6f   j<pLeftTab->nCo
2300: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
2310: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
2320: 4c 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  LeftTab->aCol[j]
2330: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
2340: 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  if( columnIndex(
2350: 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65  pRightTab, zName
2360: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
2370: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 7a    addWhereTerm(z
2380: 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20  Name, pLeftTab, 
2390: 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a  pLeft->zAlias, .
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52                pR
23c0: 69 67 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d  ightTab, pRight-
23d0: 3e 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20  >zAlias,.       
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 69         pRight->i
2400: 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68 65  Cursor, &p->pWhe
2410: 72 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 0a  re);.          .
2420: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2430: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2440: 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e  Disallow both ON
2450: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
2460: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
2470: 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oin.    */.    i
2480: 66 28 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 26 26  f( pLeft->pOn &&
2490: 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 20 29   pLeft->pUsing )
24a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
24b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
24c0: 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74  "cannot have bot
24d0: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22  h ON and USING "
24e0: 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65  .        "clause
24f0: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
2500: 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  in");.      retu
2510: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
2520: 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63   /* Add the ON c
2530: 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64  lause to the end
2540: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2550: 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20  ause, connected 
2560: 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44  by.    ** an AND
2570: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
2580: 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  /.    if( pLeft-
2590: 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 73 65  >pOn ){.      se
25a0: 74 4a 6f 69 6e 45 78 70 72 28 70 4c 65 66 74 2d  tJoinExpr(pLeft-
25b0: 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43  >pOn, pRight->iC
25c0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d  ursor);.      p-
25d0: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
25e0: 33 45 78 70 72 41 6e 64 28 70 2d 3e 70 57 68 65  3ExprAnd(p->pWhe
25f0: 72 65 2c 20 70 4c 65 66 74 2d 3e 70 4f 6e 29 3b  re, pLeft->pOn);
2600: 0a 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 70 4f  .      pLeft->pO
2610: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
2620: 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72    /* Create extr
2630: 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57  a terms on the W
2640: 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
2650: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  each column name
2660: 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  d.    ** in the 
2670: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45  USING clause.  E
2680: 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74  xample: If the t
2690: 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  wo tables to be 
26a0: 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20  joined are .    
26b0: 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74  ** A and B and t
26c0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
26d0: 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20  names X, Y, and 
26e0: 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73  Z, then add this
26f0: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57  .    ** to the W
2700: 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20  HERE clause:    
2710: 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d  A.X=B.X AND A.Y=
2720: 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a  B.Y AND A.Z=B.Z.
2730: 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e      ** Report an
2740: 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f   error if any co
2750: 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69  lumn mentioned i
2760: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
2770: 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  se is.    ** not
2780: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f   contained in bo
2790: 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  th tables to be 
27a0: 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  joined..    */. 
27b0: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 70 55     if( pLeft->pU
27c0: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64  sing ){.      Id
27d0: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 4c  List *pList = pL
27e0: 65 66 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20  eft->pUsing;.   
27f0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
2800: 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a  ist->nId; j++){.
2810: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
2820: 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a  ame = pList->a[j
2830: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
2840: 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78   if( columnIndex
2850: 28 70 4c 65 66 74 54 61 62 2c 20 7a 4e 61 6d 65  (pLeftTab, zName
2860: 29 3c 30 20 7c 7c 20 63 6f 6c 75 6d 6e 49 6e 64  )<0 || columnInd
2870: 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e  ex(pRightTab, zN
2880: 61 6d 65 29 3c 30 20 29 7b 0a 20 20 20 20 20 20  ame)<0 ){.      
2890: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
28a0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
28b0: 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63  not join using c
28c0: 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d  olumn %s - colum
28d0: 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  n ".            
28e0: 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20  "not present in 
28f0: 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e  both tables", zN
2900: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2910: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
2920: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57    }.        addW
2930: 68 65 72 65 54 65 72 6d 28 7a 4e 61 6d 65 2c 20  hereTerm(zName, 
2940: 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66 74 2d  pLeftTab, pLeft-
2950: 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20 20 20  >zAlias, .      
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2970: 20 20 20 20 20 20 70 52 69 67 68 74 54 61 62 2c        pRightTab,
2980: 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c   pRight->zAlias,
2990: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
29b0: 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20 26 70  ght->iCursor, &p
29c0: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20  ->pWhere);.     
29d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
29e0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
29f0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69 76  * Delete the giv
2a00: 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  en Select struct
2a10: 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ure and all of i
2a20: 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73  ts substructures
2a30: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2a40: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 53 65  3SelectDelete(Se
2a50: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20  lect *p){.  if( 
2a60: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
2a70: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2a80: 44 65 6c 65 74 65 28 70 2d 3e 70 45 4c 69 73 74  Delete(p->pEList
2a90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  );.  sqlite3SrcL
2aa0: 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 53 72  istDelete(p->pSr
2ab0: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  c);.  sqlite3Exp
2ac0: 72 44 65 6c 65 74 65 28 70 2d 3e 70 57 68 65 72  rDelete(p->pWher
2ad0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
2ae0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70  rListDelete(p->p
2af0: 47 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69  GroupBy);.  sqli
2b00: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d  te3ExprDelete(p-
2b10: 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 73 71 6c  >pHaving);.  sql
2b20: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
2b30: 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  te(p->pOrderBy);
2b40: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
2b50: 44 65 6c 65 74 65 28 70 2d 3e 70 50 72 69 6f 72  Delete(p->pPrior
2b60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
2b70: 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74  Delete(p->pLimit
2b80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
2b90: 44 65 6c 65 74 65 28 70 2d 3e 70 4f 66 66 73 65  Delete(p->pOffse
2ba0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  t);.  sqliteFree
2bb0: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  (p);.}../*.** In
2bc0: 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22  sert code into "
2bd0: 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  v" that will pus
2be0: 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20  h the record on 
2bf0: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a  the top of the.*
2c00: 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65  * stack into the
2c10: 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74   sorter..*/.stat
2c20: 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f  ic void pushOnto
2c30: 53 6f 72 74 65 72 28 50 61 72 73 65 20 2a 70 50  Sorter(Parse *pP
2c40: 61 72 73 65 2c 20 56 64 62 65 20 2a 76 2c 20 45  arse, Vdbe *v, E
2c50: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
2c60: 79 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  y){.  sqlite3Exp
2c70: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
2c80: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29 3b  arse, pOrderBy);
2c90: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
2ca0: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e  dOp(v, OP_Sequen
2cb0: 63 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  ce, pOrderBy->iE
2cc0: 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 73 71  Cursor, 0);.  sq
2cd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
2ce0: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 70 4f 72 64 65  , OP_Pull, pOrde
2cf0: 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31 2c 20  rBy->nExpr + 1, 
2d00: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
2d10: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
2d20: 65 52 65 63 6f 72 64 2c 20 70 4f 72 64 65 72 42  eRecord, pOrderB
2d30: 79 2d 3e 6e 45 78 70 72 20 2b 20 32 2c 20 30 29  y->nExpr + 2, 0)
2d40: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
2d50: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e  ddOp(v, OP_IdxIn
2d60: 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e  sert, pOrderBy->
2d70: 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 7d 0a  iECursor, 0);.}.
2d80: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
2d90: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
2da0: 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69   OFFSET.*/.stati
2db0: 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65  c void codeOffse
2dc0: 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  t(.  Vdbe *v,   
2dd0: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
2de0: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
2df0: 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74  s VM */.  Select
2e00: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *p,        /* T
2e10: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
2e20: 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ent being coded 
2e30: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
2e40: 75 65 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  ue,    /* Jump h
2e50: 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20  ere to skip the 
2e60: 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a  current record *
2e70: 2f 0a 20 20 69 6e 74 20 6e 50 6f 70 20 20 20 20  /.  int nPop    
2e80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2e90: 6f 66 20 74 69 6d 65 73 20 74 6f 20 70 6f 70 20  of times to pop 
2ea0: 73 74 61 63 6b 20 77 68 65 6e 20 6a 75 6d 70 69  stack when jumpi
2eb0: 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  ng */.){.  if( p
2ec0: 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20 26 26 20  ->iOffset>=0 && 
2ed0: 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 7b 0a  iContinue!=0 ){.
2ee0: 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73      int addr = s
2ef0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2f00: 74 41 64 64 72 28 76 29 20 2b 20 33 3b 0a 20 20  tAddr(v) + 3;.  
2f10: 20 20 69 66 28 20 6e 50 6f 70 3e 30 20 29 20 61    if( nPop>0 ) a
2f20: 64 64 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  ddr++;.    sqlit
2f30: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2f40: 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4f  P_MemIncr, p->iO
2f50: 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 73  ffset, 0);.    s
2f60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2f70: 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20  v, OP_IfMemPos, 
2f80: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
2f90: 29 3b 0a 20 20 20 20 69 66 28 20 6e 50 6f 70 3e  );.    if( nPop>
2fa0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2fb0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2fc0: 50 5f 50 6f 70 2c 20 6e 50 6f 70 2c 20 30 29 3b  P_Pop, nPop, 0);
2fd0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2fe0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2ff0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74  P_Goto, 0, iCont
3000: 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43  inue);.    VdbeC
3010: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 6b  omment((v, "# sk
3020: 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64  ip OFFSET record
3030: 73 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  s"));.  }.}../*.
3040: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74  ** Add code that
3050: 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d   will check to m
3060: 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 6f 70  ake sure the top
3070: 20 4e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74   N elements of t
3080: 68 65 0a 2a 2a 20 73 74 61 63 6b 20 61 72 65 20  he.** stack are 
3090: 64 69 73 74 69 6e 63 74 2e 20 20 69 54 61 62 20  distinct.  iTab 
30a0: 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  is a sorting ind
30b0: 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72  ex that holds pr
30c0: 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e  eviously.** seen
30d0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
30e0: 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20   the N values.  
30f0: 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d  A new entry is m
3100: 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69  ade in iTab.** i
3110: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20  f the current N 
3120: 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a  values are new..
3130: 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20  **.** A jump to 
3140: 61 64 64 72 52 65 70 65 61 74 20 69 73 20 6d 61  addrRepeat is ma
3150: 64 65 20 61 6e 64 20 74 68 65 20 4b 20 76 61 6c  de and the K val
3160: 75 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66  ues are popped f
3170: 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b  rom the.** stack
3180: 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c   if the top N el
3190: 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64  ements are not d
31a0: 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74  istinct..*/.stat
31b0: 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74  ic void codeDist
31c0: 69 6e 63 74 28 0a 20 20 56 64 62 65 20 2a 76 2c  inct(.  Vdbe *v,
31d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
31e0: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
31f0: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
3200: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
3210: 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e   /* A sorting in
3220: 64 65 78 20 75 73 65 64 20 74 6f 20 74 65 73 74  dex used to test
3230: 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73   for distinctnes
3240: 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52  s */.  int addrR
3250: 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d  epeat,    /* Jum
3260: 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74  p to here if not
3270: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69   distinct */.  i
3280: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
3290: 20 20 2f 2a 20 54 68 65 20 74 6f 70 20 4e 20 65    /* The top N e
32a0: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
32b0: 74 61 63 6b 20 6d 75 73 74 20 62 65 20 64 69 73  tack must be dis
32c0: 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4b  tinct */.  int K
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32e0: 20 50 6f 70 20 4b 20 65 6c 65 6d 65 6e 74 73 20   Pop K elements 
32f0: 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 69  from the stack i
3300: 66 20 69 6e 64 69 73 74 69 6e 63 74 20 2a 2f 0a  f indistinct */.
3310: 29 7b 0a 23 69 66 20 4e 55 4c 4c 5f 41 4c 57 41  ){.#if NULL_ALWA
3320: 59 53 5f 44 49 53 54 49 4e 43 54 0a 20 20 73 71  YS_DISTINCT.  sq
3330: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3340: 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 4e 2c  , OP_IsNull, -N,
3350: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
3360: 65 6e 74 41 64 64 72 28 76 29 2b 36 29 3b 0a 23  entAddr(v)+6);.#
3370: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56  endif.  sqlite3V
3380: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
3390: 61 6b 65 52 65 63 6f 72 64 2c 20 2d 4e 2c 20 30  akeRecord, -N, 0
33a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
33b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69 73 74  AddOp(v, OP_Dist
33c0: 69 6e 63 74 2c 20 69 54 61 62 2c 20 73 71 6c 69  inct, iTab, sqli
33d0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
33e0: 64 72 28 76 29 2b 33 29 3b 0a 20 20 73 71 6c 69  dr(v)+3);.  sqli
33f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3400: 4f 50 5f 50 6f 70 2c 20 4b 2c 20 30 29 3b 0a 20  OP_Pop, K, 0);. 
3410: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3420: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
3430: 20 61 64 64 72 52 65 70 65 61 74 29 3b 0a 20 20   addrRepeat);.  
3440: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
3450: 22 23 20 73 6b 69 70 20 69 6e 64 69 73 74 69 6e  "# skip indistin
3460: 63 74 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20  ct records"));. 
3470: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3480: 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  p(v, OP_IdxInser
3490: 74 2c 20 69 54 61 62 2c 20 30 29 3b 0a 7d 0a 0a  t, iTab, 0);.}..
34a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
34b0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
34c0: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69  e code for the i
34d0: 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e  nside of the inn
34e0: 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20  er loop.** of a 
34f0: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  SELECT..**.** If
3500: 20 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c   srcTab and nCol
3510: 75 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72  umn are both zer
3520: 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69  o, then the pELi
3530: 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  st expressions.*
3540: 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  * are evaluated 
3550: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
3560: 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69  the data for thi
3570: 73 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75  s row.  If nColu
3580: 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74  mn>0.** then dat
3590: 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d  a is pulled from
35a0: 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69   srcTab and pELi
35b0: 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  st is used only 
35c0: 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61  to get the.** da
35d0: 74 61 74 79 70 65 73 20 66 6f 72 20 65 61 63 68  tatypes for each
35e0: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74   column..*/.stat
35f0: 69 63 20 69 6e 74 20 73 65 6c 65 63 74 49 6e 6e  ic int selectInn
3600: 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20  erLoop(.  Parse 
3610: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
3620: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
3630: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
3640: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
3650: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
3660: 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74  lete select stat
3670: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
3680: 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
3690: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
36a0: 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  * List of values
36b0: 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64   being extracted
36c0: 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62   */.  int srcTab
36d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
36e0: 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20   Pull data from 
36f0: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
3700: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
3710: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3720: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
3730: 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
3740: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
3750: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
3760: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f   If not NULL, so
3770: 72 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67  rt results using
3780: 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69   this key */.  i
3790: 6e 74 20 64 69 73 74 69 6e 63 74 2c 20 20 20 20  nt distinct,    
37a0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30         /* If >=0
37b0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65 73 75  , make sure resu
37c0: 6c 74 73 20 61 72 65 20 64 69 73 74 69 6e 63 74  lts are distinct
37d0: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c   */.  int eDest,
37e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37f0: 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20   How to dispose 
3800: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a  of the results *
3810: 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20  /.  int iParm,  
3820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
3830: 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  n argument to th
3840: 65 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f  e disposal metho
3850: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  d */.  int iCont
3860: 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f  inue,          /
3870: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63  * Jump here to c
3880: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78  ontinue with nex
3890: 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  t row */.  int i
38a0: 42 72 65 61 6b 2c 20 20 20 20 20 20 20 20 20 20  Break,          
38b0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
38c0: 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
38d0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a  the inner loop *
38e0: 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20  /.  char *aff   
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
3900: 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 69  ffinity string i
3910: 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55  f eDest is SRT_U
3920: 6e 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  nion */.){.  Vdb
3930: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
3940: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
3950: 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74   int hasDistinct
3960: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
3970: 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
3980: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
3990: 65 6e 74 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d  ent */..  if( v=
39a0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
39b0: 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
39c0: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  =0 );..  /* If t
39d0: 68 65 72 65 20 77 61 73 20 61 20 4c 49 4d 49 54  here was a LIMIT
39e0: 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 53   clause on the S
39f0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
3a00: 20 74 68 65 6e 20 64 6f 20 74 68 65 20 63 68 65   then do the che
3a10: 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69  ck.  ** to see i
3a20: 66 20 74 68 69 73 20 72 6f 77 20 73 68 6f 75 6c  f this row shoul
3a30: 64 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  d be output..  *
3a40: 2f 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20  /.  hasDistinct 
3a50: 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30 20 26 26  = distinct>=0 &&
3a60: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
3a70: 74 2d 3e 6e 45 78 70 72 3e 30 3b 0a 20 20 69 66  t->nExpr>0;.  if
3a80: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ( pOrderBy==0 &&
3a90: 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b   !hasDistinct ){
3aa0: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
3ab0: 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  v, p, iContinue,
3ac0: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50   0);.  }..  /* P
3ad0: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
3ae0: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
3af0: 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20    if( nColumn>0 
3b00: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
3b10: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
3b20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3b30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
3b40: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 29  lumn, srcTab, i)
3b50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
3b60: 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70  .    nColumn = p
3b70: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
3b80: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
3b90: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
3ba0: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  , pEList);.  }..
3bb0: 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54    /* If the DIST
3bc0: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73  INCT keyword was
3bd0: 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20   present on the 
3be0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3bf0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72  .  ** and this r
3c00: 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e  ow has been seen
3c10: 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f   before, then do
3c20: 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72   not make this r
3c30: 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20  ow.  ** part of 
3c40: 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f  the result..  */
3c50: 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e  .  if( hasDistin
3c60: 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  ct ){.    int n 
3c70: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
3c80: 0a 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63  .    codeDistinc
3c90: 74 28 76 2c 20 64 69 73 74 69 6e 63 74 2c 20 69  t(v, distinct, i
3ca0: 43 6f 6e 74 69 6e 75 65 2c 20 6e 2c 20 6e 2b 31  Continue, n, n+1
3cb0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  );.    if( pOrde
3cc0: 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
3cd0: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c  codeOffset(v, p,
3ce0: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c   iContinue, nCol
3cf0: 75 6d 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  umn);.    }.  }.
3d00: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
3d10: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
3d20: 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65  is mode, write e
3d30: 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ach query result
3d40: 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74   to the key of t
3d50: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
3d60: 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e   ** table iParm.
3d70: 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
3d80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
3d90: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20  OUND_SELECT.    
3da0: 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20  case SRT_Union: 
3db0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
3dc0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
3dd0: 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75  akeRecord, nColu
3de0: 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f  mn, NULL_ALWAYS_
3df0: 44 49 53 54 49 4e 43 54 29 3b 0a 20 20 20 20 20  DISTINCT);.     
3e00: 20 69 66 28 20 61 66 66 20 29 7b 0a 20 20 20 20   if( aff ){.    
3e10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
3e20: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 61  hangeP3(v, -1, a
3e30: 66 66 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  ff, P3_STATIC);.
3e40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
3e50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3e60: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
3e70: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
3e80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
3e90: 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20     /* Construct 
3ea0: 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  a record from th
3eb0: 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20  e query result, 
3ec0: 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20  but instead of. 
3ed0: 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61     ** saving tha
3ee0: 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74  t record, use it
3ef0: 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c   as a key to del
3f00: 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f  ete elements fro
3f10: 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d  m.    ** the tem
3f20: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
3f30: 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  rm..    */.    c
3f40: 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20  ase SRT_Except: 
3f50: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
3f60: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
3f70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3f80: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
3f90: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f  , nColumn, NULL_
3fa0: 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29  ALWAYS_DISTINCT)
3fb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
3fc0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
3fd0: 31 2c 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49  1, aff, P3_STATI
3fe0: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
3ff0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4000: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d  _NotFound, iParm
4010: 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20  , addr+3);.     
4020: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4030: 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  p(v, OP_Delete, 
4040: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
4050: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
4060: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f  ndif..    /* Sto
4070: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
4080: 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
4090: 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
40a0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
40b0: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
40c0: 54 5f 56 69 72 74 75 61 6c 54 61 62 3a 20 7b 0a  T_VirtualTab: {.
40d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
40e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
40f0: 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e  eRecord, nColumn
4100: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
4110: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
4120: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
4130: 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f  er(pParse, v, pO
4140: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d  rderBy);.      }
4150: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
4160: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4170: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69  , OP_NewRowid, i
4180: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
4190: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
41a0: 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31  Op(v, OP_Pull, 1
41b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
41c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
41d0: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
41e0: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  rm, 0);.      }.
41f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4200: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
4210: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
4220: 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
4230: 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74  e creating a set
4240: 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e   for an "expr IN
4250: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63   (SELECT ...)" c
4260: 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a  onstruct,.    **
4270: 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75   then there shou
4280: 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69  ld be a single i
4290: 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  tem on the stack
42a0: 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20  .  Write this.  
42b0: 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74    ** item into t
42c0: 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74  he set table wit
42d0: 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20  h bogus data..  
42e0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
42f0: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69  T_Set: {.      i
4300: 6e 74 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  nt addr1 = sqlit
4310: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
4320: 72 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  r(v);.      int 
4330: 61 64 64 72 32 3b 0a 0a 20 20 20 20 20 20 61 73  addr2;..      as
4340: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
4350: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
4360: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4370: 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64  _NotNull, -1, ad
4380: 64 72 31 2b 33 29 3b 0a 20 20 20 20 20 20 73 71  dr1+3);.      sq
4390: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
43a0: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
43b0: 0a 20 20 20 20 20 20 61 64 64 72 32 20 3d 20 73  .      addr2 = s
43c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
43d0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30  v, OP_Goto, 0, 0
43e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
43f0: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
4400: 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61   /* At first gla
4410: 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68  nce you would th
4420: 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74  ink we could opt
4430: 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20  imize out the.  
4440: 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42        ** ORDER B
4450: 59 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73  Y in this case s
4460: 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f  ince the order o
4470: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
4480: 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   set.        ** 
4490: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e  does not matter.
44a0: 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68    But there migh
44b0: 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61  t be a LIMIT cla
44c0: 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20  use, in which.  
44d0: 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68        ** case th
44e0: 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74  e order does mat
44f0: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ter */.        p
4500: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
4510: 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42  arse, v, pOrderB
4520: 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  y);.      }else{
4530: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66  .        char af
4540: 66 20 3d 20 28 69 50 61 72 6d 3e 3e 31 36 29 26  f = (iParm>>16)&
4550: 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 61 66  0xFF;.        af
4560: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
4570: 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73  reAffinity(pELis
4580: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61  t->a[0].pExpr, a
4590: 66 66 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ff);.        sql
45a0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
45b0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c  P_MakeRecord, 1,
45c0: 20 30 2c 20 26 61 66 66 2c 20 31 29 3b 0a 20 20   0, &aff, 1);.  
45d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
45e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
45f0: 49 6e 73 65 72 74 2c 20 28 69 50 61 72 6d 26 30  Insert, (iParm&0
4600: 78 30 30 30 30 46 46 46 46 29 2c 20 30 29 3b 0a  x0000FFFF), 0);.
4610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
4620: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
4630: 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 20  e(v, addr2);.   
4640: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4650: 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72  .    /* If any r
4660: 6f 77 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ow exists in the
4670: 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63   result set, rec
4680: 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e  ord that fact an
4690: 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a  d abort..    */.
46a0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69      case SRT_Exi
46b0: 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  sts: {.      sql
46c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
46d0: 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 69   OP_MemInt, 1, i
46e0: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  Parm);.      sql
46f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4700: 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e   OP_Pop, nColumn
4710: 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 0);.      /* T
4720: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
4730: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
4740: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
4750: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
4760: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
4770: 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72  this is a scalar
4780: 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20   select that is 
4790: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
47a0: 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ssion, then.    
47b0: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
47c0: 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
47d0: 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
47e0: 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75  ell and break ou
47f0: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
4800: 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
4810: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  /.    case SRT_M
4820: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
4830: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
4840: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
4850: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
4860: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
4870: 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72  Parse, v, pOrder
4880: 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  By);.      }else
4890: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
48a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
48b0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d  _MemStore, iParm
48c0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  , 1);.        /*
48d0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
48e0: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
48f0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
4900: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
4910: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4920: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
4930: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
4940: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
4950: 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61 74 61  /* Send the data
4960: 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
4970: 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20   function or to 
4980: 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 49  a subroutine.  I
4990: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 73  n the.    ** cas
49a0: 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
49b0: 65 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  e, the subroutin
49c0: 65 20 69 74 73 65 6c 66 20 69 73 20 72 65 73 70  e itself is resp
49d0: 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20 20 20  onsible for.    
49e0: 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68 65 20 64  ** popping the d
49f0: 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ata from the sta
4a00: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ck..    */.    c
4a10: 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69  ase SRT_Subrouti
4a20: 6e 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ne:.    case SRT
4a30: 5f 43 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20 20  _Callback: {.   
4a40: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
4a50: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4a60: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4a70: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43  P_MakeRecord, nC
4a80: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
4a90: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
4aa0: 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72  r(pParse, v, pOr
4ab0: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65  derBy);.      }e
4ac0: 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53  lse if( eDest==S
4ad0: 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b  RT_Subroutine ){
4ae0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4af0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4b00: 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29  Gosub, 0, iParm)
4b10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4b20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4b30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61  beAddOp(v, OP_Ca
4b40: 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c  llback, nColumn,
4b50: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
4b60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4b70: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
4b80: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
4b90: 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72  R).    /* Discar
4ba0: 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  d the results.  
4bb0: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
4bc0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4bd0: 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a  ts inside.    **
4be0: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54   the body of a T
4bf0: 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72  RIGGER.  The pur
4c00: 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c  pose of such sel
4c10: 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a  ects is to call.
4c20: 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69      ** user-defi
4c30: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ned functions th
4c40: 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66  at have side eff
4c50: 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ects.  We do not
4c60: 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f   care.    ** abo
4c70: 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65  ut the actual re
4c80: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
4c90: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
4ca0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
4cb0: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
4cc0: 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20  SRT_Discard );. 
4cd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4ce0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
4cf0: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
4d00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4d10: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
4d20: 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
4d30: 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
4d40: 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
4d50: 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ached..  */.  if
4d60: 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 26  ( p->iLimit>=0 &
4d70: 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  & pOrderBy==0 ){
4d80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4d90: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
4da0: 6e 63 72 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ncr, p->iLimit, 
4db0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
4dc0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
4dd0: 66 4d 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  fMemZero, p->iLi
4de0: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  mit, iBreak);.  
4df0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
4e00: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20  ./*.** Given an 
4e10: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
4e20: 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49   generate a KeyI
4e30: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
4e40: 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68  at records.** th
4e50: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
4e60: 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78  ence for each ex
4e70: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74  pression in that
4e80: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
4e90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
4ea0: 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52  xprList is an OR
4eb0: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
4ec0: 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74  BY clause then t
4ed0: 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20  he resulting.** 
4ee0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
4ef0: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
4f00: 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e   for initializin
4f10: 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  g a virtual inde
4f20: 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  x to.** implemen
4f30: 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20  t that clause.  
4f40: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
4f50: 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  is the result se
4f60: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a  t of a SELECT.**
4f70: 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66   then the KeyInf
4f80: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
4f90: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
4fa0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
4fb0: 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74  rtual.** index t
4fc0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49  o implement a DI
4fd0: 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a  STINCT test..**.
4fe0: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
4ff0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
5000: 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e  ucture is obtain
5010: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54   from malloc.  T
5020: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
5030: 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
5040: 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67  sible for seeing
5050: 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63   that this struc
5060: 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c  ture is eventual
5070: 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20 41 64  ly.** freed.  Ad
5080: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
5090: 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 50  ructure to the P
50a0: 33 20 66 69 65 6c 64 20 6f 66 20 61 6e 20 6f 70  3 field of an op
50b0: 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20 50 33  code using.** P3
50c0: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
50d0: 20 69 73 20 74 68 65 20 75 73 75 61 6c 20 77 61   is the usual wa
50e0: 79 20 6f 66 20 64 65 61 6c 69 6e 67 20 77 69 74  y of dealing wit
50f0: 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  h this..*/.stati
5100: 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e  c KeyInfo *keyIn
5110: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 50  foFromExprList(P
5120: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
5130: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
5140: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
5150: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
5160: 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e  t nExpr;.  KeyIn
5170: 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72  fo *pInfo;.  str
5180: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
5190: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
51a0: 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c  i;..  nExpr = pL
51b0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
51c0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nfo = sqliteMall
51d0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66  oc( sizeof(*pInf
51e0: 6f 29 20 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65  o) + nExpr*(size
51f0: 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20  of(CollSeq*)+1) 
5200: 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29  );.  if( pInfo )
5210: 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f  {.    pInfo->aSo
5220: 72 74 4f 72 64 65 72 20 3d 20 28 63 68 61 72 2a  rtOrder = (char*
5230: 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e  )&pInfo->aColl[n
5240: 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e 66 6f  Expr];.    pInfo
5250: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 78 70 72  ->nField = nExpr
5260: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65 6e 63  ;.    pInfo->enc
5270: 20 3d 20 64 62 2d 3e 65 6e 63 3b 0a 20 20 20 20   = db->enc;.    
5280: 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
5290: 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70 72  List->a; i<nExpr
52a0: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
52b0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
52c0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f  pColl;.      pCo
52d0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
52e0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
52f0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
5300: 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
5310: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
5320: 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
5330: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5340: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  pInfo->aColl[i] 
5350: 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
5360: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
5370: 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72  [i] = pItem->sor
5380: 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
5390: 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f  }.  return pInfo
53a0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ;.}.../*.** If t
53b0: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61  he inner loop wa
53c0: 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e  s generated usin
53d0: 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72  g a non-null pOr
53e0: 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a  derBy argument,.
53f0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  ** then the resu
5400: 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64 20  lts were placed 
5410: 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66  in a sorter.  Af
5420: 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20  ter the loop is 
5430: 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65  terminated.** we
5440: 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65   need to run the
5450: 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70   sorter and outp
5460: 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  ut the results. 
5470: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   The following.*
5480: 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
5490: 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65  tes the code nee
54a0: 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  ded to do that..
54b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
54c0: 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
54d0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
54e0: 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69  ,   /* The parsi
54f0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
5500: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
5510: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
5520: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64  tatement */.  Vd
5530: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 2f  be *v,         /
5540: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
5550: 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  into this VDBE *
5560: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
5570: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5580: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  f columns of dat
5590: 61 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  a */.  int eDest
55a0: 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ,       /* Write
55b0: 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73 75   the sorted resu
55c0: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  lts here */.  in
55d0: 74 20 69 50 61 72 6d 20 20 20 20 20 20 20 20 2f  t iParm        /
55e0: 2a 20 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d  * Optional param
55f0: 65 74 65 72 20 61 73 73 6f 63 69 61 74 65 64 20  eter associated 
5600: 77 69 74 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b  with eDest */.){
5610: 0a 20 20 69 6e 74 20 62 72 6b 20 3d 20 73 71 6c  .  int brk = sql
5620: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
5630: 6c 28 76 29 3b 0a 20 20 69 6e 74 20 63 6f 6e 74  l(v);.  int cont
5640: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
5650: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e  keLabel(v);.  in
5660: 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69 54  t addr;.  int iT
5670: 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  ab;.  ExprList *
5680: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
5690: 72 64 65 72 42 79 3b 0a 0a 20 20 69 54 61 62 20  rderBy;..  iTab 
56a0: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  = pOrderBy->iECu
56b0: 72 73 6f 72 3b 0a 20 20 61 64 64 72 20 3d 20 31  rsor;.  addr = 1
56c0: 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
56d0: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  dOp(v, OP_Sort, 
56e0: 69 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20 63 6f  iTab, brk);.  co
56f0: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 63  deOffset(v, p, c
5700: 6f 6e 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ont, 0);.  sqlit
5710: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5720: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20  P_Column, iTab, 
5730: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
5740: 2b 20 31 29 3b 0a 20 20 73 77 69 74 63 68 28 20  + 1);.  switch( 
5750: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73  eDest ){.    cas
5760: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
5770: 20 63 61 73 65 20 53 52 54 5f 56 69 72 74 75 61   case SRT_Virtua
5780: 6c 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71  lTab: {.      sq
5790: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
57a0: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69  , OP_NewRowid, i
57b0: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
57c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
57d0: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
57e0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
57f0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5800: 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
5810: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
5820: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
5830: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
5840: 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54  ERY.    case SRT
5850: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Set: {.      as
5860: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
5870: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
5880: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5890: 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 73 71  _NotNull, -1, sq
58a0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
58b0: 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20  Addr(v)+3);.    
58c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
58d0: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
58e0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
58f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5900: 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74  P_Goto, 0, sqlit
5910: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
5920: 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20 73  r(v)+3);.      s
5930: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
5940: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
5950: 31 2c 20 30 2c 20 22 63 22 2c 20 50 33 5f 53 54  1, 0, "c", P3_ST
5960: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
5970: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5980: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 28   OP_IdxInsert, (
5990: 69 50 61 72 6d 26 30 78 30 30 30 30 46 46 46 46  iParm&0x0000FFFF
59a0: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  ), 0);.      bre
59b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
59c0: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
59d0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
59e0: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
59f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5a00: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
5a10: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
5a20: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
5a30: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
5a40: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
5a50: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
5a60: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5a70: 66 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  f.    case SRT_C
5a80: 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63 61 73  allback:.    cas
5a90: 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65  e SRT_Subroutine
5aa0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  : {.      int i;
5ab0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5ac0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
5ad0: 74 65 67 65 72 2c 20 70 2d 3e 70 45 4c 69 73 74  teger, p->pEList
5ae0: 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ->nExpr, 0);.   
5af0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5b00: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
5b10: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72  1, 0);.      for
5b20: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
5b30: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
5b40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5b50: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 2d 31  v, OP_Column, -1
5b60: 2d 69 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a  -i, i);.      }.
5b70: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
5b80: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
5b90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5ba0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5bb0: 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d  Callback, nColum
5bc0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n, 0);.      }el
5bd0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
5be0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5bf0: 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61  OP_Gosub, 0, iPa
5c00: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
5c10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5c20: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 32  dOp(v, OP_Pop, 2
5c30: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
5c40: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
5c50: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
5c60: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
5c70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5c80: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  }.  }..  /* Jump
5c90: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
5ca0: 68 65 20 6c 6f 6f 70 20 77 68 65 6e 20 74 68 65  he loop when the
5cb0: 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
5cc0: 64 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  d.  */.  if( p->
5cd0: 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20  iLimit>=0 ){.   
5ce0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5cf0: 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c  p(v, OP_MemIncr,
5d00: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 30 29 3b 0a   p->iLimit, 0);.
5d10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5d20: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d  ddOp(v, OP_IfMem
5d30: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
5d40: 20 62 72 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   brk);.  }..  /*
5d50: 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   The bottom of t
5d60: 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73  he loop.  */.  s
5d70: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
5d80: 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b  eLabel(v, cont);
5d90: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5da0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  dOp(v, OP_Next, 
5db0: 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 73  iTab, addr);.  s
5dc0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
5dd0: 65 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a  eLabel(v, brk);.
5de0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5df0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
5e00: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
5e10: 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f   the 'declaratio
5e20: 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a  n type' of the.*
5e30: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  * expression pEx
5e40: 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d  pr. The string m
5e50: 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ay be treated as
5e60: 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63   static by the c
5e70: 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aller..**.** If 
5e80: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
5e90: 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63  type is the exac
5ea0: 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e  t datatype defin
5eb0: 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20  ition extracted 
5ec0: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 6f 72 69 67  from.** the orig
5ed0: 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c  inal CREATE TABL
5ee0: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74  E statement if t
5ef0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
5f00: 20 61 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 0a 2a   a column..** .*
5f10: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
5f20: 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 20 65 78  n type for an ex
5f30: 70 72 65 73 73 69 6f 6e 20 69 73 20 65 69 74 68  pression is eith
5f40: 65 72 20 54 45 58 54 2c 20 4e 55 4d 45 52 49 43  er TEXT, NUMERIC
5f50: 20 6f 72 20 41 4e 59 2e 0a 2a 2a 20 54 68 65 20   or ANY..** The 
5f60: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
5f70: 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65   for a ROWID fie
5f80: 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 0a 2a  ld is INTEGER..*
5f90: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
5fa0: 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28  har *columnType(
5fb0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
5fc0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
5fd0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54    char const *zT
5fe0: 79 70 65 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  ype;.  int j;.  
5ff0: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20  if( pExpr==0 || 
6000: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30  pNC->pSrcList==0
6010: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
6020: 2f 2a 20 54 68 65 20 54 4b 5f 41 53 20 6f 70 65  /* The TK_AS ope
6030: 72 61 74 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 6f  rator can only o
6040: 63 63 75 72 20 69 6e 20 4f 52 44 45 52 20 42 59  ccur in ORDER BY
6050: 2c 20 47 52 4f 55 50 20 42 59 2c 20 48 41 56 49  , GROUP BY, HAVI
6060: 4e 47 2c 0a 20 20 2a 2a 20 61 6e 64 20 4c 49 4d  NG,.  ** and LIM
6070: 49 54 20 63 6c 61 75 73 65 73 2e 20 20 42 75 74  IT clauses.  But
6080: 20 70 45 78 70 72 20 6f 72 69 67 69 6e 61 74 65   pExpr originate
6090: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
60a0: 73 65 74 20 6f 66 20 61 0a 20 20 2a 2a 20 53 45  set of a.  ** SE
60b0: 4c 45 43 54 2e 20 20 53 6f 20 70 45 78 70 72 20  LECT.  So pExpr 
60c0: 63 61 6e 20 6e 65 76 65 72 20 63 6f 6e 74 61 69  can never contai
60d0: 6e 20 61 6e 20 41 53 20 6f 70 65 72 61 74 6f 72  n an AS operator
60e0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
60f0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
6100: 53 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  S );..  switch( 
6110: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
6120: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
6130: 20 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a   {.      Table *
6140: 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
6150: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  int iCol = pExpr
6160: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
6170: 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21   while( pNC && !
6180: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
6190: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
61a0: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
61b0: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  t;.        for(j
61c0: 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  =0;j<pTabList->n
61d0: 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d  Src && pTabList-
61e0: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70  >a[j].iCursor!=p
61f0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b  Expr->iTable;j++
6200: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
6210: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
6220: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
6230: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
6240: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  j].pTab;.       
6250: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6260: 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65    pNC = pNC->pNe
6270: 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  xt;.        }.  
6280: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6290: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
62a0: 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 0a 20 20     /* FIX ME:.  
62b0: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61        ** This ca
62c0: 6e 20 6f 63 63 75 72 73 20 69 66 20 79 6f 75 20  n occurs if you 
62d0: 68 61 76 65 20 73 6f 6d 65 74 68 69 6e 67 20 6c  have something l
62e0: 69 6b 65 20 22 53 45 4c 45 43 54 20 6e 65 77 2e  ike "SELECT new.
62f0: 78 3b 22 20 69 6e 73 69 64 65 0a 20 20 20 20 20  x;" inside.     
6300: 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2e     ** a trigger.
6310: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
6320: 2c 20 69 66 20 79 6f 75 20 72 65 66 65 72 65 6e  , if you referen
6330: 63 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 22  ce the special "
6340: 6e 65 77 22 0a 20 20 20 20 20 20 20 20 2a 2a 20  new".        ** 
6350: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 72 65 73  table in the res
6360: 75 6c 74 20 73 65 74 20 6f 66 20 61 20 73 65 6c  ult set of a sel
6370: 65 63 74 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ect.  We do not 
6380: 68 61 76 65 20 61 20 67 6f 6f 64 20 77 61 79 0a  have a good way.
6390: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 66 69          ** to fi
63a0: 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 74 61  nd the actual ta
63b0: 62 6c 65 20 74 79 70 65 2c 20 73 6f 20 63 61 6c  ble type, so cal
63c0: 6c 20 69 74 20 22 54 45 58 54 22 2e 20 20 54 68  l it "TEXT".  Th
63d0: 69 73 20 69 73 20 72 65 61 6c 6c 79 0a 20 20 20  is is really.   
63e0: 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e       ** somethin
63f0: 67 20 6f 66 20 61 20 62 75 67 2c 20 62 75 74 20  g of a bug, but 
6400: 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f  I do not know ho
6410: 77 20 74 6f 20 66 69 78 20 69 74 2e 0a 20 20 20  w to fix it..   
6420: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
6430: 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 6f 65  ** This code doe
6440: 73 20 6e 6f 74 20 70 72 6f 64 75 63 65 20 74 68  s not produce th
6450: 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
6460: 20 2d 20 69 74 20 6a 75 73 74 20 70 72 65 76 65   - it just preve
6470: 6e 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  nts.        ** a
6480: 20 73 65 67 66 61 75 6c 74 2e 20 20 53 65 65 20   segfault.  See 
6490: 74 69 63 6b 65 74 20 23 31 32 32 39 2e 0a 20 20  ticket #1229..  
64a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
64b0: 20 7a 54 79 70 65 20 3d 20 22 54 45 58 54 22 3b   zType = "TEXT";
64c0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
64d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
64e0: 73 65 72 74 28 20 70 54 61 62 20 29 3b 0a 20 20  sert( pTab );.  
64f0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
6500: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
6510: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
6520: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
6530: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
6540: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
6550: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
6560: 29 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65  ){.        zType
6570: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
6580: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6590: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
65a0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
65b0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
65c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
65d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
65e0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
65f0: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
6600: 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  .      NameConte
6610: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65  xt sNC;.      Se
6620: 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72  lect *pS = pExpr
6630: 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
6640: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
6650: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e  pExpr->pSelect->
6660: 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e  pSrc;.      sNC.
6670: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
6680: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
6690: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 53 2d 3e  nType(&sNC, pS->
66a0: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
66b0: 70 72 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  pr); .      brea
66c0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
66d0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
66e0: 20 20 20 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20     zType = 0;.  
66f0: 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 7a 54  }.  .  return zT
6700: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ype;.}../*.** Ge
6710: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
6720: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
6730: 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74  DBE the declarat
6740: 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c  ion types of col
6750: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
6760: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
6770: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
6780: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20  teColumnTypes(. 
6790: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
67a0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
67b0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
67c0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
67d0: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
67e0: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
67f0: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
6800: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
6810: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
6820: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
6830: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
6840: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  e;.  int i;.  Na
6850: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
6860: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
6870: 70 54 61 62 4c 69 73 74 3b 0a 20 20 66 6f 72 28  pTabList;.  for(
6880: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
6890: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
68a0: 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74  Expr *p = pEList
68b0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
68c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
68d0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
68e0: 28 26 73 4e 43 2c 20 70 29 3b 0a 20 20 20 20 69  (&sNC, p);.    i
68f0: 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20 63 6f  f( zType==0 ) co
6900: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 2f 2a 20 54  ntinue;.    /* T
6910: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
6920: 65 20 69 74 27 73 20 6f 77 6e 20 63 6f 70 79 20  e it's own copy 
6930: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79  of the column-ty
6940: 70 65 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  pe, in case the 
6950: 0a 20 20 20 20 2a 2a 20 73 63 68 65 6d 61 20 69  .    ** schema i
6960: 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74  s reset before t
6970: 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
6980: 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  ine is deleted..
6990: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
69a0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
69b0: 28 76 2c 20 69 2b 70 45 4c 69 73 74 2d 3e 6e 45  (v, i+pEList->nE
69c0: 78 70 72 2c 20 7a 54 79 70 65 2c 20 73 74 72 6c  xpr, zType, strl
69d0: 65 6e 28 7a 54 79 70 65 29 29 3b 0a 20 20 7d 0a  en(zType));.  }.
69e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
69f0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
6a00: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
6a10: 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75  he names of colu
6a20: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
6a30: 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20  sult set.  This 
6a40: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
6a50: 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  sed to provide t
6a60: 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61  he.** azCol[] va
6a70: 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c  lues in the call
6a80: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
6a90: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
6aa0: 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73  umnNames(.  Pars
6ab0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
6ac0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
6ad0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
6ae0: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
6af0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
6b00: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
6b10: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
6b20: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
6b30: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
6b40: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
6b50: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
6b60: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
6b70: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6b80: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c  ->db;.  int full
6b90: 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65  Names, shortName
6ba0: 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
6bb0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
6bc0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
6bd0: 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
6be0: 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
6bf0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
6c00: 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
6c10: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
6c20: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
6c30: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
6c40: 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d  olNamesSet || v=
6c50: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 54 73 64  =0 || sqlite3Tsd
6c60: 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  ()->mallocFailed
6c70: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61   ) return;.  pPa
6c80: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
6c90: 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65   = 1;.  fullName
6ca0: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
6cb0: 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
6cc0: 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72  ames)!=0;.  shor
6cd0: 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  tNames = (db->fl
6ce0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
6cf0: 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  rtColNames)!=0;.
6d00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
6d10: 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73  NumCols(v, pELis
6d20: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72  t->nExpr);.  for
6d30: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
6d40: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
6d50: 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20   Expr *p;.    p 
6d60: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
6d70: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 3d  Expr;.    if( p=
6d80: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
6d90: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
6da0: 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
6db0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
6dc0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
6dd0: 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ame;.      sqlit
6de0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
6df0: 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 73 74  (v, i, zName, st
6e00: 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20  rlen(zName));.  
6e10: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
6e20: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f    }.    if( p->o
6e30: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
6e40: 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20  pTabList ){.    
6e50: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
6e60: 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b       char *zCol;
6e70: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
6e80: 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
6e90: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
6ea0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26  TabList->nSrc &&
6eb0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
6ec0: 69 43 75 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62  iCursor!=p->iTab
6ed0: 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20  le; j++){}.     
6ee0: 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c   assert( j<pTabL
6ef0: 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20  ist->nSrc );.   
6f00: 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69     pTab = pTabLi
6f10: 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20  st->a[j].pTab;. 
6f20: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
6f30: 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
6f40: 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65  PKey;.      asse
6f50: 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
6f60: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
6f70: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
6f80: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
6f90: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c   ){.        zCol
6fa0: 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   = "rowid";.    
6fb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6fc0: 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43   zCol = pTab->aC
6fd0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
6fe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6ff0: 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26  ( !shortNames &&
7000: 20 21 66 75 6c 6c 4e 61 6d 65 73 20 26 26 20 70   !fullNames && p
7010: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
7020: 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  pan.z[0] ){.    
7030: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
7040: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
7050: 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70  p->span.z, p->sp
7060: 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  an.n);.      }el
7070: 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73  se if( fullNames
7080: 20 7c 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65 73   || (!shortNames
7090: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   && pTabList->nS
70a0: 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20  rc>1) ){.       
70b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
70c0: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
70d0: 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20 20 20 20  zTab;. .        
70e0: 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  zTab = pTabList-
70f0: 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20  >a[j].zAlias;.  
7100: 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e 61        if( fullNa
7110: 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29  mes || zTab==0 )
7120: 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e   zTab = pTab->zN
7130: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ame;.        sql
7140: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
7150: 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c  Name, zTab, ".",
7160: 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20   zCol, 0);.     
7170: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
7180: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a  tColName(v, i, z
7190: 4e 61 6d 65 2c 20 50 33 5f 44 59 4e 41 4d 49 43  Name, P3_DYNAMIC
71a0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
71b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
71c0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
71d0: 20 69 2c 20 7a 43 6f 6c 2c 20 73 74 72 6c 65 6e   i, zCol, strlen
71e0: 28 7a 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 7d  (zCol));.      }
71f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
7200: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
7210: 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  pan.z[0] ){.    
7220: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
7230: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 70 2d  ColName(v, i, p-
7240: 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e  >span.z, p->span
7250: 2e 6e 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71  .n);.      /* sq
7260: 6c 69 74 65 33 56 64 62 65 43 6f 6d 70 72 65 73  lite3VdbeCompres
7270: 73 53 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b  sSpace(v, addr);
7280: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
7290: 20 20 20 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b       char zName[
72a0: 33 30 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  30];.      asser
72b0: 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  t( p->op!=TK_COL
72c0: 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d  UMN || pTabList=
72d0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 70 72 69  =0 );.      spri
72e0: 6e 74 66 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75  ntf(zName, "colu
72f0: 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20  mn%d", i+1);.   
7300: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
7310: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a  tColName(v, i, z
7320: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Name, 0);.    }.
7330: 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f    }.  generateCo
7340: 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
7350: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
7360: 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  st);.}..#ifndef 
7370: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
7380: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
7390: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
73a0: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f  nnection operato
73b0: 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f  r, used for erro
73c0: 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73  r messages..*/.s
73d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
73e0: 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69   *selectOpName(i
73f0: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  nt id){.  char *
7400: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20  z;.  switch( id 
7410: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
7420: 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55  LL:       z = "U
7430: 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65  NION ALL";   bre
7440: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
7450: 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22  INTERSECT: z = "
7460: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72  INTERSECT";   br
7470: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
7480: 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20  _EXCEPT:    z = 
7490: 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62  "EXCEPT";      b
74a0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
74b0: 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  t:           z =
74c0: 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20   "UNION";       
74d0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
74e0: 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn z;.}.#endif 
74f0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
7500: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
7510: 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  /../*.** Forward
7520: 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
7530: 73 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 53  static int prepS
7540: 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65 2a  electStmt(Parse*
7550: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a  , Select*);../*.
7560: 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43  ** Given a SELEC
7570: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e  T statement, gen
7580: 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74  erate a Table st
7590: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
75a0: 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65  cribes.** the re
75b0: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74  sult set of that
75c0: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c   SELECT..*/.Tabl
75d0: 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74  e *sqlite3Result
75e0: 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73  SetOfSelect(Pars
75f0: 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20  e *pParse, char 
7600: 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63  *zTabName, Selec
7610: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
7620: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e  able *pTab;.  in
7630: 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69  t i, j;.  ExprLi
7640: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f  st *pEList;.  Co
7650: 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f  lumn *aCol, *pCo
7660: 6c 3b 0a 0a 20 20 69 66 28 20 70 72 65 70 53 65  l;..  if( prepSe
7670: 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c  lectStmt(pParse,
7680: 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20   pSelect) ){.   
7690: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
76a0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
76b0: 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65  ctResolve(pParse
76c0: 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 20 29 7b  , pSelect, 0) ){
76d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
76e0: 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69   }.  pTab = sqli
76f0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
7700: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
7710: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
7720: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
7730: 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pTab->nRef = 1;.
7740: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
7750: 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74  zTabName ? sqlit
7760: 65 53 74 72 44 75 70 28 7a 54 61 62 4e 61 6d 65  eStrDup(zTabName
7770: 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20  ) : 0;.  pEList 
7780: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
7790: 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  t;.  pTab->nCol 
77a0: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
77b0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
77c0: 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61  >nCol>0 );.  pTa
77d0: 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d  b->aCol = aCol =
77e0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
77f0: 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c  izeof(pTab->aCol
7800: 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20  [0])*pTab->nCol 
7810: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  );.  for(i=0, pC
7820: 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d  ol=aCol; i<pTab-
7830: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
7840: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
7850: 2c 20 2a 70 52 3b 0a 20 20 20 20 63 68 61 72 20  , *pR;.    char 
7860: 2a 7a 54 79 70 65 3b 0a 20 20 20 20 63 68 61 72  *zType;.    char
7870: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61   *zName;.    cha
7880: 72 20 2a 7a 42 61 73 65 6e 61 6d 65 3b 0a 20 20  r *zBasename;.  
7890: 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20 4e    int cnt;.    N
78a0: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
78b0: 20 20 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20      .    /* Get 
78c0: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e  an appropriate n
78d0: 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ame for the colu
78e0: 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20  mn.    */.    p 
78f0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
7900: 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
7910: 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c  ( p->pRight==0 |
7920: 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b  | p->pRight->tok
7930: 65 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  en.z==0 || p->pR
7940: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d  ight->token.z[0]
7950: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  !=0 );.    if( (
7960: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
7970: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29  a[i].zName)!=0 )
7980: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
7990: 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  e column contain
79a0: 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22  s an "AS <name>"
79b0: 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61   phrase, use <na
79c0: 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20  me> as the name 
79d0: 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  */.      zName =
79e0: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a 4e   sqliteStrDup(zN
79f0: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ame);.    }else 
7a00: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  if( p->op==TK_DO
7a10: 54 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T .             
7a20: 20 26 26 20 28 70 52 3d 70 2d 3e 70 52 69 67 68   && (pR=p->pRigh
7a30: 74 29 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b  t)!=0 && pR->tok
7a40: 65 6e 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65  en.z && pR->toke
7a50: 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  n.z[0] ){.      
7a60: 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f  /* For columns o
7a70: 66 20 74 68 65 20 66 72 6f 6d 20 41 2e 42 20 75  f the from A.B u
7a80: 73 65 20 42 20 61 73 20 74 68 65 20 6e 61 6d 65  se B as the name
7a90: 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   */.      zName 
7aa0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
7ab0: 28 22 25 54 22 2c 20 26 70 52 2d 3e 74 6f 6b 65  ("%T", &pR->toke
7ac0: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  n);.    }else if
7ad0: 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70  ( p->span.z && p
7ae0: 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20  ->span.z[0] ){. 
7af0: 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20       /* Use the 
7b00: 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66  original text of
7b10: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72   the column expr
7b20: 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61  ession as its na
7b30: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d  me */.      zNam
7b40: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
7b50: 74 66 28 22 25 54 22 2c 20 26 70 2d 3e 73 70 61  tf("%T", &p->spa
7b60: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
7b70: 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 65       /* If all e
7b80: 6c 73 65 20 66 61 69 6c 73 2c 20 6d 61 6b 65 20  lse fails, make 
7b90: 75 70 20 61 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  up a name */.   
7ba0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
7bb0: 65 33 4d 50 72 69 6e 74 66 28 22 63 6f 6c 75 6d  e3MPrintf("colum
7bc0: 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20  n%d", i+1);.    
7bd0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71  }.    sqlite3Deq
7be0: 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  uote(zName);.   
7bf0: 20 69 66 28 20 73 71 6c 69 74 65 33 54 73 64 28   if( sqlite3Tsd(
7c00: 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  )->mallocFailed 
7c10: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  ){.      sqliteF
7c20: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
7c30: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
7c40: 61 62 6c 65 28 30 2c 20 70 54 61 62 29 3b 0a 20  able(0, pTab);. 
7c50: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
7c60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b     }..    /* Mak
7c70: 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d  e sure the colum
7c80: 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65  n name is unique
7c90: 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69  .  If the name i
7ca0: 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20  s not unique,.  
7cb0: 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e    ** append a in
7cc0: 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d  teger to the nam
7cd0: 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63  e so that it bec
7ce0: 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20  omes unique..   
7cf0: 20 2a 2f 0a 20 20 20 20 7a 42 61 73 65 6e 61 6d   */.    zBasenam
7d00: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 66  e = zName;.    f
7d10: 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b  or(j=cnt=0; j<i;
7d20: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
7d30: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
7d40: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a  aCol[j].zName, z
7d50: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
7d60: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
7d70: 74 65 33 4d 50 72 69 6e 74 66 28 22 25 73 3a 25  te3MPrintf("%s:%
7d80: 64 22 2c 20 7a 42 61 73 65 6e 61 6d 65 2c 20 2b  d", zBasename, +
7d90: 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 6a  +cnt);.        j
7da0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69   = -1;.        i
7db0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72  f( zName==0 ) br
7dc0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
7dd0: 20 7d 0a 20 20 20 20 69 66 28 20 7a 42 61 73 65   }.    if( zBase
7de0: 6e 61 6d 65 21 3d 7a 4e 61 6d 65 20 29 7b 0a 20  name!=zName ){. 
7df0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
7e00: 7a 42 61 73 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zBasename);.    
7e10: 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  }.    pCol->zNam
7e20: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20  e = zName;..    
7e30: 2f 2a 20 47 65 74 20 74 68 65 20 74 79 70 65 6e  /* Get the typen
7e40: 61 6d 65 2c 20 74 79 70 65 20 61 66 66 69 6e 69  ame, type affini
7e50: 74 79 2c 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ty, and collatin
7e60: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
7e70: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  he.    ** column
7e80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d  ..    */.    mem
7e90: 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
7ea0: 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73  eof(sNC));.    s
7eb0: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
7ec0: 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20  elect->pSrc;.   
7ed0: 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 53   zType = sqliteS
7ee0: 74 72 44 75 70 28 63 6f 6c 75 6d 6e 54 79 70 65  trDup(columnType
7ef0: 28 26 73 4e 43 2c 20 70 29 29 3b 0a 20 20 20 20  (&sNC, p));.    
7f00: 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 7a 54  pCol->zType = zT
7f10: 79 70 65 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61  ype;.    pCol->a
7f20: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
7f30: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29  3ExprAffinity(p)
7f40: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c  ;.    pCol->pCol
7f50: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
7f60: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
7f70: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c  );.    if( !pCol
7f80: 2d 3e 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ->pColl ){.     
7f90: 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70   pCol->pColl = p
7fa0: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
7fb0: 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Coll;.    }.  }.
7fc0: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
7fd0: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61  -1;.  return pTa
7fe0: 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70  b;.}../*.** Prep
7ff0: 61 72 65 20 61 20 53 45 4c 45 43 54 20 73 74 61  are a SELECT sta
8000: 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65  tement for proce
8010: 73 73 69 6e 67 20 62 79 20 64 6f 69 6e 67 20 74  ssing by doing t
8020: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
8030: 74 68 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  things:.**.**   
8040: 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20   (1)  Make sure 
8050: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
8060: 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
8070: 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a  signed to every.
8080: 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65  **         eleme
8090: 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  nt of the FROM c
80a0: 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lause..**.**    
80b0: 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  (2)  Fill in the
80c0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
80d0: 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68  Tab fields in th
80e0: 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a  e SrcList that .
80f0: 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e  **         defin
8100: 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  es FROM clause. 
8110: 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65   When views appe
8120: 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ar in the FROM c
8130: 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20  lause,.**       
8140: 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d    fill pTabList-
8150: 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74  >a[].pSelect wit
8160: 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
8170: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
8180: 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74  .**         that
8190: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
81a0: 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73  view.  A copy is
81b0: 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65   made of the vie
81c0: 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20  w's SELECT.**   
81d0: 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20        statement 
81e0: 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66  so that we can f
81f0: 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20  reely modify or 
8200: 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74  delete that stat
8210: 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
8220: 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e   without worryin
8230: 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20  g about messing 
8240: 75 70 20 74 68 65 20 70 72 65 73 69 73 74 65 6e  up the presisten
8250: 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
8260: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74  .**         of t
8270: 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20  he view..**.**  
8280: 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73    (3)  Add terms
8290: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
82a0: 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61  ause to accomoda
82b0: 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  te the NATURAL k
82c0: 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20  eyword.**       
82d0: 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74    on joins and t
82e0: 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
82f0: 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e  clause of joins.
8300: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53  .**.**    (4)  S
8310: 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  can the list of 
8320: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
8330: 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73  esult set (pELis
8340: 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20  t) looking.**   
8350: 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e        for instan
8360: 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f  ces of the "*" o
8370: 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54  perator or the T
8380: 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e  ABLE.* operator.
8390: 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66  .**         If f
83a0: 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63  ound, expand eac
83b0: 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72  h "*" to be ever
83c0: 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72  y column in ever
83d0: 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  y table.**      
83e0: 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74     and TABLE.* t
83f0: 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
8400: 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  n in TABLE..**.*
8410: 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75  * Return 0 on su
8420: 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 72 65  ccess.  If there
8430: 20 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c   are problems, l
8440: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
8450: 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72  ssage.** in pPar
8460: 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f  se and return no
8470: 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  n-zero..*/.stati
8480: 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74  c int prepSelect
8490: 53 74 6d 74 28 50 61 72 73 65 20 2a 70 50 61 72  Stmt(Parse *pPar
84a0: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
84b0: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72    int i, j, k, r
84c0: 63 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  c;.  SrcList *pT
84d0: 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69  abList;.  ExprLi
84e0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61  st *pEList;.  Ta
84f0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 74 72  ble *pTab;.  str
8500: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
8510: 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 69 66 28 20   *pFrom;..  if( 
8520: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d  p==0 || p->pSrc=
8530: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 54 73 64  =0 || sqlite3Tsd
8540: 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  ()->mallocFailed
8550: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70   ) return 1;.  p
8560: 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
8570: 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
8580: 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d  >pEList;..  /* M
8590: 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20  ake sure cursor 
85a0: 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
85b0: 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  n assigned to al
85c0: 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a  l entries in.  *
85d0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
85e0: 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  e of the SELECT 
85f0: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
8600: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
8610: 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
8620: 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a  arse, p->pSrc);.
8630: 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76  .  /* Look up ev
8640: 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  ery table named 
8650: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
8660: 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  se of the select
8670: 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e  .  If.  ** an en
8680: 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
8690: 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71  clause is a subq
86a0: 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20  uery instead of 
86b0: 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c  a table or view,
86c0: 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  .  ** then creat
86d0: 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61  e a transient ta
86e0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ble structure to
86f0: 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75   describe the su
8700: 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  bquery..  */.  f
8710: 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
8720: 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
8730: 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
8740: 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
8750: 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21  if( pFrom->pTab!
8760: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
8770: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61  his statement ha
8780: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
8790: 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20  repared.  There 
87a0: 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20  is no need.     
87b0: 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65   ** to go furthe
87c0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  r. */.      asse
87d0: 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  rt( i==0 );.    
87e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
87f0: 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  }.    if( pFrom-
8800: 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66  >zName==0 ){.#if
8810: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8820: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20  _SUBQUERY.      
8830: 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
8840: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
8850: 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
8860: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8870: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30  From->pSelect!=0
8880: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46   );.      if( pF
8890: 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20 29  rom->zAlias==0 )
88a0: 7b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  {.        pFrom-
88b0: 3e 7a 41 6c 69 61 73 20 3d 0a 20 20 20 20 20 20  >zAlias =.      
88c0: 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
88d0: 74 66 28 22 73 71 6c 69 74 65 5f 73 75 62 71 75  tf("sqlite_subqu
88e0: 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a  ery_%p_", (void*
88f0: 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29  )pFrom->pSelect)
8900: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8910: 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
8920: 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
8930: 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
8940: 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71  ab = .        sq
8950: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
8960: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
8970: 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c 20 70 46  From->zAlias, pF
8980: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  rom->pSelect);. 
8990: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
89a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
89b0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
89c0: 20 20 20 20 2f 2a 20 54 68 65 20 69 73 54 72 61      /* The isTra
89d0: 6e 73 69 65 6e 74 20 66 6c 61 67 20 69 6e 64 69  nsient flag indi
89e0: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 54  cates that the T
89f0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 68  able structure h
8a00: 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a 2a  as been.      **
8a10: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
8a20: 6f 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20 62  ocated and may b
8a30: 65 20 66 72 65 65 64 20 61 74 20 61 6e 79 20 74  e freed at any t
8a40: 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ime.  In other w
8a50: 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20 70  ords,.      ** p
8a60: 54 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  Tab is not point
8a70: 69 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73 74  ing to a persist
8a80: 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
8a90: 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73  ure that defines
8aa0: 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20 6f  .      ** part o
8ab0: 66 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a 2f  f the schema. */
8ac0: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73 54  .      pTab->isT
8ad0: 72 61 6e 73 69 65 6e 74 20 3d 20 31 3b 0a 23 65  ransient = 1;.#e
8ae0: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
8af0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69        /* An ordi
8b00: 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69  nary table or vi
8b10: 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46  ew name in the F
8b20: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
8b30: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
8b40: 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
8b50: 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
8b60: 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20  = pTab = .      
8b70: 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54    sqlite3LocateT
8b80: 61 62 6c 65 28 70 50 61 72 73 65 2c 70 46 72 6f  able(pParse,pFro
8b90: 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e  m->zName,pFrom->
8ba0: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
8bb0: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
8bc0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8bd0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
8be0: 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23   pTab->nRef++;.#
8bf0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8c00: 49 54 5f 56 49 45 57 0a 20 20 20 20 20 20 69 66  IT_VIEW.      if
8c10: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
8c20: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
8c30: 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74   reach here if t
8c40: 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
8c50: 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65  s a really a vie
8c60: 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  w */.        if(
8c70: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
8c80: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
8c90: 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20  e, pTab) ){.    
8ca0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
8cb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8cc0: 20 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70    /* If pFrom->p
8cd0: 53 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61  Select!=0 it mea
8ce0: 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
8cf0: 67 20 77 69 74 68 20 61 0a 20 20 20 20 20 20 20  g with a.       
8d00: 20 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20   ** view within 
8d10: 61 20 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c  a view.  The SEL
8d20: 45 43 54 20 73 74 72 75 63 74 75 72 65 20 68 61  ECT structure ha
8d30: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20  s already been. 
8d40: 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64         ** copied
8d50: 20 62 79 20 74 68 65 20 6f 75 74 65 72 20 76 69   by the outer vi
8d60: 65 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69  ew so we can ski
8d70: 70 20 74 68 65 20 63 6f 70 79 20 73 74 65 70 20  p the copy step 
8d80: 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  here.        ** 
8d90: 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65  in the inner vie
8da0: 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  w..        */.  
8db0: 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d        if( pFrom-
8dc0: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
8dd0: 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e           pFrom->
8de0: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
8df0: 33 53 65 6c 65 63 74 44 75 70 28 70 54 61 62 2d  3SelectDup(pTab-
8e00: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
8e10: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
8e20: 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  dif.    }.  }.. 
8e30: 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55   /* Process NATU
8e40: 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e  RAL keywords, an
8e50: 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  d ON and USING c
8e60: 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e  lauses of joins.
8e70: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
8e80: 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50  teProcessJoin(pP
8e90: 61 72 73 65 2c 20 70 29 20 29 20 72 65 74 75 72  arse, p) ) retur
8ea0: 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65  n 1;..  /* For e
8eb0: 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63  very "*" that oc
8ec0: 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75  curs in the colu
8ed0: 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20  mn list, insert 
8ee0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a  the names of.  *
8ef0: 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  * all columns in
8f00: 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e   all tables.  An
8f10: 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c  d for every TABL
8f20: 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e  E.* insert the n
8f30: 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c  ames.  ** of all
8f40: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c   columns in TABL
8f50: 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  E.  The parser i
8f60: 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61  nserted a specia
8f70: 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  l expression.  *
8f80: 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c  * with the TK_AL
8f90: 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65  L operator for e
8fa0: 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20  ach "*" that it 
8fb0: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c  found in the col
8fc0: 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54  umn list..  ** T
8fd0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
8fe0: 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f  e just has to lo
8ff0: 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20  cate the TK_ALL 
9000: 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20  expressions and 
9010: 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68  expand.  ** each
9020: 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74   one to the list
9030: 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
9040: 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20  in all tables.. 
9050: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
9060: 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65  st loop just che
9070: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68  cks to see if th
9080: 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20  ere are any "*" 
9090: 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74  operators.  ** t
90a0: 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69  hat need expandi
90b0: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b  ng..  */.  for(k
90c0: 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
90d0: 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45  xpr; k++){.    E
90e0: 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74  xpr *pE = pEList
90f0: 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[k].pExpr;.  
9100: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
9110: 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
9120: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
9130: 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67  _DOT && pE->pRig
9140: 68 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  ht && pE->pRight
9150: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20  ->op==TK_ALL.   
9160: 20 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65        && pE->pLe
9170: 66 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d  ft && pE->pLeft-
9180: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65  >op==TK_ID ) bre
9190: 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30  ak;.  }.  rc = 0
91a0: 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74  ;.  if( k<pEList
91b0: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f  ->nExpr ){.    /
91c0: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67  *.    ** If we g
91d0: 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73  et here it means
91e0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
91f0: 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
9200: 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20  more "*".    ** 
9210: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e  operators that n
9220: 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
9230: 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ed.  Loop throug
9240: 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
9250: 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  n.    ** in the 
9260: 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65  result set and e
9270: 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62  xpand them one b
9280: 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  y one..    */.  
9290: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
92a0: 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69  t_item *a = pELi
92b0: 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c  st->a;.    ExprL
92c0: 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ist *pNew = 0;. 
92d0: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
92e0: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
92f0: 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61  ;.    int longNa
9300: 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53  mes = (flags & S
9310: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
9320: 65 73 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  es)!=0 &&.      
9330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9340: 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
9350: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d  ShortColNames)==
9360: 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b  0;..    for(k=0;
9370: 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
9380: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; k++){.      Ex
9390: 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45  pr *pE = a[k].pE
93a0: 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
93b0: 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26  E->op!=TK_ALL &&
93c0: 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 45 2d  .           (pE-
93d0: 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
93e0: 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20  E->pRight==0 || 
93f0: 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d  pE->pRight->op!=
9400: 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20  TK_ALL) ){.     
9410: 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
9420: 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
9430: 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
9440: 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
9450: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
9460: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
9470: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
9480: 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c  New, a[k].pExpr,
9490: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
94a0: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
94b0: 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
94c0: 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20  >nExpr-1].zName 
94d0: 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  = a[k].zName;.  
94e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
94f0: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
9500: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9510: 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
9520: 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e  .        a[k].zN
9530: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ame = 0;.      }
9540: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
9550: 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
9560: 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22   is a "*" or a "
9570: 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65  TABLE.*" and nee
9580: 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20  ds to be.       
9590: 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f   ** expanded. */
95a0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62  .        int tab
95b0: 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20  leSeen = 0;     
95c0: 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65   /* Set to 1 whe
95d0: 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20  n TABLE matches 
95e0: 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
95f0: 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  *zTName;        
9600: 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e      /* text of n
9610: 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a  ame of TABLE */.
9620: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
9630: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
9640: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
9650: 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71       zTName = sq
9660: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
9670: 65 6e 28 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74  en(&pE->pLeft->t
9680: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  oken);.        }
9690: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
96a0: 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  zTName = 0;.    
96b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
96c0: 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
96d0: 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
96e0: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
96f0: 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
9700: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
9710: 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
9720: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
9730: 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d  zTabName = pFrom
9740: 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ->zAlias;.      
9750: 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
9760: 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b  ==0 || zTabName[
9770: 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20  0]==0 ){ .      
9780: 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d        zTabName =
9790: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
97a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
97b0: 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26      if( zTName &
97c0: 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c  & (zTabName==0 |
97d0: 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30  | zTabName[0]==0
97e0: 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
97f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
9800: 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61  ICmp(zTName, zTa
9810: 62 4e 61 6d 65 29 21 3d 30 29 20 29 7b 0a 20 20  bName)!=0) ){.  
9820: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
9830: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
9840: 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53            tableS
9850: 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
9860: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
9870: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
9880: 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
9890: 20 2a 70 45 78 70 72 2c 20 2a 70 4c 65 66 74 2c   *pExpr, *pLeft,
98a0: 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20   *pRight;.      
98b0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
98c0: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  e = pTab->aCol[j
98d0: 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20  ].zName;..      
98e0: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b        if( i>0 ){
98f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
9900: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
9910: 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70 54 61  em *pLeft = &pTa
9920: 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20  bList->a[i-1];. 
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
9940: 20 28 70 4c 65 66 74 2d 3e 6a 6f 69 6e 74 79 70   (pLeft->jointyp
9950: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
9960: 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
9970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
9980: 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d  lumnIndex(pLeft-
9990: 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30  >pTab, zName)>=0
99a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
99b0: 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55      /* In a NATU
99c0: 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74  RAL join, omit t
99d0: 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20  he join columns 
99e0: 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
99f0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62            ** tab
9a00: 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  le on the right 
9a10: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
9a20: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
9a30: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
9a40: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
9a50: 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
9a60: 78 28 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 2c  x(pLeft->pUsing,
9a70: 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9a90: 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20   In a join with 
9aa0: 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20  a USING clause, 
9ab0: 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  omit columns in 
9ac0: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
9ad0: 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61      ** using cla
9ae0: 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62  use from the tab
9af0: 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  le on the right.
9b00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
9b10: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
9b30: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9b40: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
9b50: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
9b60: 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ID, 0, 0, 0);.  
9b70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
9b80: 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ight==0 ) break;
9b90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
9ba0: 54 6f 6b 65 6e 28 26 70 52 69 67 68 74 2d 3e 74  Token(&pRight->t
9bb0: 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  oken, zName);.  
9bc0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
9bd0: 61 62 4e 61 6d 65 20 26 26 20 28 6c 6f 6e 67 4e  abName && (longN
9be0: 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74  ames || pTabList
9bf0: 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20  ->nSrc>1) ){.   
9c00: 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
9c10: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
9c20: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  K_ID, 0, 0, 0);.
9c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
9c40: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
9c50: 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  r(TK_DOT, pLeft,
9c60: 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
9c70: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
9c80: 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Expr==0 ) break;
9c90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
9ca0: 65 74 54 6f 6b 65 6e 28 26 70 4c 65 66 74 2d 3e  etToken(&pLeft->
9cb0: 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29  token, zTabName)
9cc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
9cd0: 73 65 74 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d  setToken(&pExpr-
9ce0: 3e 73 70 61 6e 2c 20 73 71 6c 69 74 65 33 4d 50  >span, sqlite3MP
9cf0: 72 69 6e 74 66 28 22 25 73 2e 25 73 22 2c 20 7a  rintf("%s.%s", z
9d00: 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 29  TabName, zName))
9d10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
9d20: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20  pExpr->span.dyn 
9d30: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
9d40: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
9d50: 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  z = 0;.         
9d60: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
9d70: 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  n.n = 0;.       
9d80: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
9d90: 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20  ken.dyn = 0;.   
9da0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
9dc0: 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  xpr = pRight;.  
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
9de0: 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70 72 2d  r->span = pExpr-
9df0: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
9e00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9e10: 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
9e20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
9e30: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
9e40: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e  xprListAppend(pN
9e50: 65 77 2c 20 70 45 78 70 72 2c 20 26 70 45 78 70  ew, pExpr, &pExp
9e60: 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20  r->span);.      
9e70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9e80: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
9e90: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
9ea0: 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 70 45  tAppend(pNew, pE
9eb0: 78 70 72 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f  xpr, &pRight->to
9ec0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ken);.          
9ed0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
9ee0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9ef0: 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e    if( !tableSeen
9f00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
9f10: 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( zTName ){.    
9f20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
9f30: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
9f40: 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
9f50: 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20  %s", zTName);.  
9f60: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9f70: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
9f80: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9f90: 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70  e, "no tables sp
9fa0: 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20  ecified");.     
9fb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9fc0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
9fd0: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
9fe0: 65 46 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20  eFree(zTName);. 
9ff0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
a000: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a010: 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a  Delete(pEList);.
a020: 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20      p->pEList = 
a030: 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pNew;.  }.  retu
a040: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
a050: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
a060: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
a070: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a080: 20 61 73 73 6f 63 69 61 74 65 73 20 65 6e 74 72   associates entr
a090: 69 65 73 20 69 6e 20 61 6e 20 4f 52 44 45 52 20  ies in an ORDER 
a0a0: 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  BY expression li
a0b0: 73 74 20 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d  st with.** colum
a0c0: 6e 73 20 69 6e 20 61 20 72 65 73 75 6c 74 2e 20  ns in a result. 
a0d0: 20 46 6f 72 20 65 61 63 68 20 4f 52 44 45 52 20   For each ORDER 
a0e0: 42 59 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  BY expression, t
a0f0: 68 65 20 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20  he opcode of.** 
a100: 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f  the top-level no
a110: 64 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  de is changed to
a120: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74   TK_COLUMN and t
a130: 68 65 20 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65  he iColumn value
a140: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c   of.** the top-l
a150: 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c  evel node is fil
a160: 6c 65 64 20 69 6e 20 77 69 74 68 20 63 6f 6c 75  led in with colu
a170: 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  mn number and th
a180: 65 20 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75  e iTable.** valu
a190: 65 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76  e of the top-lev
a1a0: 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65  el node is fille
a1b0: 64 20 77 69 74 68 20 69 54 61 62 6c 65 20 70 61  d with iTable pa
a1c0: 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  rameter..**.** I
a1d0: 66 20 74 68 65 72 65 20 61 72 65 20 70 72 69 6f  f there are prio
a1e0: 72 20 53 45 4c 45 43 54 20 63 6c 61 75 73 65 73  r SELECT clauses
a1f0: 2c 20 74 68 65 79 20 61 72 65 20 70 72 6f 63 65  , they are proce
a200: 73 73 65 64 20 66 69 72 73 74 2e 20 20 41 20 6d  ssed first.  A m
a210: 61 74 63 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61  atch.** in an ea
a220: 72 6c 69 65 72 20 53 45 4c 45 43 54 20 74 61 6b  rlier SELECT tak
a230: 65 73 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76  es precedence ov
a240: 65 72 20 61 20 6c 61 74 65 72 20 53 45 4c 45 43  er a later SELEC
a250: 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74  T..**.** Any ent
a260: 72 79 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ry that does not
a270: 20 6d 61 74 63 68 20 69 73 20 66 6c 61 67 67 65   match is flagge
a280: 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2e 20 20  d as an error.  
a290: 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  The number.** of
a2a0: 20 65 72 72 6f 72 73 20 69 73 20 72 65 74 75 72   errors is retur
a2b0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
a2c0: 6e 74 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  nt matchOrderbyT
a2d0: 6f 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65  oColumn(.  Parse
a2e0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
a2f0: 20 20 20 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f     /* A place to
a300: 20 6c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73   leave error mes
a310: 73 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63  sages */.  Selec
a320: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
a330: 20 20 20 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72     /* Match to r
a340: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66  esult columns of
a350: 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a   this SELECT */.
a360: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
a370: 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65  erBy,     /* The
a380: 20 4f 52 44 45 52 20 42 59 20 76 61 6c 75 65 73   ORDER BY values
a390: 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73   to match agains
a3a0: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
a3b0: 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
a3c0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74         /* Insert
a3d0: 20 74 68 69 73 20 76 61 6c 75 65 20 69 6e 20 69   this value in i
a3e0: 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d  Table */.  int m
a3f0: 75 73 74 43 6f 6d 70 6c 65 74 65 20 20 20 20 20  ustComplete     
a400: 20 20 20 2f 2a 20 49 66 20 54 52 55 45 20 61 6c     /* If TRUE al
a410: 6c 20 4f 52 44 45 52 20 42 59 73 20 6d 75 73 74  l ORDER BYs must
a420: 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69   match */.){.  i
a430: 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69  nt nErr = 0;.  i
a440: 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c  nt i, j;.  ExprL
a450: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20  ist *pEList;..  
a460: 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 7c  if( pSelect==0 |
a470: 7c 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  | pOrderBy==0 ) 
a480: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
a490: 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a  mustComplete ){.
a4a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
a4b0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
a4c0: 69 2b 2b 29 7b 20 70 4f 72 64 65 72 42 79 2d 3e  i++){ pOrderBy->
a4d0: 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d  a[i].done = 0; }
a4e0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 65 70 53  .  }.  if( prepS
a4f0: 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73 65  electStmt(pParse
a500: 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  , pSelect) ){.  
a510: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
a520: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70    if( pSelect->p
a530: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
a540: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
a550: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 53  olumn(pParse, pS
a560: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2c 20 70  elect->pPrior, p
a570: 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c  OrderBy, iTable,
a580: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74   0) ){.      ret
a590: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
a5a0: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
a5b0: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66  ect->pEList;.  f
a5c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
a5d0: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
a5e0: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20  .    Expr *pE = 
a5f0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
a600: 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 43  Expr;.    int iC
a610: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  ol = -1;.    if(
a620: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
a630: 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  done ) continue;
a640: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
a650: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
a660: 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20  , &iCol) ){.    
a670: 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c    if( iCol<=0 ||
a680: 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45   iCol>pEList->nE
a690: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
a6a0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
a6b0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
a6c0: 20 22 4f 52 44 45 52 20 42 59 20 70 6f 73 69 74   "ORDER BY posit
a6d0: 69 6f 6e 20 25 64 20 73 68 6f 75 6c 64 20 62 65  ion %d should be
a6e0: 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25   between 1 and %
a6f0: 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 69 43  d",.          iC
a700: 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ol, pEList->nExp
a710: 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72  r);.        nErr
a720: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ++;.        brea
a730: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
a740: 20 69 66 28 20 21 6d 75 73 74 43 6f 6d 70 6c 65   if( !mustComple
a750: 74 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  te ) continue;. 
a760: 20 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20       iCol--;.   
a770: 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20   }.    for(j=0; 
a780: 69 43 6f 6c 3c 30 20 26 26 20 6a 3c 70 45 4c 69  iCol<0 && j<pELi
a790: 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  st->nExpr; j++){
a7a0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73  .      if( pELis
a7b0: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26  t->a[j].zName &&
a7c0: 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20   (pE->op==TK_ID 
a7d0: 7c 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54  || pE->op==TK_ST
a7e0: 52 49 4e 47 29 20 29 7b 0a 20 20 20 20 20 20 20  RING) ){.       
a7f0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a   char *zName, *z
a800: 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20 20 20 7a  Label;.        z
a810: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
a820: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
a830: 20 20 20 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69     zLabel = sqli
a840: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
a850: 28 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  (&pE->token);.  
a860: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4c        assert( zL
a870: 61 62 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  abel!=0 );.     
a880: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
a890: 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61  rICmp(zName, zLa
a8a0: 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20  bel)==0 ){ .    
a8b0: 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a        iCol = j;.
a8c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a8d0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 61    sqliteFree(zLa
a8e0: 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bel);.      }.  
a8f0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26      if( iCol<0 &
a900: 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
a910: 70 61 72 65 28 70 45 2c 20 70 45 4c 69 73 74 2d  pare(pE, pEList-
a920: 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[j].pExpr) ){.
a930: 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a          iCol = j
a940: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a950: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
a960: 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e 6f 70 20  ){.      pE->op 
a970: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
a980: 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d     pE->iColumn =
a990: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d   iCol;.      pE-
a9a0: 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65  >iTable = iTable
a9b0: 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 41 67 67  ;.      pE->iAgg
a9c0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 4f 72   = -1;.      pOr
a9d0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
a9e0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
a9f0: 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 6d 75  if( iCol<0 && mu
aa00: 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20  stComplete ){.  
aa10: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
aa20: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
aa30: 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 74 65      "ORDER BY te
aa40: 72 6d 20 6e 75 6d 62 65 72 20 25 64 20 64 6f 65  rm number %d doe
aa50: 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20  s not match any 
aa60: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20  result column", 
aa70: 69 2b 31 29 3b 0a 20 20 20 20 20 20 6e 45 72 72  i+1);.      nErr
aa80: 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ++;.      break;
aa90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
aaa0: 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65  urn nErr;  .}.#e
aab0: 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
aac0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
aad0: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
aae0: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45  /*.** Get a VDBE
aaf0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
ab00: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20  arser context.  
ab10: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
ab20: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
ab30: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
ab40: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c  curs, return NUL
ab50: 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65  L and leave a me
ab60: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
ab70: 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65  .*/.Vdbe *sqlite
ab80: 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a  3GetVdbe(Parse *
ab90: 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20  pParse){.  Vdbe 
aba0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
abb0: 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  be;.  if( v==0 )
abc0: 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65  {.    v = pParse
abd0: 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65  ->pVdbe = sqlite
abe0: 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72  3VdbeCreate(pPar
abf0: 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 72  se->db);.  }.  r
ac00: 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn v;.}../*.*
ac10: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c  * Compute the iL
ac20: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
ac30: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53   fields of the S
ac40: 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74  ELECT based on t
ac50: 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64  he.** pLimit and
ac60: 20 70 4f 66 66 73 65 74 20 65 78 70 72 65 73 73   pOffset express
ac70: 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e  ions.  pLimit an
ac80: 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74  d pOffset hold t
ac90: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  he expressions.*
aca0: 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  * that appear in
acb0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
acc0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65  L statement afte
acd0: 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  r the LIMIT and 
ace0: 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72  OFFSET.** keywor
acf0: 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20  ds.  Or NULL if 
ad00: 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61  those keywords a
ad10: 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d  re omitted. iLim
ad20: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a  it and iOffset .
ad30: 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67  ** are the integ
ad40: 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  er memory regist
ad50: 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63  er numbers for c
ad60: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20  ounters used to 
ad70: 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20  compute .** the 
ad80: 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74  limit and offset
ad90: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
ada0: 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f  o limit and/or o
adb0: 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20  ffset, then .** 
adc0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
add0: 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e  et are negative.
ade0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
adf0: 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20  ine changes the 
ae00: 76 61 6c 75 65 73 20 69 66 20 69 4c 69 6d 69 74  values if iLimit
ae10: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c   and iOffset onl
ae20: 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20  y if.** a limit 
ae30: 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66  or offset is def
ae40: 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61  ined by pLimit a
ae50: 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69  nd pOffset.  iLi
ae60: 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73  mit and.** iOffs
ae70: 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  et should have b
ae80: 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70  een preset to ap
ae90: 70 72 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c  propriate defaul
aea0: 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75  t values.** (usu
aeb0: 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c 77  ally but not alw
aec0: 61 79 73 20 2d 31 29 20 70 72 69 6f 72 20 74 6f  ays -1) prior to
aed0: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
aee0: 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69  utine..** Only i
aef0: 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70  f pLimit!=0 or p
af00: 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65  Offset!=0 do the
af10: 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73   limit registers
af20: 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65   get.** redefine
af30: 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c  d.  The UNION AL
af40: 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20  L operator uses 
af50: 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f  this property to
af60: 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65   force.** the re
af70: 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  use of the same 
af80: 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74  limit and offset
af90: 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f 73   registers acros
afa0: 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45  s multiple.** SE
afb0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
afc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
afd0: 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
afe0: 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50 61  sters(Parse *pPa
aff0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
b000: 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 2f  int iBreak){.  /
b010: 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d  * .  ** "LIMIT -
b020: 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20  1" always shows 
b030: 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65  all rows.  There
b040: 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f   is some.  ** co
b050: 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20  ntraversy about 
b060: 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  what the correct
b070: 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64   behavior should
b080: 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75   be..  ** The cu
b090: 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
b0a0: 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20  tion interprets 
b0b0: 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61  "LIMIT 0" to mea
b0c0: 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a  n.  ** no rows..
b0d0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c    */.  if( p->pL
b0e0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  imit ){.    int 
b0f0: 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
b100: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62 65 20  Mem++;.    Vdbe 
b110: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
b120: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
b130: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
b140: 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  rn;.    sqlite3E
b150: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
b160: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
b170: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b180: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
b190: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
b1a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b1b0: 20 4f 50 5f 4e 65 67 61 74 69 76 65 2c 20 30 2c   OP_Negative, 0,
b1c0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
b1d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b1e0: 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20  MemStore, iMem, 
b1f0: 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  1);.    VdbeComm
b200: 65 6e 74 28 28 76 2c 20 22 23 20 4c 49 4d 49 54  ent((v, "# LIMIT
b210: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
b220: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b230: 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72  p(v, OP_IfMemZer
b240: 6f 2c 20 69 4d 65 6d 2c 20 69 42 72 65 61 6b 29  o, iMem, iBreak)
b250: 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20  ;.    p->iLimit 
b260: 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66  = iMem;.  }.  if
b270: 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a  ( p->pOffset ){.
b280: 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70      int iMem = p
b290: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
b2a0: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
b2b0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
b2c0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
b2d0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
b2e0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
b2f0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73  pParse, p->pOffs
b300: 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  et);.    sqlite3
b310: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b320: 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29  MustBeInt, 0, 0)
b330: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b340: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 67  eAddOp(v, OP_Neg
b350: 61 74 69 76 65 2c 20 30 2c 20 30 29 3b 0a 20 20  ative, 0, 0);.  
b360: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b370: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
b380: 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20  e, iMem, 1);.   
b390: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
b3a0: 20 22 23 20 4f 46 46 53 45 54 20 63 6f 75 6e 74   "# OFFSET count
b3b0: 65 72 22 29 29 3b 0a 20 20 20 20 70 2d 3e 69 4f  er"));.    p->iO
b3c0: 66 66 73 65 74 20 3d 20 69 4d 65 6d 3b 0a 20 20  ffset = iMem;.  
b3d0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
b3e0: 61 74 65 20 61 20 76 69 72 74 75 61 6c 20 69 6e  ate a virtual in
b3f0: 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 73  dex to use for s
b400: 6f 72 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  orting..*/.stati
b410: 63 20 76 6f 69 64 20 63 72 65 61 74 65 53 6f 72  c void createSor
b420: 74 69 6e 67 49 6e 64 65 78 28 50 61 72 73 65 20  tingIndex(Parse 
b430: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
b440: 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  *p, ExprList *pO
b450: 72 64 65 72 42 79 29 7b 0a 20 20 69 66 28 20 70  rderBy){.  if( p
b460: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
b470: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 61 73 73  nt addr;.    ass
b480: 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 69  ert( pOrderBy->i
b490: 45 43 75 72 73 6f 72 3d 3d 30 20 29 3b 0a 20 20  ECursor==0 );.  
b4a0: 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75    pOrderBy->iECu
b4b0: 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
b4c0: 54 61 62 2b 2b 3b 0a 20 20 20 20 61 64 64 72 20  Tab++;.    addr 
b4d0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
b4e0: 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  Op(pParse->pVdbe
b4f0: 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c  , OP_OpenVirtual
b500: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
b520: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
b530: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
b540: 72 2b 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  r+1);.    assert
b550: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72  ( p->addrOpenVir
b560: 74 5b 32 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  t[2] == -1 );.  
b570: 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72    p->addrOpenVir
b580: 74 5b 32 5d 20 3d 20 61 64 64 72 3b 0a 20 20 7d  t[2] = addr;.  }
b590: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6f 70  .}../*.** The op
b5a0: 63 6f 64 65 20 61 74 20 61 64 64 72 20 69 73 20  code at addr is 
b5b0: 61 6e 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61  an OP_OpenVirtua
b5c0: 6c 20 74 68 61 74 20 63 72 65 61 74 65 64 20 61  l that created a
b5d0: 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 69 6e 64 65   sorting.** inde
b5e0: 78 20 74 68 61 20 77 65 20 65 6e 64 65 64 20 75  x tha we ended u
b5f0: 70 20 6e 6f 74 20 6e 65 65 64 69 6e 67 2e 20 20  p not needing.  
b600: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
b610: 6e 67 65 73 20 74 68 61 74 0a 2a 2a 20 6f 70 63  nges that.** opc
b620: 6f 64 65 20 74 6f 20 4f 50 5f 4e 6f 6f 70 2e 0a  ode to OP_Noop..
b630: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
b640: 6e 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e  ncreateSortingIn
b650: 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
b660: 65 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  e, int addr){.  
b670: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
b680: 2d 3e 70 56 64 62 65 3b 0a 20 20 56 64 62 65 4f  ->pVdbe;.  VdbeO
b690: 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65 33  p *pOp = sqlite3
b6a0: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61 64 64  VdbeGetOp(v, add
b6b0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
b6c0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
b6d0: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 70 4f 70 2d  r, 0, 0);.  pOp-
b6e0: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f  >opcode = OP_Noo
b6f0: 70 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 30  p;.  pOp->p1 = 0
b700: 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 30 3b  ;.  pOp->p2 = 0;
b710: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
b720: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
b730: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65  _SELECT./*.** Re
b740: 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
b750: 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  iate collating s
b760: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
b770: 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
b780: 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  f.** the result 
b790: 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  set for the comp
b7a0: 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74  ound-select stat
b7b0: 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75  ement "p".  Retu
b7c0: 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68  rn NULL if.** th
b7d0: 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20  e column has no 
b7e0: 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
b7f0: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
b800: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
b810: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
b820: 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
b830: 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74   is taken from t
b840: 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
b850: 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65  term of the sele
b860: 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  ct that has a co
b870: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
b880: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c  ..*/.static Coll
b890: 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  Seq *multiSelect
b8a0: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
b8b0: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
b8c0: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43  , int iCol){.  C
b8d0: 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20  ollSeq *pRet;.  
b8e0: 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
b8f0: 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74  .    pRet = mult
b900: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
b910: 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72  Parse, p->pPrior
b920: 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65  , iCol);.  }else
b930: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  {.    pRet = 0;.
b940: 20 20 7d 0a 20 20 69 66 28 20 70 52 65 74 3d 3d    }.  if( pRet==
b950: 30 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  0 ){.    pRet = 
b960: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
b970: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  eq(pParse, p->pE
b980: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45  List->a[iCol].pE
b990: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  xpr);.  }.  retu
b9a0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69  rn pRet;.}.#endi
b9b0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
b9c0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
b9d0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
b9e0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
b9f0: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54  D_SELECT./*.** T
ba00: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
ba10: 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73  alled to process
ba20: 20 61 20 71 75 65 72 79 20 74 68 61 74 20 69 73   a query that is
ba30: 20 72 65 61 6c 6c 79 20 74 68 65 20 75 6e 69 6f   really the unio
ba40: 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65 63  n.** or intersec
ba50: 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20 6d  tion of two or m
ba60: 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65  ore separate que
ba70: 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20  ries..**.** "p" 
ba80: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69  points to the ri
ba90: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20  ght-most of the 
baa0: 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68  two queries.  th
bab0: 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a  e query on the.*
bac0: 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72  * left is p->pPr
bad0: 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71  ior.  The left q
bae0: 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20  uery could also 
baf0: 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  be a compound qu
bb00: 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20  ery.** in which 
bb10: 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e  case this routin
bb20: 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
bb30: 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a   recursively. .*
bb40: 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
bb50: 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75   of the total qu
bb60: 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72  ery are to be wr
bb70: 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73  itten into a des
bb80: 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  tination.** of t
bb90: 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70  ype eDest with p
bba0: 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a  arameter iParm..
bbb0: 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a  **.** Example 1:
bbc0: 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72    Consider a thr
bbd0: 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20  ee-way compound 
bbe0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
bbf0: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
bc00: 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  a FROM t1 UNION 
bc10: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
bc20: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20   UNION SELECT c 
bc30: 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68  FROM t3.**.** Th
bc40: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  is statement is 
bc50: 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c  parsed up as fol
bc60: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
bc70: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
bc80: 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  .**      |.**   
bc90: 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45     `----->  SELE
bca0: 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20  CT b FROM t2.** 
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
bcc0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
bcd0: 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c     `------>  SEL
bce0: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a  ECT a FROM t1.**
bcf0: 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69  .** The arrows i
bd00: 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62  n the diagram ab
bd10: 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68  ove represent th
bd20: 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20  e Select.pPrior 
bd30: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69  pointer..** So i
bd40: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
bd50: 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20  s called with p 
bd60: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20  equal to the t3 
bd70: 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70  query, then.** p
bd80: 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68  Prior will be th
bd90: 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e  e t2 query.  p->
bda0: 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e  op will be TK_UN
bdb0: 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65  ION in this case
bdc0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74  ..**.** Notice t
bdd0: 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74  hat because of t
bde0: 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61  he way SQLite pa
bdf0: 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45  rses compound SE
be00: 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e  LECTs, the.** in
be10: 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73  dividual selects
be20: 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72   always group fr
be30: 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
be40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
be50: 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50  multiSelect(.  P
be60: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
be70: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
be80: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
be90: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
bea0: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
beb0: 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
bec0: 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
bed0: 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20   int eDest,     
bee0: 20 20 20 20 20 20 20 2f 2a 20 5c 5f 5f 5f 20 20         /* \___  
bef0: 53 74 6f 72 65 20 71 75 65 72 79 20 72 65 73 75  Store query resu
bf00: 6c 74 73 20 61 73 20 73 70 65 63 69 66 69 65 64  lts as specified
bf10: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c   */.  int iParm,
bf20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2f              /* /
bf30: 20 20 20 20 20 62 79 20 74 68 65 73 65 20 74 77       by these tw
bf40: 6f 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 20  o parameters.   
bf50: 20 20 20 20 20 20 2a 2f 0a 20 20 63 68 61 72 20        */.  char 
bf60: 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20  *aff            
bf70: 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73 20   /* If eDest is 
bf80: 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61  SRT_Union, the a
bf90: 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a  ffinity string *
bfa0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
bfb0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
bfc0: 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
bfd0: 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
bfe0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
bff0: 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
c000: 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
c010: 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
c020: 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
c030: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
c040: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
c050: 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
c060: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
c070: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c080: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
c090: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
c0a0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
c0b0: 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
c0c0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
c0d0: 20 6f 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20 61   on p */.  int a
c0e0: 53 65 74 50 32 5b 32 5d 3b 20 20 20 20 20 20 20  SetP2[2];       
c0f0: 20 2f 2a 20 53 65 74 20 50 32 20 76 61 6c 75 65   /* Set P2 value
c100: 20 6f 66 20 74 68 65 73 65 20 6f 70 20 74 6f 20   of these op to 
c110: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
c120: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 74 50  s */.  int nSetP
c130: 32 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  2 = 0;       /* 
c140: 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20  Number of slots 
c150: 69 6e 20 61 53 65 74 50 32 5b 5d 20 75 73 65 64  in aSetP2[] used
c160: 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73   */..  /* Make s
c170: 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ure there is no 
c180: 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
c190: 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f  T clause on prio
c1a0: 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79  r SELECTs.  Only
c1b0: 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28  .  ** the last (
c1c0: 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45  right-most) SELE
c1d0: 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73  CT in the series
c1e0: 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44   may have an ORD
c1f0: 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a  ER BY or LIMIT..
c200: 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20    */.  if( p==0 
c210: 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  || p->pPrior==0 
c220: 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  ){.    rc = 1;. 
c230: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
c240: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
c250: 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
c260: 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
c270: 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74  rior->pRightmost
c280: 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73  !=pPrior );.  as
c290: 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52  sert( pPrior->pR
c2a0: 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69  ightmost==p->pRi
c2b0: 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 69 66 28  ghtmost );.  if(
c2c0: 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
c2d0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
c2e0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
c2f0: 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65  "ORDER BY clause
c300: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
c310: 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
c320: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
c330: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
c340: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
c350: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
c360: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
c370: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
c380: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
c390: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49  orMsg(pParse,"LI
c3a0: 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  MIT clause shoul
c3b0: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
c3c0: 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
c3d0: 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
c3e0: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
c3f0: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
c400: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
c410: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
c420: 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76 61  ure we have a va
c430: 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e 65  lid query engine
c440: 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74  .  If not, creat
c450: 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a  e a new one..  *
c460: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
c470: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
c480: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
c490: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
c4a0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
c4b0: 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  end;.  }..  /* C
c4c0: 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e  reate the destin
c4d0: 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20  ation temporary 
c4e0: 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61  table if necessa
c4f0: 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  ry.  */.  if( eD
c500: 65 73 74 3d 3d 53 52 54 5f 56 69 72 74 75 61 6c  est==SRT_Virtual
c510: 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
c520: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
c530: 20 20 20 20 61 73 73 65 72 74 28 20 6e 53 65 74      assert( nSet
c540: 50 32 3c 73 69 7a 65 6f 66 28 61 53 65 74 50 32  P2<sizeof(aSetP2
c550: 29 2f 73 69 7a 65 6f 66 28 61 53 65 74 50 32 5b  )/sizeof(aSetP2[
c560: 30 5d 29 20 29 3b 0a 20 20 20 20 61 53 65 74 50  0]) );.    aSetP
c570: 32 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d 20 73 71  2[nSetP2++] = sq
c580: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c590: 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c  , OP_OpenVirtual
c5a0: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
c5b0: 20 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62   eDest = SRT_Tab
c5c0: 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  le;.  }..  /* Ge
c5d0: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
c5e0: 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
c5f0: 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ht SELECT statem
c600: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72  ents..  */.  pOr
c610: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
c620: 72 42 79 3b 0a 20 20 73 77 69 74 63 68 28 20 70  rBy;.  switch( p
c630: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
c640: 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20   TK_ALL: {.     
c650: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
c660: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
c670: 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  addr = 0;.      
c680: 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
c690: 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20  r->pLimit );.   
c6a0: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69       pPrior->pLi
c6b0: 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
c6c0: 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d  .        pPrior-
c6d0: 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f  >pOffset = p->pO
c6e0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 72  ffset;.        r
c6f0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
c700: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
c710: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
c720: 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20  0, 0, 0, aff);. 
c730: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
c740: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
c750: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
c760: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c770: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
c780: 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c  0;.        p->iL
c790: 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  imit = pPrior->i
c7a0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70  Limit;.        p
c7b0: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69  ->iOffset = pPri
c7c0: 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  or->iOffset;.   
c7d0: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
c7e0: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   0;.        p->p
c7f0: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
c800: 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69      if( p->iLimi
c810: 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t>=0 ){.        
c820: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
c830: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c840: 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69 4c  IfMemZero, p->iL
c850: 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  imit, 0);.      
c860: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
c870: 28 76 2c 20 22 23 20 4a 75 6d 70 20 61 68 65 61  (v, "# Jump ahea
c880: 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68  d if LIMIT reach
c890: 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  ed"));.        }
c8a0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
c8b0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
c8c0: 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50  se, p, eDest, iP
c8d0: 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  arm, 0, 0, 0, af
c8e0: 66 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  f);.        p->p
c8f0: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
c900: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
c910: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
c920: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
c930: 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
c940: 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b       if( addr ){
c950: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c960: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
c970: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20  , addr);.       
c980: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
c990: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c9a0: 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c  /* For UNION ALL
c9b0: 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61   ... ORDER BY fa
c9c0: 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
c9d0: 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20  e next case */. 
c9e0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
c9f0: 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73  _EXCEPT:.    cas
ca00: 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20  e TK_UNION: {.  
ca10: 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62      int unionTab
ca20: 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  ;    /* Cursor n
ca30: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
ca40: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c  porary table hol
ca50: 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20  ding result */. 
ca60: 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b       int op = 0;
ca70: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
ca80: 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
ca90: 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
caa0: 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e  self */.      in
cab0: 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f  t priorOp;     /
cac0: 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61  * The SRT_ opera
cad0: 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f  tion to apply to
cae0: 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a   prior selects *
caf0: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  /.      Expr *pL
cb00: 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20  imit, *pOffset; 
cb10: 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20  /* Saved values 
cb20: 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64  of p->nLimit and
cb30: 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20   p->nOffset */. 
cb40: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a       int addr;..
cb50: 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
cb60: 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20  p->op==TK_ALL ? 
cb70: 53 52 54 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f  SRT_Table : SRT_
cb80: 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28  Union;.      if(
cb90: 20 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20   eDest==priorOp 
cba0: 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26  && pOrderBy==0 &
cbb0: 26 20 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 20  & !p->pLimit && 
cbc0: 21 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20  !p->pOffset ){. 
cbd0: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e         /* We can
cbe0: 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61   reuse a tempora
cbf0: 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74  ry table generat
cc00: 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74  ed by a SELECT t
cc10: 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  o our.        **
cc20: 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20   right..        
cc30: 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
cc40: 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20  Tab = iParm;.   
cc50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cc60: 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65    /* We will nee
cc70: 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20  d to create our 
cc80: 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  own temporary ta
cc90: 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ble to hold the.
cca0: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
ccb0: 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
ccc0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
ccd0: 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70      unionTab = p
cce0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
ccf0: 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65         if( pOrde
cd00: 72 42 79 20 26 26 20 6d 61 74 63 68 4f 72 64 65  rBy && matchOrde
cd10: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
cd20: 73 65 2c 20 70 2c 20 70 4f 72 64 65 72 42 79 2c  se, p, pOrderBy,
cd30: 20 75 6e 69 6f 6e 54 61 62 2c 31 29 20 29 7b 0a   unionTab,1) ){.
cd40: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
cd50: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
cd60: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
cd70: 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
cd80: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
cd90: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
cda0: 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20  OP_OpenVirtual, 
cdb0: 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
cdc0: 20 20 20 20 20 20 69 66 28 20 70 72 69 6f 72 4f        if( priorO
cdd0: 70 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a  p==SRT_Table ){.
cde0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
cdf0: 28 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66 28  ( nSetP2<sizeof(
ce00: 61 53 65 74 50 32 29 2f 73 69 7a 65 6f 66 28 61  aSetP2)/sizeof(a
ce10: 53 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20 20  SetP2[0]) );.   
ce20: 20 20 20 20 20 20 20 61 53 65 74 50 32 5b 6e 53         aSetP2[nS
ce30: 65 74 50 32 2b 2b 5d 20 3d 20 61 64 64 72 3b 0a  etP2++] = addr;.
ce40: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
ce50: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
ce60: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74   p->addrOpenVirt
ce70: 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
ce80: 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70         p->addrOp
ce90: 65 6e 56 69 72 74 5b 30 5d 20 3d 20 61 64 64 72  enVirt[0] = addr
cea0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
ceb0: 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 56  Rightmost->usesV
cec0: 69 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  irt = 1;.       
ced0: 20 7d 0a 20 20 20 20 20 20 20 20 63 72 65 61 74   }.        creat
cee0: 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50  eSortingIndex(pP
cef0: 61 72 73 65 2c 20 70 2c 20 70 4f 72 64 65 72 42  arse, p, pOrderB
cf00: 79 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  y);.        asse
cf10: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
cf20: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
cf30: 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
cf40: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
cf50: 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20   our left.      
cf60: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
cf70: 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72   !pPrior->pOrder
cf80: 42 79 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  By );.      rc =
cf90: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
cfa0: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70  Parse, pPrior, p
cfb0: 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62  riorOp, unionTab
cfc0: 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b  , 0, 0, 0, aff);
cfd0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
cfe0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
cff0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
d000: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
d010: 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
d020: 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nt SELECT statem
d030: 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ent.      */.   
d040: 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70     switch( p->op
d050: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 63 61 73   ){.         cas
d060: 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70  e TK_EXCEPT:  op
d070: 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 20 20   = SRT_Except;  
d080: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
d090: 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
d0a0: 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e    op = SRT_Union
d0b0: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
d0c0: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c       case TK_ALL
d0d0: 3a 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 54  :     op = SRT_T
d0e0: 61 62 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a  able;    break;.
d0f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
d100: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
d110: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
d120: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 73   0;.      p->dis
d130: 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 70  allowOrderBy = p
d140: 4f 72 64 65 72 42 79 21 3d 30 3b 0a 20 20 20 20  OrderBy!=0;.    
d150: 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
d160: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
d170: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
d180: 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
d190: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
d1a0: 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
d1b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
d1c0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
d1d0: 20 6f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30   op, unionTab, 0
d1e0: 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
d1f0: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
d200: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
d210: 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
d220: 65 72 42 79 3b 0a 20 20 20 20 20 20 73 71 6c 69  erBy;.      sqli
d230: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d  te3ExprDelete(p-
d240: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
d250: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
d260: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
d270: 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
d280: 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
d290: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 69  = -1;.      p->i
d2a0: 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20 20  Offset = -1;.   
d2b0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
d2c0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
d2d0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
d2e0: 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43    }...      /* C
d2f0: 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20  onvert the data 
d300: 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
d310: 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74   table into what
d320: 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20  ever form.      
d330: 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65  ** it is that we
d340: 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e   currently need.
d350: 0a 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20 0a  .      */      .
d360: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 21        if( eDest!
d370: 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f  =priorOp || unio
d380: 6e 54 61 62 21 3d 69 50 61 72 6d 20 29 7b 0a 20  nTab!=iParm ){. 
d390: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74         int iCont
d3a0: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
d3b0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
d3c0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
d3d0: 20 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74         if( eDest
d3e0: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
d3f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65  {.          gene
d400: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
d410: 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70 45  pParse, 0, p->pE
d420: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  List);.        }
d430: 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20  .        iBreak 
d440: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
d450: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
d460: 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
d470: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
d480: 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70  v);.        comp
d490: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
d4a0: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
d4b0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
d4c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d4d0: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69  , OP_Rewind, uni
d4e0: 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a  onTab, iBreak);.
d4f0: 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
d500: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
d510: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
d520: 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49      rc = selectI
d530: 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
d540: 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75   p, p->pEList, u
d550: 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69  nionTab, p->pELi
d560: 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  st->nExpr,.     
d570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d580: 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
d590: 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61  , -1, eDest, iPa
d5a0: 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rm, .           
d5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5c0: 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c    iCont, iBreak,
d5d0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
d5e0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
d5f0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
d600: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
d610: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
d620: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
d630: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
d640: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
d650: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d660: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
d670: 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
d680: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73  tart);.        s
d690: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
d6a0: 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
d6b0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d6c0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d6d0: 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61  P_Close, unionTa
d6e0: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
d6f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d700: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
d710: 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20  TERSECT: {.     
d720: 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
d730: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
d740: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
d750: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
d760: 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a  imit, *pOffset;.
d770: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
d780: 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53  .      /* INTERS
d790: 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74  ECT is different
d7a0: 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73   from the others
d7b0: 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72   since it requir
d7c0: 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20  es.      ** two 
d7d0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
d7e0: 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20  .  Hence it has 
d7f0: 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42  its own case.  B
d800: 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79  egin.      ** by
d810: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20   allocating the 
d820: 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e  tables we will n
d830: 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  eed..      */.  
d840: 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73      tab1 = pPars
d850: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
d860: 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e   tab2 = pParse->
d870: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nTab++;.      if
d880: 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61  ( pOrderBy && ma
d890: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
d8a0: 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70 4f 72 64  mn(pParse,p,pOrd
d8b0: 65 72 42 79 2c 74 61 62 31 2c 31 29 20 29 7b 0a  erBy,tab1,1) ){.
d8c0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
d8d0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
d8e0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
d8f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 72 65       }.      cre
d900: 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28  ateSortingIndex(
d910: 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 72 64 65  pParse, p, pOrde
d920: 72 42 79 29 3b 0a 0a 20 20 20 20 20 20 61 64 64  rBy);..      add
d930: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
d940: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56  ddOp(v, OP_OpenV
d950: 69 72 74 75 61 6c 2c 20 74 61 62 31 2c 20 30 29  irtual, tab1, 0)
d960: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d970: 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b  p->addrOpenVirt[
d980: 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
d990: 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72    p->addrOpenVir
d9a0: 74 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  t[0] = addr;.   
d9b0: 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74     p->pRightmost
d9c0: 2d 3e 75 73 65 73 56 69 72 74 20 3d 20 31 3b 0a  ->usesVirt = 1;.
d9d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
d9e0: 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20  >pEList );..    
d9f0: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
da00: 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66  LECTs to our lef
da10: 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  t into temporary
da20: 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20   table "tab1".. 
da30: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
da40: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
da50: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
da60: 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31   SRT_Union, tab1
da70: 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b  , 0, 0, 0, aff);
da80: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
da90: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
daa0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
dab0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
dac0: 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
dad0: 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
dae0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
daf0: 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
db00: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
db10: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
db20: 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20  OP_OpenVirtual, 
db30: 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
db40: 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
db50: 70 65 6e 56 69 72 74 5b 31 5d 20 3d 3d 20 2d 31  penVirt[1] == -1
db60: 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64   );.      p->add
db70: 72 4f 70 65 6e 56 69 72 74 5b 31 5d 20 3d 20 61  rOpenVirt[1] = a
db80: 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ddr;.      p->pP
db90: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
dba0: 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
dbb0: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
dbc0: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
dbd0: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
dbe0: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  set;.      p->pO
dbf0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
dc00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
dc10: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 53  ect(pParse, p, S
dc20: 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 2c 20  RT_Union, tab2, 
dc30: 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20  0, 0, 0, aff);. 
dc40: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
dc50: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 73   pPrior;.      s
dc60: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
dc70: 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20  (p->pLimit);.   
dc80: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
dc90: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
dca0: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
dcb0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  t;.      if( rc 
dcc0: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
dcd0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
dce0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
dcf0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
dd00: 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
dd10: 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
dd20: 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
dd30: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e        ** tables.
dd40: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
dd50: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
dd60: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  t );.      if( e
dd70: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
dd80: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65  ck ){.        ge
dd90: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
dda0: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e  s(pParse, 0, p->
ddb0: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  pEList);.      }
ddc0: 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20  .      iBreak = 
ddd0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
dde0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
ddf0: 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
de00: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
de10: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
de20: 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
de30: 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
de40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
de50: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
de60: 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61  ind, tab1, iBrea
de70: 6b 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74  k);.      iStart
de80: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
de90: 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79  dOp(v, OP_RowKey
dea0: 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
deb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
dec0: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  Op(v, OP_NotFoun
ded0: 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 29 3b  d, tab2, iCont);
dee0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65  .      rc = sele
def0: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
df00: 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
df10: 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73  , tab1, p->pELis
df20: 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  t->nExpr,.      
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df40: 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2c         pOrderBy,
df50: 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72   -1, eDest, iPar
df60: 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  m, .            
df70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df80: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
df90: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
dfa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
dfb0: 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
dfc0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
dfd0: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
dfe0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
dff0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
e000: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
e010: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
e020: 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74  _Next, tab1, iSt
e030: 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  art);.      sqli
e040: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
e050: 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
e060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e070: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
e080: 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
e090: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e0a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
e0b0: 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
e0c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e0d0: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
e0e0: 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69  re all SELECTs i
e0f0: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
e100: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
e110: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
e120: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72  .  ** in their r
e130: 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f  esult sets..  */
e140: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
e150: 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e  List && pPrior->
e160: 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20  pEList );.  if( 
e170: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
e180: 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  !=pPrior->pEList
e190: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73  ->nExpr ){.    s
e1a0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e1b0: 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20  Parse, "SELECTs 
e1c0: 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  to the left and 
e1d0: 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20  right of %s".   
e1e0: 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65     " do not have
e1f0: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
e200: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
e210: 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  ns", selectOpNam
e220: 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
e230: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
e240: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
e250: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
e260: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
e270: 6c 75 6d 6e 73 20 69 6e 20 74 65 6d 70 6f 72 61  lumns in tempora
e280: 72 79 20 74 61 62 6c 65 73 0a 20 20 2a 2f 0a 20  ry tables.  */. 
e290: 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73   nCol = p->pELis
e2a0: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 77 68 69 6c  t->nExpr;.  whil
e2b0: 65 28 20 6e 53 65 74 50 32 20 29 7b 0a 20 20 20  e( nSetP2 ){.   
e2c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
e2d0: 67 65 50 32 28 76 2c 20 61 53 65 74 50 32 5b 2d  geP2(v, aSetP2[-
e2e0: 2d 6e 53 65 74 50 32 5d 2c 20 6e 43 6f 6c 29 3b  -nSetP2], nCol);
e2f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
e300: 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
e310: 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 65  uences used by e
e320: 69 74 68 65 72 20 74 68 65 20 4f 52 44 45 52 20  ither the ORDER 
e330: 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 20 20 2a  BY clause or.  *
e340: 2a 20 62 79 20 61 6e 79 20 74 65 6d 70 6f 72 61  * by any tempora
e350: 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64  ry tables needed
e360: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
e370: 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
e380: 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74  t..  ** Attach t
e390: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
e3a0: 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70  ture to all temp
e3b0: 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 49  orary tables.  I
e3c0: 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 4f  nvoke the.  ** O
e3d0: 52 44 45 52 20 42 59 20 70 72 6f 63 65 73 73 69  RDER BY processi
e3e0: 6e 67 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ng if there is a
e3f0: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
e400: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
e410: 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e  s section is run
e420: 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   by the right-mo
e430: 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  st SELECT statem
e440: 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53  ent only..  ** S
e450: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
e460: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77   to the left alw
e470: 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61  ays skip this pa
e480: 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d  rt.  The right-m
e490: 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20  ost.  ** SELECT 
e4a0: 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20  might also skip 
e4b0: 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20  this part if it 
e4c0: 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20  has no ORDER BY 
e4d0: 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20  clause and.  ** 
e4e0: 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61  no temp tables a
e4f0: 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  re required..  *
e500: 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
e510: 20 7c 7c 20 70 2d 3e 75 73 65 73 56 69 72 74 20   || p->usesVirt 
e520: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e540: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
e550: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49  nter */.    KeyI
e560: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
e570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
e580: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
e590: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
e5a0: 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74  et */.    Select
e5b0: 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
e5c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
e5d0: 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53  ooping through S
e5e0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
e5f0: 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
e600: 2a 2a 61 70 43 6f 6c 6c 3b 0a 20 20 20 20 43 6f  **apColl;.    Co
e610: 6c 6c 53 65 71 20 2a 2a 61 43 6f 70 79 3b 0a 0a  llSeq **aCopy;..
e620: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
e630: 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a  Rightmost==p );.
e640: 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
e650: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65  qliteMalloc(size
e660: 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43  of(*pKeyInfo)+nC
e670: 6f 6c 2a 32 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c  ol*2*sizeof(Coll
e680: 53 65 71 2a 29 20 2b 20 6e 43 6f 6c 29 3b 0a 20  Seq*) + nCol);. 
e690: 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f     if( !pKeyInfo
e6a0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
e6b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
e6c0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
e6d0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
e6e0: 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  .    pKeyInfo->e
e6f0: 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  nc = pParse->db-
e700: 3e 65 6e 63 3b 0a 20 20 20 20 70 4b 65 79 49 6e  >enc;.    pKeyIn
e710: 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f  fo->nField = nCo
e720: 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  l;..    for(i=0,
e730: 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f   apColl=pKeyInfo
e740: 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b  ->aColl; i<nCol;
e750: 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b   i++, apColl++){
e760: 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d  .      *apColl =
e770: 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
e780: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
e790: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
e7a0: 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  *apColl ){.     
e7b0: 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 50 61     *apColl = pPa
e7c0: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
e7d0: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
e7e0: 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  }..    for(pLoop
e7f0: 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =p; pLoop; pLoop
e800: 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b  =pLoop->pPrior){
e810: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
e820: 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<2; i++){.     
e830: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c     int addr = pL
e840: 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72  oop->addrOpenVir
e850: 74 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  t[i];.        if
e860: 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
e870: 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20        /* If [0] 
e880: 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b  is unused then [
e890: 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65  1] is also unuse
e8a0: 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20  d.  So we can.  
e8b0: 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
e8c0: 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61  s safely abort a
e8d0: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69  s soon as the fi
e8e0: 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20  rst unused slot 
e8f0: 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  is found */.    
e900: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
e910: 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72  oop->addrOpenVir
e920: 74 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20  t[1]<0 );.      
e930: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e940: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
e950: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
e960: 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b  (v, addr, nCol);
e970: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e980: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
e990: 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65  addr, (char*)pKe
e9a0: 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46  yInfo, P3_KEYINF
e9b0: 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  O);.      }.    
e9c0: 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  }..    if( pOrde
e9d0: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 74 72  rBy ){.      str
e9e0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
e9f0: 6d 20 2a 70 4f 54 65 72 6d 20 3d 20 70 4f 72 64  m *pOTerm = pOrd
ea00: 65 72 42 79 2d 3e 61 3b 0a 20 20 20 20 20 20 69  erBy->a;.      i
ea10: 6e 74 20 6e 4f 72 64 65 72 42 79 45 78 70 72 20  nt nOrderByExpr 
ea20: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
ea30: 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  r;.      int add
ea40: 72 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 53 6f  r;.      u8 *pSo
ea50: 72 74 4f 72 64 65 72 3b 0a 0a 20 20 20 20 20 20  rtOrder;..      
ea60: 61 43 6f 70 79 20 3d 20 28 43 6f 6c 6c 53 65 71  aCopy = (CollSeq
ea70: 2a 2a 29 26 70 4b 65 79 49 6e 66 6f 5b 31 5d 3b  **)&pKeyInfo[1];
ea80: 0a 20 20 20 20 20 20 70 53 6f 72 74 4f 72 64 65  .      pSortOrde
ea90: 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  r = pKeyInfo->aS
eaa0: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
eab0: 26 61 43 6f 70 79 5b 6e 43 6f 6c 5d 3b 0a 20 20  &aCopy[nCol];.  
eac0: 20 20 20 20 6d 65 6d 63 70 79 28 61 43 6f 70 79      memcpy(aCopy
ead0: 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  , pKeyInfo->aCol
eae0: 6c 2c 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 43  l, nCol*sizeof(C
eaf0: 6f 6c 6c 53 65 71 2a 29 29 3b 0a 20 20 20 20 20  ollSeq*));.     
eb00: 20 61 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   apColl = pKeyIn
eb10: 66 6f 2d 3e 61 43 6f 6c 6c 3b 0a 20 20 20 20 20  fo->aColl;.     
eb20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
eb30: 65 72 42 79 45 78 70 72 3b 20 69 2b 2b 2c 20 70  erByExpr; i++, p
eb40: 4f 54 65 72 6d 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  OTerm++, apColl+
eb50: 2b 2c 20 70 53 6f 72 74 4f 72 64 65 72 2b 2b 29  +, pSortOrder++)
eb60: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
eb70: 70 45 78 70 72 20 3d 20 70 4f 54 65 72 6d 2d 3e  pExpr = pOTerm->
eb80: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 63  pExpr;.        c
eb90: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4f 54  har *zName = pOT
eba0: 65 72 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  erm->zName;.    
ebb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
ebc0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
ebd0: 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
ebe0: 6d 6e 3c 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  mn<nCol );.     
ebf0: 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a     if( zName ){.
ec00: 20 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c            *apCol
ec10: 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  l = sqlite3Locat
ec20: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
ec30: 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20   zName, -1);.   
ec40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ec50: 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
ec60: 61 43 6f 70 79 5b 70 45 78 70 72 2d 3e 69 43 6f  aCopy[pExpr->iCo
ec70: 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20 20 20 20 7d  lumn];.        }
ec80: 0a 20 20 20 20 20 20 20 20 2a 70 53 6f 72 74 4f  .        *pSortO
ec90: 72 64 65 72 20 3d 20 70 4f 54 65 72 6d 2d 3e 73  rder = pOTerm->s
eca0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20  ortOrder;.      
ecb0: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
ecc0: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70  p->pRightmost==p
ecd0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
ece0: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72  ( p->addrOpenVir
ecf0: 74 5b 32 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20  t[2]>=0 );.     
ed00: 20 61 64 64 72 20 3d 20 70 2d 3e 61 64 64 72 4f   addr = p->addrO
ed10: 70 65 6e 56 69 72 74 5b 32 5d 3b 0a 20 20 20 20  penVirt[2];.    
ed20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
ed30: 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 70  ngeP2(v, addr, p
ed40: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2b  ->pEList->nExpr+
ed50: 32 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  2);.      pKeyIn
ed60: 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 4f 72  fo->nField = nOr
ed70: 64 65 72 42 79 45 78 70 72 3b 0a 20 20 20 20 20  derByExpr;.     
ed80: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
ed90: 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63  geP3(v, addr, (c
eda0: 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
edb0: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
edc0: 46 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  F);.      pKeyIn
edd0: 66 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 65  fo = 0;.      ge
ede0: 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70  nerateSortTail(p
edf0: 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 2d 3e  Parse, p, v, p->
ee00: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65  pEList->nExpr, e
ee10: 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20  Dest, iParm);.  
ee20: 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 46    }..    sqliteF
ee30: 72 65 65 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ree(pKeyInfo);. 
ee40: 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74   }..multi_select
ee50: 5f 65 6e 64 3a 0a 20 20 72 65 74 75 72 6e 20 72  _end:.  return r
ee60: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
ee70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
ee80: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23  UND_SELECT */..#
ee90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
eea0: 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 53 63  IT_VIEW./*.** Sc
eeb0: 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  an through the e
eec0: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
eed0: 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20    Replace every 
eee0: 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20  reference to.** 
eef0: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c  a column in tabl
ef00: 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20  e number iTable 
ef10: 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
ef20: 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a  he iColumn-th.**
ef30: 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74   entry in pEList
ef40: 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65  .  (But leave re
ef50: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
ef60: 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a  ROWID column .**
ef70: 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a   unchanged.).**.
ef80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ef90: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  is part of the f
efa0: 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64  lattening proced
efb0: 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79  ure.  A subquery
efc0: 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74  .** whose result
efd0: 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20   set is defined 
efe0: 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72  by pEList appear
eff0: 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68  s as entry in th
f000: 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65  e.** FROM clause
f010: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63   of a SELECT suc
f020: 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  h that the VDBE 
f030: 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20  cursor assigned 
f040: 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20  to that.** FORM 
f050: 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20  clause entry is 
f060: 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f  iTable.  This ro
f070: 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e  utine make the n
f080: 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61  ecessary .** cha
f090: 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f  nges to pExpr so
f0a0: 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20   that it refers 
f0b0: 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
f0c0: 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20  source table.** 
f0d0: 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
f0e0: 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c  rather the resul
f0f0: 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62  t set of the sub
f100: 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
f110: 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
f120: 69 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 69 6e  ist(ExprList*,in
f130: 74 2c 45 78 70 72 4c 69 73 74 2a 29 3b 20 20 2f  t,ExprList*);  /
f140: 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20 2a  * Forward Decl *
f150: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
f160: 62 73 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74  bstSelect(Select
f170: 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73   *, int, ExprLis
f180: 74 20 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72  t *);  /* Forwar
f190: 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69 63  d Decl */.static
f1a0: 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 28   void substExpr(
f1b0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
f1c0: 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73   iTable, ExprLis
f1d0: 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 66  t *pEList){.  if
f1e0: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
f1f0: 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72  urn;.  if( pExpr
f200: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
f210: 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
f220: 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ==iTable ){.    
f230: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
f240: 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45  mn<0 ){.      pE
f250: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c  xpr->op = TK_NUL
f260: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
f270: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a      Expr *pNew;.
f280: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
f290: 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72  List!=0 && pExpr
f2a0: 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74  ->iColumn<pEList
f2b0: 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
f2c0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
f2d0: 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70  pLeft==0 && pExp
f2e0: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20  r->pRight==0 && 
f2f0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20  pExpr->pList==0 
f300: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
f310: 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d  pEList->a[pExpr-
f320: 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b  >iColumn].pExpr;
f330: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f340: 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  New!=0 );.      
f350: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77  pExpr->op = pNew
f360: 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73 73 65  ->op;.      asse
f370: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
f380: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ==0 );.      pEx
f390: 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  pr->pLeft = sqli
f3a0: 74 65 33 45 78 70 72 44 75 70 28 70 4e 65 77 2d  te3ExprDup(pNew-
f3b0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61  >pLeft);.      a
f3c0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52  ssert( pExpr->pR
f3d0: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
f3e0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
f3f0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
f400: 70 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20  pNew->pRight);. 
f410: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
f420: 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a  pr->pList==0 );.
f430: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69        pExpr->pLi
f440: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
f450: 4c 69 73 74 44 75 70 28 70 4e 65 77 2d 3e 70 4c  ListDup(pNew->pL
f460: 69 73 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70  ist);.      pExp
f470: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77  r->iTable = pNew
f480: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
f490: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
f4a0: 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a   pNew->iColumn;.
f4b0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
f4c0: 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a  g = pNew->iAgg;.
f4d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b        sqlite3Tok
f4e0: 65 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 74  enCopy(&pExpr->t
f4f0: 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b  oken, &pNew->tok
f500: 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  en);.      sqlit
f510: 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78  e3TokenCopy(&pEx
f520: 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d  pr->span, &pNew-
f530: 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 70 45  >span);.      pE
f540: 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  xpr->pSelect = s
f550: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
f560: 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  pNew->pSelect);.
f570: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61        pExpr->fla
f580: 67 73 20 3d 20 70 4e 65 77 2d 3e 66 6c 61 67 73  gs = pNew->flags
f590: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
f5a0: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
f5b0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61  Expr->pLeft, iTa
f5c0: 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
f5d0: 20 20 73 75 62 73 74 45 78 70 72 28 70 45 78 70    substExpr(pExp
f5e0: 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c  r->pRight, iTabl
f5f0: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
f600: 73 75 62 73 74 53 65 6c 65 63 74 28 70 45 78 70  substSelect(pExp
f610: 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  r->pSelect, iTab
f620: 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
f630: 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
f640: 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61  Expr->pList, iTa
f650: 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
f660: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
f670: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78  substExprList(Ex
f680: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69  prList *pList, i
f690: 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c  nt iTable, ExprL
f6a0: 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20  ist *pEList){.  
f6b0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
f6c0: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
f6d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
f6e0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
f6f0: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
f700: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
f710: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
f720: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
f730: 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
f740: 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20  (Select *p, int 
f750: 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74  iTable, ExprList
f760: 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 66 28   *pEList){.  if(
f770: 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
f780: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d  substExprList(p-
f790: 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  >pEList, iTable,
f7a0: 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
f7b0: 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  tExprList(p->pGr
f7c0: 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70  oupBy, iTable, p
f7d0: 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
f7e0: 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65  xprList(p->pOrde
f7f0: 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  rBy, iTable, pEL
f800: 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
f810: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54  r(p->pHaving, iT
f820: 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
f830: 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 57   substExpr(p->pW
f840: 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45  here, iTable, pE
f850: 4c 69 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  List);.}.#endif 
f860: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
f870: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
f880: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
f890: 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
f8a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
f8b0: 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65  tempts to flatte
f8c0: 6e 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20  n subqueries in 
f8d0: 6f 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a  order to speed.*
f8e0: 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74  * execution.  It
f8f0: 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74   returns 1 if it
f900: 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61   makes changes a
f910: 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74  nd 0 if no flatt
f920: 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e  ening.** occurs.
f930: 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73  .**.** To unders
f940: 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74  tand the concept
f950: 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20   of flattening, 
f960: 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c  consider the fol
f970: 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a  lowing.** query:
f980: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
f990: 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T a FROM (SELECT
f9a0: 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
f9b0: 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57  1 WHERE z<100) W
f9c0: 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54  HERE a>5.**.** T
f9d0: 68 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f  he default way o
f9e0: 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  f implementing t
f9f0: 68 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20  his query is to 
fa00: 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73  execute the.** s
fa10: 75 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e  ubquery first an
fa20: 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
fa30: 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61  lts in a tempora
fa40: 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a  ry table, then.*
fa50: 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20  * run the outer 
fa60: 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65  query on that te
fa70: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20  mporary table.  
fa80: 54 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77  This requires tw
fa90: 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72  o.** passes over
faa0: 20 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74   the data.  Furt
fab0: 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65  hermore, because
fac0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
fad0: 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69  able.** has no i
fae0: 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52  ndices, the WHER
faf0: 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  E clause on the 
fb00: 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e  outer query cann
fb10: 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a  ot be.** optimiz
fb20: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
fb30: 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
fb40: 74 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69  to rewrite queri
fb50: 65 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61  es such as the a
fb60: 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73  bove into.** a s
fb70: 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63  ingle flat selec
fb80: 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  t, like this:.**
fb90: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78  .**     SELECT x
fba0: 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
fbb0: 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20  WHERE z<100 AND 
fbc0: 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  a>5.**.** The co
fbd0: 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  de generated for
fbe0: 20 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74   this simpificat
fbf0: 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61  ion gives the sa
fc00: 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74  me result.** but
fc10: 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61   only has to sca
fc20: 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e  n the data once.
fc30: 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e    And because in
fc40: 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20  dices might .** 
fc50: 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62  exist on the tab
fc60: 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74  le t1, a complet
fc70: 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61  e scan of the da
fc80: 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  ta might be.** a
fc90: 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c  voided..**.** Fl
fca0: 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79  attening is only
fcb0: 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c   attempted if al
fcc0: 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
fcd0: 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
fce0: 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75  **   (1)  The su
fcf0: 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
fd00: 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
fd10: 74 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65  t both use aggre
fd20: 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  gates..**.**   (
fd30: 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
fd40: 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
fd50: 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65  gate or the oute
fd60: 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
fd70: 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
fd80: 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
fd90: 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
fda0: 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
fdb0: 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20  eft outer join, 
fdc0: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65  or.**        the
fdd0: 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
fde0: 20 69 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20   itself a join. 
fdf0: 20 28 54 69 63 6b 65 74 20 23 33 30 36 29 0a 2a   (Ticket #306).*
fe00: 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20  *.**   (4)  The 
fe10: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
fe20: 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20  DISTINCT or the 
fe30: 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
fe40: 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
fe50: 20 20 20 28 35 29 20 20 54 68 65 20 73 75 62 71     (5)  The subq
fe60: 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54  uery is not DIST
fe70: 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65  INCT or the oute
fe80: 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
fe90: 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
fea0: 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
feb0: 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71     (6)  The subq
fec0: 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
fed0: 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
fee0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
fef0: 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
ff00: 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
ff10: 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71     (7)  The subq
ff20: 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20  uery has a FROM 
ff30: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
ff40: 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (8)  The subquer
ff50: 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
ff60: 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
ff70: 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
ff80: 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
ff90: 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  9)  The subquery
ffa0: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
ffb0: 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
ffc0: 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
ffd0: 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
ffe0: 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
fff0: 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75   (10)  The subqu
10000 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
10010 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
10020 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
10030 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  oes not.**      
10040 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a    use LIMIT..**.
10050 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75  **  (11)  The su
10060 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
10070 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
10080 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45  t both have ORDE
10090 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  R BY clauses..**
100a0 0a 2a 2a 20 20 28 31 32 29 20 20 54 68 65 20 73  .**  (12)  The s
100b0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74  ubquery is not t
100c0 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66  he right term of
100d0 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
100e0 49 4e 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20  IN or the.**    
100f0 20 20 20 20 73 75 62 71 75 65 72 79 20 68 61 73      subquery has
10100 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
10110 2e 20 20 28 61 64 64 65 64 20 62 79 20 74 69 63  .  (added by tic
10120 6b 65 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20  ket #350).**.** 
10130 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  In this routine,
10140 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74   the "p" paramet
10150 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
10160 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  to the outer que
10170 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75  ry..** The subqu
10180 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e  ery is p->pSrc->
10190 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67  a[iFrom].  isAgg
101a0 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
101b0 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75  outer query.** u
101c0 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61  ses aggregates a
101d0 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nd subqueryIsAgg
101e0 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
101f0 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67  subquery uses ag
10200 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
10210 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
10220 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20   not attempted, 
10230 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
10240 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75  a no-op and retu
10250 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61  rns 0..** If fla
10260 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d  ttening is attem
10270 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  pted this routin
10280 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a  e returns 1..**.
10290 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78  ** All of the ex
102a0 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
102b0 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20  s must occur on 
102c0 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71  both the outer q
102d0 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20  uery and.** the 
102e0 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20  subquery before 
102f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
10300 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
10310 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
10320 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
10330 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
10340 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
10350 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
10360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10370 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72   parent or outer
10380 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10390 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
103a0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
103b0 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d  ndex in p->pSrc-
103c0 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65  >a[] of the inne
103d0 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  r subquery */.  
103e0 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20  int isAgg,      
103f0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
10400 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65  outer SELECT use
10410 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
10420 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73  tions */.  int s
10430 75 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20  ubqueryIsAgg    
10440 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73  /* True if the s
10450 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
10460 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
10470 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
10480 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20  *pSub;       /* 
10490 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
104a0 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f  or "subquery" */
104b0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
104c0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
104d0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
104e0 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
104f0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53    SrcList *pSubS
10500 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
10510 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
10520 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78  subquery */.  Ex
10530 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20  prList *pList;  
10540 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
10550 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72  set of the outer
10560 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
10570 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  iParent;        
10580 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  /* VDBE cursor n
10590 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75  umber of the pSu
105a0 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d  b result set tem
105b0 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  p table */.  int
105c0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
105d0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
105e0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
105f0 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
10600 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
10610 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
10620 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
10630 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20  tem *pSubitem;  
10640 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
10650 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
10660 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65  to see if flatte
10670 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
10680 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  d.  Return 0 if 
10690 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  not..  */.  if( 
106a0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
106b0 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
106c0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
106d0 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26  c && iFrom>=0 &&
106e0 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72   iFrom<pSrc->nSr
106f0 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20  c );.  pSubitem 
10700 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  = &pSrc->a[iFrom
10710 5d 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62  ];.  pSub = pSub
10720 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  item->pSelect;. 
10730 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30   assert( pSub!=0
10740 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20   );.  if( isAgg 
10750 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67  && subqueryIsAgg
10760 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
10770 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67  f( subqueryIsAgg
10780 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31   && pSrc->nSrc>1
10790 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
107a0 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
107b0 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
107c0 53 75 62 53 72 63 20 29 3b 0a 20 20 69 66 28 20  SubSrc );.  if( 
107d0 28 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26  (pSub->pLimit &&
107e0 20 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 20 70   p->pLimit) || p
107f0 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 7c 7c 20  Sub->pOffset || 
10800 0a 20 20 20 20 20 20 28 70 53 75 62 2d 3e 70 4c  .      (pSub->pL
10810 69 6d 69 74 20 26 26 20 69 73 41 67 67 29 20 29  imit && isAgg) )
10820 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
10830 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d   pSubSrc->nSrc==
10840 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
10850 69 66 28 20 70 53 75 62 2d 3e 69 73 44 69 73 74  if( pSub->isDist
10860 69 6e 63 74 20 26 26 20 28 70 53 72 63 2d 3e 6e  inct && (pSrc->n
10870 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20  Src>1 || isAgg) 
10880 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
10890 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 69  ;.  }.  if( p->i
108a0 73 44 69 73 74 69 6e 63 74 20 26 26 20 73 75 62  sDistinct && sub
108b0 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74  queryIsAgg ) ret
108c0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 2d  urn 0;.  if( (p-
108d0 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79  >disallowOrderBy
108e0 20 7c 7c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29   || p->pOrderBy)
108f0 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
10900 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  By ) return 0;..
10910 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
10920 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71   3:  If the subq
10930 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20  uery is a join, 
10940 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
10950 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20  bquery is .  ** 
10960 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20  not used as the 
10970 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
10980 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20   an outer join. 
10990 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79   Examples of why
109a0 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f   this.  ** is no
109b0 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
109c0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
109d0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
109e0 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a  (t2 JOIN t3).  *
109f0 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
10a00 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
10a10 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
10a20 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
10a30 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
10a40 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20  IN t2) JOIN t3. 
10a50 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69   **.  ** which i
10a60 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65  s not at all the
10a70 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a   same thing..  *
10a80 2f 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d  /.  if( pSubSrc-
10a90 3e 6e 53 72 63 3e 31 20 26 26 20 69 46 72 6f 6d  >nSrc>1 && iFrom
10aa0 3e 30 20 26 26 20 28 70 53 72 63 2d 3e 61 5b 69  >0 && (pSrc->a[i
10ab0 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  From-1].jointype
10ac0 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
10ad0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
10ae0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72  .  }..  /* Restr
10af0 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74  iction 12:  If t
10b00 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74  he subquery is t
10b10 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
10b20 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
10b30 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65  .  ** join, make
10b40 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
10b50 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20  ry has no WHERE 
10b60 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20  clause..  ** An 
10b70 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  examples of why 
10b80 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  this is not allo
10b90 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
10ba0 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
10bb0 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43  UTER JOIN (SELEC
10bc0 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T * FROM t2 WHER
10bd0 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20  E t2.x>0).  **. 
10be0 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
10bf0 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
10c00 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
10c10 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
10c20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
10c30 74 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30  t2) WHERE t2.x>0
10c40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74  .  **.  ** But t
10c50 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77  he t2.x>0 test w
10c60 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20  ill always fail 
10c70 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66  on a NULL row of
10c80 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20   t2, which.  ** 
10c90 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76  effectively conv
10ca0 65 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a  erts the OUTER J
10cb0 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45  OIN into an INNE
10cc0 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69  R JOIN..  */.  i
10cd0 66 28 20 69 46 72 6f 6d 3e 30 20 26 26 20 28 70  f( iFrom>0 && (p
10ce0 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e  Src->a[iFrom-1].
10cf0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
10d00 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20 26  TER)!=0 .      &
10d10 26 20 70 53 75 62 2d 3e 70 57 68 65 72 65 21 3d  & pSub->pWhere!=
10d20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
10d30 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
10d40 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
10d50 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c  int, it means fl
10d60 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
10d70 69 74 74 65 64 20 66 6f 72 20 74 68 65 0a 20 20  itted for the.  
10d80 2a 2a 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72  ** iFrom-th entr
10d90 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
10da0 61 75 73 65 20 69 6e 20 74 68 65 20 6f 75 74 65  ause in the oute
10db0 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20  r query..  */.. 
10dc0 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f 66 20   /* Move all of 
10dd0 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74  the FROM element
10de0 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  s of the subquer
10df0 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  y into the.  ** 
10e00 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
10e10 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
10e20 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e  ry.  Before doin
10e30 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72  g this, remember
10e40 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  .  ** the cursor
10e50 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
10e60 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71  original outer q
10e70 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e  uery FROM elemen
10e80 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e  t in.  ** iParen
10e90 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74 20  t.  The iParent 
10ea0 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65  cursor will neve
10eb0 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62 73  r be used.  Subs
10ec0 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a  equent code.  **
10ed0 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65   will scan expre
10ee0 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66  ssions looking f
10ef0 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72  or iParent refer
10f00 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63  ences and replac
10f10 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66  e.  ** those ref
10f20 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78 70  erences with exp
10f30 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65  ressions that re
10f40 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62  solve to the sub
10f50 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20  query FROM.  ** 
10f60 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20  elements we are 
10f70 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a  now copying in..
10f80 20 20 2a 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d    */.  iParent =
10f90 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73   pSubitem->iCurs
10fa0 6f 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  or;.  {.    int 
10fb0 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72  nSubSrc = pSubSr
10fc0 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e 74  c->nSrc;.    int
10fd0 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62   jointype = pSub
10fe0 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  item->jointype;.
10ff0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
11000 74 65 54 61 62 6c 65 28 30 2c 20 70 53 75 62 69  teTable(0, pSubi
11010 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
11020 73 71 6c 69 74 65 46 72 65 65 28 70 53 75 62 69  sqliteFree(pSubi
11030 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
11040 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
11050 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pSubitem->zName)
11060 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
11070 28 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61  (pSubitem->zAlia
11080 73 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 75 62  s);.    if( nSub
11090 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 69  Src>1 ){.      i
110a0 6e 74 20 65 78 74 72 61 20 3d 20 6e 53 75 62 53  nt extra = nSubS
110b0 72 63 20 2d 20 31 3b 0a 20 20 20 20 20 20 66 6f  rc - 1;.      fo
110c0 72 28 69 3d 31 3b 20 69 3c 6e 53 75 62 53 72 63  r(i=1; i<nSubSrc
110d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
110e0 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
110f0 63 4c 69 73 74 41 70 70 65 6e 64 28 70 53 72 63  cListAppend(pSrc
11100 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
11110 0a 20 20 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  .      p->pSrc =
11120 20 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72   pSrc;.      for
11130 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b  (i=pSrc->nSrc-1;
11140 20 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f 6d 3b   i-extra>=iFrom;
11150 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 70   i--){.        p
11160 53 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53 72 63  Src->a[i] = pSrc
11170 2d 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a 20 20  ->a[i-extra];.  
11180 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
11190 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53  for(i=0; i<nSubS
111a0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
111b0 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
111c0 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d   = pSubSrc->a[i]
111d0 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
111e0 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30  pSubSrc->a[i], 0
111f0 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63  , sizeof(pSubSrc
11200 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a  ->a[i]));.    }.
11210 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f      pSrc->a[iFro
11220 6d 2b 6e 53 75 62 53 72 63 2d 31 5d 2e 6a 6f 69  m+nSubSrc-1].joi
11230 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65  ntype = jointype
11240 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
11250 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69  begin substituti
11260 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75  ng subquery resu
11270 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt set expressio
11280 6e 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72 65 66  ns for .  ** ref
11290 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69  erences to the i
112a0 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75  Parent in the ou
112b0 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2a 20  ter query..  ** 
112c0 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20  .  ** Example:. 
112d0 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c 45 43   **.  **   SELEC
112e0 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d  T a+5, b*10 FROM
112f0 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20   (SELECT x*3 AS 
11300 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f  a, y+10 AS b FRO
11310 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b  M t1) WHERE a>b;
11320 0a 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20  .  **   \       
11330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
11340 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62  ____________ sub
11350 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
11360 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20 2a  /          /.  *
11370 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
11380 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
11390 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
113a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
113b0 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20 20 2a  ______/.  **.  *
113c0 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65  * We look at eve
113d0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
113e0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
113f0 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
11400 20 77 65 20 73 65 65 0a 20 20 2a 2a 20 22 61 22   we see.  ** "a"
11410 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
11420 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70  x*3" and every p
11430 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20  lace we see "b" 
11440 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79  we substitute "y
11450 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 73 75 62  +10"..  */.  sub
11460 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45  stExprList(p->pE
11470 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70  List, iParent, p
11480 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
11490 70 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  pList = p->pELis
114a0 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
114b0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
114c0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
114d0 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  xpr;.    if( pLi
114e0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
114f0 30 20 26 26 20 28 70 45 78 70 72 20 3d 20 70 4c  0 && (pExpr = pL
11500 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
11510 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20  ->span.z!=0 ){. 
11520 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d       pList->a[i]
11530 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  .zName = sqliteS
11540 74 72 4e 44 75 70 28 70 45 78 70 72 2d 3e 73 70  trNDup(pExpr->sp
11550 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61  an.z, pExpr->spa
11560 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n.n);.    }.  }.
11570 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20    if( isAgg ){. 
11580 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
11590 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50  (p->pGroupBy, iP
115a0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
115b0 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
115c0 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  xpr(p->pHaving, 
115d0 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
115e0 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66  EList);.  }.  if
115f0 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
11600 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
11610 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
11620 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
11630 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  y = pSub->pOrder
11640 42 79 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4f  By;.    pSub->pO
11650 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65  rderBy = 0;.  }e
11660 6c 73 65 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  lse if( p->pOrde
11670 72 42 79 20 29 7b 0a 20 20 20 20 73 75 62 73 74  rBy ){.    subst
11680 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64  ExprList(p->pOrd
11690 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70  erBy, iParent, p
116a0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
116b0 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57  }.  if( pSub->pW
116c0 68 65 72 65 20 29 7b 0a 20 20 20 20 70 57 68 65  here ){.    pWhe
116d0 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
116e0 44 75 70 28 70 53 75 62 2d 3e 70 57 68 65 72 65  Dup(pSub->pWhere
116f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11700 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  pWhere = 0;.  }.
11710 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
11720 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Agg ){.    asser
11730 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30  t( p->pHaving==0
11740 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69   );.    p->pHavi
11750 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  ng = p->pWhere;.
11760 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
11770 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75 62 73  pWhere;.    subs
11780 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  tExpr(p->pHaving
11790 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
117a0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d  >pEList);.    p-
117b0 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
117c0 65 33 45 78 70 72 41 6e 64 28 70 2d 3e 70 48 61  e3ExprAnd(p->pHa
117d0 76 69 6e 67 2c 20 73 71 6c 69 74 65 33 45 78 70  ving, sqlite3Exp
117e0 72 44 75 70 28 70 53 75 62 2d 3e 70 48 61 76 69  rDup(pSub->pHavi
117f0 6e 67 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ng));.    assert
11800 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
11810 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75   );.    p->pGrou
11820 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
11830 72 4c 69 73 74 44 75 70 28 70 53 75 62 2d 3e 70  rListDup(pSub->p
11840 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d 65 6c 73  GroupBy);.  }els
11850 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  e{.    substExpr
11860 28 70 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72  (p->pWhere, iPar
11870 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
11880 74 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72  t);.    p->pWher
11890 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
118a0 6e 64 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 57  nd(p->pWhere, pW
118b0 68 65 72 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  here);.  }..  /*
118c0 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
118d0 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
118e0 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
118f0 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 2a 2a  nner or the.  **
11900 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
11910 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a  distinct. .  */.
11920 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20    p->isDistinct 
11930 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  = p->isDistinct 
11940 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69  || pSub->isDisti
11950 6e 63 74 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  nct;..  /*.  ** 
11960 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
11970 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49  (SELECT ... LIMI
11980 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49  T a OFFSET b) LI
11990 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a  MIT x OFFSET y;.
119a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
119b0 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70  >pLimit ){.    p
119c0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->pLimit = pSub-
119d0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 53 75  >pLimit;.    pSu
119e0 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  b->pLimit = 0;. 
119f0 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c   }..  /* Finiall
11a00 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69  y, delete what i
11a10 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75  s left of the su
11a20 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72  bquery and retur
11a30 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a  n.  ** success..
11a40 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65    */.  sqlite3Se
11a50 6c 65 63 74 44 65 6c 65 74 65 28 70 53 75 62 29  lectDelete(pSub)
11a60 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
11a70 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11a80 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f  _OMIT_VIEW */../
11a90 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
11aa0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
11ab0 74 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 61  t passed in as a
11ac0 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65  n argument to se
11ad0 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20  e if it.** is a 
11ae0 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20  simple min() or 
11af0 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 49 66  max() query.  If
11b00 20 69 74 20 69 73 20 61 6e 64 20 74 68 69 73 20   it is and this 
11b10 71 75 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a 20  query can be.** 
11b20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20  satisfied using 
11b30 61 20 73 69 6e 67 6c 65 20 73 65 65 6b 20 74 6f  a single seek to
11b40 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
11b50 72 20 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64 65  r end of an inde
11b60 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72  x,.** then gener
11b70 61 74 65 20 74 68 65 20 63 6f 64 65 20 66 6f 72  ate the code for
11b80 20 74 68 69 73 20 53 45 4c 45 43 54 20 61 6e 64   this SELECT and
11b90 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66 20 74   return 1.  If t
11ba0 68 69 73 20 69 73 20 6e 6f 74 20 61 20 0a 2a 2a  his is not a .**
11bb0 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72   simple min() or
11bc0 20 6d 61 78 28 29 20 71 75 65 72 79 2c 20 74 68   max() query, th
11bd0 65 6e 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a  en return 0;.**.
11be0 2a 2a 20 41 20 73 69 6d 70 6c 79 20 6d 69 6e 28  ** A simply min(
11bf0 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
11c00 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73   looks like this
11c10 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
11c20 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20 74 61  T min(a) FROM ta
11c30 62 6c 65 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ble;.**    SELEC
11c40 54 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 61  T max(a) FROM ta
11c50 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71  ble;.**.** The q
11c60 75 65 72 79 20 6d 61 79 20 68 61 76 65 20 6f 6e  uery may have on
11c70 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
11c80 65 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 61 72  e in its FROM ar
11c90 67 75 6d 65 6e 74 2e 20 20 54 68 65 72 65 0a 2a  gument.  There.*
11ca0 2a 20 63 61 6e 20 62 65 20 6e 6f 20 47 52 4f 55  * can be no GROU
11cb0 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20 6f  P BY or HAVING o
11cc0 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  r WHERE clauses.
11cd0 20 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74    The result set
11ce0 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20   must.** be the 
11cf0 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 6f  min() or max() o
11d00 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  f a single colum
11d10 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  n of the table. 
11d20 20 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69   The column.** i
11d30 6e 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d  n the min() or m
11d40 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ax() function mu
11d50 73 74 20 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a  st be indexed..*
11d60 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74  *.** The paramet
11d70 65 72 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ers to this rout
11d80 69 6e 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ine are the same
11d90 20 61 73 20 66 6f 72 20 73 71 6c 69 74 65 33 53   as for sqlite3S
11da0 65 6c 65 63 74 28 29 2e 0a 2a 2a 20 53 65 65 20  elect()..** See 
11db0 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
11dc0 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69  nt on that routi
11dd0 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ne for additiona
11de0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
11df0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 6d  /.static int sim
11e00 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 50  pleMinMaxQuery(P
11e10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
11e20 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 65 44 65  lect *p, int eDe
11e30 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a  st, int iParm){.
11e40 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20    Expr *pExpr;. 
11e50 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 54 61 62   int iCol;.  Tab
11e60 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
11e70 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 62  x *pIdx;.  int b
11e80 61 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ase;.  Vdbe *v;.
11e90 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a 20 20    int seekOp;.  
11ea0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
11eb0 2c 20 2a 70 4c 69 73 74 2c 20 65 4c 69 73 74 3b  , *pList, eList;
11ec0 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
11ed0 73 74 5f 69 74 65 6d 20 65 4c 69 73 74 49 74 65  st_item eListIte
11ee0 6d 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  m;.  SrcList *pS
11ef0 72 63 3b 0a 20 20 69 6e 74 20 62 72 6b 3b 0a 0a  rc;.  int brk;..
11f00 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
11f10 65 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20  e if this query 
11f20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28  is a simple min(
11f30 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
11f40 2e 20 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a  .  Return.  ** z
11f50 65 72 6f 20 69 66 20 69 74 20 69 73 20 20 6e 6f  ero if it is  no
11f60 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
11f70 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e  >pGroupBy || p->
11f80 70 48 61 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57  pHaving || p->pW
11f90 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
11fa0 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
11fb0 63 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  c;.  if( pSrc->n
11fc0 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
11fd0 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  0;.  pEList = p-
11fe0 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
11ff0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
12000 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45  ) return 0;.  pE
12010 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  xpr = pEList->a[
12020 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  0].pExpr;.  if( 
12030 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
12040 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74  G_FUNCTION ) ret
12050 75 72 6e 20 30 3b 0a 20 20 70 4c 69 73 74 20 3d  urn 0;.  pList =
12060 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
12070 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c   if( pList==0 ||
12080 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31   pList->nExpr!=1
12090 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
120a0 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  f( pExpr->token.
120b0 6e 21 3d 33 20 29 20 72 65 74 75 72 6e 20 30 3b  n!=3 ) return 0;
120c0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
120d0 72 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f  rNICmp(pExpr->to
120e0 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d  ken.z,"min",3)==
120f0 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20  0 ){.    seekOp 
12100 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d  = OP_Rewind;.  }
12110 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
12120 53 74 72 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e  StrNICmp(pExpr->
12130 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29  token.z,"max",3)
12140 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f  ==0 ){.    seekO
12150 70 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d  p = OP_Last;.  }
12160 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
12170 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72 20   0;.  }.  pExpr 
12180 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  = pList->a[0].pE
12190 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72  xpr;.  if( pExpr
121a0 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
121b0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43  ) return 0;.  iC
121c0 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ol = pExpr->iCol
121d0 75 6d 6e 3b 0a 20 20 70 54 61 62 20 3d 20 70 53  umn;.  pTab = pS
121e0 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a  rc->a[0].pTab;..
121f0 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
12200 6f 20 68 65 72 65 2c 20 69 74 20 6d 65 61 6e 73  o here, it means
12210 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66   the query is of
12220 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 6f 72   the correct for
12230 6d 2e 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  m..  ** Check to
12240 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   make sure we ha
12250 76 65 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20  ve an index and 
12260 6d 61 6b 65 20 70 49 64 78 20 70 6f 69 6e 74 20  make pIdx point 
12270 74 6f 20 74 68 65 0a 20 20 2a 2a 20 61 70 70 72  to the.  ** appr
12280 6f 70 72 69 61 74 65 20 69 6e 64 65 78 2e 20 20  opriate index.  
12290 49 66 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20  If the min() or 
122a0 6d 61 78 28 29 20 69 73 20 6f 6e 20 61 6e 20 49  max() is on an I
122b0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 0a 20  NTEGER PRIMARY. 
122c0 20 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20   ** key column, 
122d0 6e 6f 20 69 6e 64 65 78 20 69 73 20 6e 65 63 65  no index is nece
122e0 73 73 61 72 79 20 73 6f 20 73 65 74 20 70 49 64  ssary so set pId
122f0 78 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e  x to NULL.  If n
12300 6f 0a 20 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e  o.  ** usable in
12310 64 65 78 20 69 73 20 66 6f 75 6e 64 2c 20 72 65  dex is found, re
12320 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69  turn 0..  */.  i
12330 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
12340 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c   pIdx = 0;.  }el
12350 73 65 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  se{.    CollSeq 
12360 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
12370 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
12380 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  se, pExpr);.    
12390 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
123a0 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
123b0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
123c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
123d0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29  dx->nColumn>=1 )
123e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
123f0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69  ->aiColumn[0]==i
12400 43 6f 6c 20 26 26 20 70 49 64 78 2d 3e 6b 65 79  Col && pIdx->key
12410 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 3d 3d 70  Info.aColl[0]==p
12420 43 6f 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20  Coll ) break;.  
12430 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78    }.    if( pIdx
12440 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
12450 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69    }..  /* Identi
12460 66 79 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20  fy column types 
12470 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  if we will be us
12480 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  ing the callback
12490 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65  .  This.  ** ste
124a0 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  p is skipped if 
124b0 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f  the output is go
124c0 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 6f  ing to a table o
124d0 72 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  r a memory cell.
124e0 0a 20 20 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  .  ** The column
124f0 20 6e 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65   names have alre
12500 61 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74  ady been generat
12510 65 64 20 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e  ed in the callin
12520 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  g function..  */
12530 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
12540 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
12550 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
12560 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  rn 0;..  /* If t
12570 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73  he output is des
12580 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70  tined for a temp
12590 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65  orary table, ope
125a0 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20  n that table..  
125b0 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
125c0 53 52 54 5f 56 69 72 74 75 61 6c 54 61 62 20 29  SRT_VirtualTab )
125d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
125e0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
125f0 6e 56 69 72 74 75 61 6c 2c 20 69 50 61 72 6d 2c  nVirtual, iParm,
12600 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47   1);.  }..  /* G
12610 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74  enerating code t
12620 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 20 6f  o find the min o
12630 72 20 74 68 65 20 6d 61 78 2e 20 20 42 61 73 69  r the max.  Basi
12640 63 61 6c 6c 79 20 61 6c 6c 20 77 65 20 68 61 76  cally all we hav
12650 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
12660 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 6f  find the first o
12670 72 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  r the last entry
12680 20 69 6e 20 74 68 65 20 63 68 6f 73 65 6e 20 69   in the chosen i
12690 6e 64 65 78 2e 20 20 49 66 0a 20 20 2a 2a 20 74  ndex.  If.  ** t
126a0 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  he min() or max(
126b0 29 20 69 73 20 6f 6e 20 74 68 65 20 49 4e 54 45  ) is on the INTE
126c0 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
126d0 20 74 68 65 6e 20 66 69 6e 64 20 74 68 65 20 66   then find the f
126e0 69 72 73 74 0a 20 20 2a 2a 20 6f 72 20 6c 61 73  irst.  ** or las
126f0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6d  t entry in the m
12700 61 69 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ain table..  */.
12710 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
12720 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
12730 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20  , pTab->iDb);.  
12740 62 61 73 65 20 3d 20 70 53 72 63 2d 3e 61 5b 30  base = pSrc->a[0
12750 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 62 72 6b  ].iCursor;.  brk
12760 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
12770 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f  keLabel(v);.  co
12780 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
12790 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 62  ers(pParse, p, b
127a0 72 6b 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d  rk);.  if( pSrc-
127b0 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3d 3d 30  >a[0].pSelect==0
127c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
127d0 70 65 6e 54 61 62 6c 65 46 6f 72 52 65 61 64 69  penTableForReadi
127e0 6e 67 28 76 2c 20 62 61 73 65 2c 20 70 54 61 62  ng(v, base, pTab
127f0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64  );.  }.  if( pId
12800 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x==0 ){.    sqli
12810 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12820 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29  seekOp, base, 0)
12830 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
12840 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68  * Even though th
12850 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f  e cursor used to
12860 20 6f 70 65 6e 20 74 68 65 20 69 6e 64 65 78 20   open the index 
12870 68 65 72 65 20 69 73 20 63 6c 6f 73 65 64 0a 20  here is closed. 
12880 20 20 20 2a 2a 20 61 73 20 73 6f 6f 6e 20 61 73     ** as soon as
12890 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 20   a single value 
128a0 68 61 73 20 62 65 65 6e 20 72 65 61 64 20 66 72  has been read fr
128b0 6f 6d 20 69 74 2c 20 61 6c 6c 6f 63 61 74 65 20  om it, allocate 
128c0 69 74 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20  it.    ** using 
128d0 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 29  (pParse->nTab++)
128e0 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
128f0 63 75 72 73 6f 72 20 69 64 20 66 72 6f 6d 20 62  cursor id from b
12900 65 69 6e 67 20 0a 20 20 20 20 2a 2a 20 72 65 75  eing .    ** reu
12910 73 65 64 2e 20 54 68 69 73 20 69 73 20 69 6d 70  sed. This is imp
12920 6f 72 74 61 6e 74 20 66 6f 72 20 73 74 61 74 65  ortant for state
12930 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72  ments of the for
12940 6d 20 0a 20 20 20 20 2a 2a 20 22 49 4e 53 45 52  m .    ** "INSER
12950 54 20 49 4e 54 4f 20 78 20 53 45 4c 45 43 54 20  T INTO x SELECT 
12960 6d 61 78 28 29 20 46 52 4f 4d 20 78 22 2e 0a 20  max() FROM x".. 
12970 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49     */.    int iI
12980 64 78 3b 0a 20 20 20 20 69 49 64 78 20 3d 20 70  dx;.    iIdx = p
12990 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
129a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
129b0 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
129c0 72 2c 20 70 49 64 78 2d 3e 69 44 62 2c 20 30 29  r, pIdx->iDb, 0)
129d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
129e0 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  eOp3(v, OP_OpenR
129f0 65 61 64 2c 20 69 49 64 78 2c 20 70 49 64 78 2d  ead, iIdx, pIdx-
12a00 3e 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20  >tnum,.         
12a10 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
12a20 29 26 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2c  )&pIdx->keyInfo,
12a30 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P3_KEYINFO);.  
12a40 20 20 69 66 28 20 73 65 65 6b 4f 70 3d 3d 4f 50    if( seekOp==OP
12a50 5f 52 65 77 69 6e 64 20 29 7b 0a 20 20 20 20 20  _Rewind ){.     
12a60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12a70 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  p(v, OP_Null, 0,
12a80 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
12a90 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
12aa0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c  P_MakeRecord, 1,
12ab0 20 30 29 3b 0a 20 20 20 20 20 20 73 65 65 6b 4f   0);.      seekO
12ac0 70 20 3d 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20  p = OP_MoveGt;. 
12ad0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
12ae0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65  VdbeAddOp(v, see
12af0 6b 4f 70 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20  kOp, iIdx, 0);. 
12b00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12b10 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  dOp(v, OP_IdxRow
12b20 69 64 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20  id, iIdx, 0);.  
12b30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12b40 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
12b50 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 73 71  iIdx, 0);.    sq
12b60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
12b70 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 62 61 73  , OP_MoveGe, bas
12b80 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 65 4c 69  e, 0);.  }.  eLi
12b90 73 74 2e 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20  st.nExpr = 1;.  
12ba0 6d 65 6d 73 65 74 28 26 65 4c 69 73 74 49 74 65  memset(&eListIte
12bb0 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 65 4c 69  m, 0, sizeof(eLi
12bc0 73 74 49 74 65 6d 29 29 3b 0a 20 20 65 4c 69 73  stItem));.  eLis
12bd0 74 2e 61 20 3d 20 26 65 4c 69 73 74 49 74 65 6d  t.a = &eListItem
12be0 3b 0a 20 20 65 4c 69 73 74 2e 61 5b 30 5d 2e 70  ;.  eList.a[0].p
12bf0 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
12c00 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
12c10 70 50 61 72 73 65 2c 20 70 2c 20 26 65 4c 69 73  pParse, p, &eLis
12c20 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20  t, 0, 0, 0, -1, 
12c30 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 62 72  eDest, iParm, br
12c40 6b 2c 20 62 72 6b 2c 20 30 29 3b 0a 20 20 73 71  k, brk, 0);.  sq
12c50 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
12c60 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 20  Label(v, brk);. 
12c70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12c80 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62  p(v, OP_Close, b
12c90 61 73 65 2c 20 30 29 3b 0a 20 20 0a 20 20 72 65  ase, 0);.  .  re
12ca0 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
12cb0 20 41 6e 61 6c 79 7a 65 20 61 6e 64 20 4f 52 44   Analyze and ORD
12cc0 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
12cd0 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20 53 45  Y clause in a SE
12ce0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
12cf0 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e   Return.** the n
12d00 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
12d10 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 4f  seen..**.** An O
12d20 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
12d30 20 42 59 20 69 73 20 61 20 6c 69 73 74 20 6f 66   BY is a list of
12d40 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 49   expressions.  I
12d50 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
12d60 0a 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65  .** is an intege
12d70 72 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e  r constant, then
12d80 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
12d90 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20   is replaced by 
12da0 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
12db0 64 69 6e 67 20 65 6e 74 72 79 20 69 6e 20 74 68  ding entry in th
12dc0 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f  e result set..*/
12dd0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63  .static int proc
12de0 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28  essOrderGroupBy(
12df0 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
12e00 70 4e 43 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65  pNC,     /* Name
12e10 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20   context of the 
12e20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12e30 2e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  . */.  ExprList 
12e40 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
12e50 54 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20  The ORDER BY or 
12e60 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
12e70 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65 64 20  to be processed 
12e80 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
12e90 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a 20 45 69  *zType     /* Ei
12ea0 74 68 65 72 20 22 4f 52 44 45 52 22 20 6f 72 20  ther "ORDER" or 
12eb0 22 47 52 4f 55 50 22 2c 20 61 73 20 61 70 70 72  "GROUP", as appr
12ec0 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b 0a 20 20  opriate */.){.  
12ed0 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73  int i;.  ExprLis
12ee0 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 4e 43 2d  t *pEList = pNC-
12ef0 3e 70 45 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  >pEList;     /* 
12f00 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  The result set o
12f10 66 20 74 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a  f the SELECT */.
12f20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
12f30 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 20 20  = pNC->pParse;  
12f40 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
12f50 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
12f60 43 54 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  CT */.  assert( 
12f70 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 69 66 28  pEList );..  if(
12f80 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72   pOrderBy==0 ) r
12f90 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69  eturn 0;.  for(i
12fa0 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
12fb0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
12fc0 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 45   int iCol;.    E
12fd0 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72  xpr *pE = pOrder
12fe0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
12ff0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
13000 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
13010 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20   &iCol) ){.     
13020 20 69 66 28 20 69 43 6f 6c 3e 30 20 26 26 20 69   if( iCol>0 && i
13030 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45 78  Col<=pEList->nEx
13040 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
13050 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
13060 70 45 29 3b 0a 20 20 20 20 20 20 20 20 70 45 20  pE);.        pE 
13070 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
13080 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
13090 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e  ExprDup(pEList->
130a0 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29  a[iCol-1].pExpr)
130b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
130c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
130d0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
130e0 20 20 20 20 20 20 20 20 20 20 20 22 25 73 20 42             "%s B
130f0 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  Y column number 
13100 25 64 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  %d out of range 
13110 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20  - should be ".  
13120 20 20 20 20 20 20 20 20 20 22 62 65 74 77 65 65           "betwee
13130 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 7a 54 79  n 1 and %d", zTy
13140 70 65 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74  pe, iCol, pEList
13150 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
13160 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
13170 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
13180 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
13190 6f 6c 76 65 4e 61 6d 65 73 28 70 4e 43 2c 20 70  olveNames(pNC, p
131a0 45 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  E) ){.      retu
131b0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
131c0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
131d0 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20 29 7b  sConstant(pE) ){
131e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
131f0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
13200 20 20 20 20 20 20 20 20 20 22 25 73 20 42 59 20           "%s BY 
13210 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62  terms must not b
13220 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f  e non-integer co
13230 6e 73 74 61 6e 74 73 22 2c 20 7a 54 79 70 65 29  nstants", zType)
13240 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
13250 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
13260 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
13270 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
13280 73 6f 6c 76 65 73 20 61 6e 79 20 6e 61 6d 65 73  solves any names
13290 20 75 73 65 64 20 69 6e 20 74 68 65 20 72 65 73   used in the res
132a0 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 0a 2a  ult set of the.*
132b0 2a 20 73 75 70 70 6c 69 65 64 20 53 45 4c 45 43  * supplied SELEC
132c0 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20  T statement. If 
132d0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
132e0 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 73 6f 6c  ment being resol
132f0 76 65 64 0a 2a 2a 20 69 73 20 61 20 73 75 62 2d  ved.** is a sub-
13300 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 70 4f 75  select, then pOu
13310 74 65 72 4e 43 20 69 73 20 61 20 70 6f 69 6e 74  terNC is a point
13320 65 72 20 74 6f 20 74 68 65 20 4e 61 6d 65 43 6f  er to the NameCo
13330 6e 74 65 78 74 20 0a 2a 2a 20 6f 66 20 74 68 65  ntext .** of the
13340 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54 2e 0a   parent SELECT..
13350 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
13360 6c 65 63 74 52 65 73 6f 6c 76 65 28 0a 20 20 50  lectResolve(.  P
13370 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
13380 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
13390 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
133a0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
133b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
133c0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
133d0 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
133e0 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
133f0 4f 75 74 65 72 4e 43 20 20 2f 2a 20 54 68 65 20  OuterNC  /* The 
13400 6f 75 74 65 72 20 6e 61 6d 65 20 63 6f 6e 74 65  outer name conte
13410 78 74 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e  xt. May be NULL.
13420 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73   */.){.  ExprLis
13430 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
13440 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 73 65      /* Result se
13450 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  t. */.  int i;  
13460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13470 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f 6f 70 20 76     /* For-loop v
13480 61 72 69 61 62 6c 65 20 75 73 65 64 20 69 6e 20  ariable used in 
13490 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 20  multiple places 
134a0 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
134b0 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20   sNC;           
134c0 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f  /* Local name-co
134d0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
134e0 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
134f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 67 72 6f        /* The gro
13500 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  up by clause */.
13510 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 72 6f  .  /* If this ro
13520 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20 62 65  utine has run be
13530 66 6f 72 65 2c 20 72 65 74 75 72 6e 20 69 6d 6d  fore, return imm
13540 65 64 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 69  ediately. */.  i
13550 66 28 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64  f( p->isResolved
13560 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
13570 21 70 4f 75 74 65 72 4e 43 20 29 3b 0a 20 20 20  !pOuterNC );.   
13580 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13590 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 73 52 65  K;.  }.  p->isRe
135a0 73 6f 6c 76 65 64 20 3d 20 31 3b 0a 0a 20 20 2f  solved = 1;..  /
135b0 2a 20 49 66 20 74 68 65 72 65 20 68 61 76 65 20  * If there have 
135c0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65 72 72  already been err
135d0 6f 72 73 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  ors, do nothing.
135e0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
135f0 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20  ->nErr>0 ){.    
13600 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
13610 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  ROR;.  }..  /* P
13620 72 65 70 61 72 65 20 74 68 65 20 73 65 6c 65 63  repare the selec
13630 74 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  t statement. Thi
13640 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f  s call will allo
13650 63 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  cate all cursors
13660 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 74  .  ** required t
13670 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 74 61 62  o handle the tab
13680 6c 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  les and subqueri
13690 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
136a0 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  lause..  */.  if
136b0 28 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74  ( prepSelectStmt
136c0 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
136d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
136e0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
136f0 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 65 78  * Resolve the ex
13700 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
13710 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
13720 54 20 63 6c 61 75 73 65 73 2e 20 54 68 65 73 65  T clauses. These
13730 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 61 6c  .  ** are not al
13740 6c 6f 77 65 64 20 74 6f 20 72 65 66 65 72 20 74  lowed to refer t
13750 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73 6f 20  o any names, so 
13760 70 61 73 73 20 61 6e 20 65 6d 70 74 79 20 4e 61  pass an empty Na
13770 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a  meContext..  */.
13780 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
13790 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
137a0 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
137b0 50 61 72 73 65 3b 0a 20 20 69 66 28 20 73 71 6c  Parse;.  if( sql
137c0 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
137d0 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4c  ames(&sNC, p->pL
137e0 69 6d 69 74 29 20 7c 7c 0a 20 20 20 20 20 20 73  imit) ||.      s
137f0 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
13800 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
13810 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20  pOffset) ){.    
13820 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
13830 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ROR;.  }..  /* S
13840 65 74 20 75 70 20 74 68 65 20 6c 6f 63 61 6c 20  et up the local 
13850 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20  name-context to 
13860 70 61 73 73 20 74 6f 20 45 78 70 72 52 65 73 6f  pass to ExprReso
13870 6c 76 65 4e 61 6d 65 73 28 29 20 74 6f 0a 20 20  lveNames() to.  
13880 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68 65 20 65  ** resolve the e
13890 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 2e 0a  xpression-list..
138a0 20 20 2a 2f 0a 20 20 73 4e 43 2e 61 6c 6c 6f 77    */.  sNC.allow
138b0 41 67 67 20 3d 20 31 3b 0a 20 20 73 4e 43 2e 70  Agg = 1;.  sNC.p
138c0 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  SrcList = p->pSr
138d0 63 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d  c;.  sNC.pNext =
138e0 20 70 4f 75 74 65 72 4e 43 3b 0a 0a 20 20 2f 2a   pOuterNC;..  /*
138f0 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69   Resolve names i
13900 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
13910 2e 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20  . */.  pEList = 
13920 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
13930 20 21 70 45 4c 69 73 74 20 29 20 72 65 74 75 72   !pEList ) retur
13940 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
13950 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
13960 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
13970 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d  {.    Expr *pX =
13980 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
13990 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  xpr;.    if( sql
139a0 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
139b0 61 6d 65 73 28 26 73 4e 43 2c 20 70 58 29 20 29  ames(&sNC, pX) )
139c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
139d0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
139e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
139f0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 67 67  there are no agg
13a00 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
13a10 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2d 73   in the result-s
13a20 65 74 2c 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50  et, and no GROUP
13a30 20 42 59 20 0a 20 20 2a 2a 20 65 78 70 72 65 73   BY .  ** expres
13a40 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c  sion, do not all
13a50 6f 77 20 61 67 67 72 65 67 61 74 65 73 20 69 6e  ow aggregates in
13a60 20 61 6e 79 20 6f 66 20 74 68 65 20 6f 74 68 65   any of the othe
13a70 72 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20  r expressions.. 
13a80 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
13a90 2d 3e 69 73 41 67 67 20 29 3b 0a 20 20 70 47 72  ->isAgg );.  pGr
13aa0 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
13ab0 70 42 79 3b 0a 20 20 69 66 28 20 70 47 72 6f 75  pBy;.  if( pGrou
13ac0 70 42 79 20 7c 7c 20 73 4e 43 2e 68 61 73 41 67  pBy || sNC.hasAg
13ad0 67 20 29 7b 0a 20 20 20 20 70 2d 3e 69 73 41 67  g ){.    p->isAg
13ae0 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 1;.  }else{.
13af0 20 20 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67      sNC.allowAgg
13b00 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
13b10 49 66 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75  If a HAVING clau
13b20 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74  se is present, t
13b30 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
13b40 65 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  e a GROUP BY cla
13b50 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  use..  */.  if( 
13b60 70 2d 3e 70 48 61 76 69 6e 67 20 26 26 20 21 70  p->pHaving && !p
13b70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73  GroupBy ){.    s
13b80 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13b90 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55 50 20  Parse, "a GROUP 
13ba0 42 59 20 63 6c 61 75 73 65 20 69 73 20 72 65 71  BY clause is req
13bb0 75 69 72 65 64 20 62 65 66 6f 72 65 20 48 41 56  uired before HAV
13bc0 49 4e 47 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ING");.    retur
13bd0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
13be0 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68    }..  /* Add th
13bf0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
13c00 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 2d 63 6f  t to the name-co
13c10 6e 74 65 78 74 20 62 65 66 6f 72 65 20 70 61 72  ntext before par
13c20 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6f 74  sing the.  ** ot
13c30 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20  her expressions 
13c40 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  in the SELECT st
13c50 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  atement. This is
13c60 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20 65 78   so that.  ** ex
13c70 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
13c80 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 28 65   WHERE clause (e
13c90 74 63 2e 29 20 63 61 6e 20 72 65 66 65 72 20 74  tc.) can refer t
13ca0 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79  o expressions by
13cb0 0a 20 20 2a 2a 20 61 6c 69 61 73 65 73 20 69 6e  .  ** aliases in
13cc0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
13cd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 69 6e 6f 72  .  **.  ** Minor
13ce0 20 70 6f 69 6e 74 3a 20 49 66 20 74 68 69 73 20   point: If this 
13cf0 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
13d00 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
13d10 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 72 65   will be.  ** re
13d20 2d 65 76 61 6c 75 61 74 65 64 20 66 6f 72 20 65  -evaluated for e
13d30 61 63 68 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ach reference to
13d40 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e   it..  */.  sNC.
13d50 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
13d60 73 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  st;.  if( sqlite
13d70 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
13d80 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57 68 65 72  s(&sNC, p->pWher
13d90 65 29 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69  e) ||.      sqli
13da0 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
13db0 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 48 61  mes(&sNC, p->pHa
13dc0 76 69 6e 67 29 20 7c 7c 0a 20 20 20 20 20 20 70  ving) ||.      p
13dd0 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70  rocessOrderGroup
13de0 42 79 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 72 64  By(&sNC, p->pOrd
13df0 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 20 7c  erBy, "ORDER") |
13e00 7c 0a 20 20 20 20 20 20 70 72 6f 63 65 73 73 4f  |.      processO
13e10 72 64 65 72 47 72 6f 75 70 42 79 28 26 73 4e 43  rderGroupBy(&sNC
13e20 2c 20 70 47 72 6f 75 70 42 79 2c 20 22 47 52 4f  , pGroupBy, "GRO
13e30 55 50 22 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  UP").  ){.    re
13e40 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
13e50 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  R;.  }..  /* Mak
13e60 65 20 73 75 72 65 20 74 68 65 20 47 52 4f 55 50  e sure the GROUP
13e70 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20   BY clause does 
13e80 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67 67 72  not contain aggr
13e90 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e  egate functions.
13ea0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 47 72 6f  .  */.  if( pGro
13eb0 75 70 42 79 20 29 7b 0a 20 20 20 20 73 74 72 75  upBy ){.    stru
13ec0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
13ed0 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 20 20   *pItem;.  .    
13ee0 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
13ef0 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3c 70 47  GroupBy->a; i<pG
13f00 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
13f10 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
13f20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
13f30 72 6f 70 65 72 74 79 28 70 49 74 65 6d 2d 3e 70  roperty(pItem->p
13f40 45 78 70 72 2c 20 45 50 5f 41 67 67 29 20 29 7b  Expr, EP_Agg) ){
13f50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13f60 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13f70 20 22 61 67 67 72 65 67 61 74 65 20 66 75 6e 63   "aggregate func
13f80 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61 6c  tions are not al
13f90 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20 20 20 20  lowed in ".     
13fa0 20 20 20 20 20 20 20 22 74 68 65 20 47 52 4f 55         "the GROU
13fb0 50 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a 20  P BY clause");. 
13fc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
13fd0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
13fe0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
13ff0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14000 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65  K;.}../*.** Rese
14010 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  t the aggregate 
14020 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a  accumulator..**.
14030 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65  ** The aggregate
14040 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20   accumulator is 
14050 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20  a set of memory 
14060 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a  cells that hold.
14070 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
14080 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61  results while ca
14090 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67  lculating an agg
140a0 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a  regate.  This.**
140b0 20 72 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79 20   routine simply 
140c0 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20  stores NULLs in 
140d0 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d  all of those mem
140e0 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74  ory cells..*/.st
140f0 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41  atic void resetA
14100 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
14110 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
14120 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
14130 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
14140 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
14150 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
14160 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a  fo_func *pFunc;.
14170 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
14180 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e  nFunc+pAggInfo->
14190 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20  nColumn==0 ){.  
141a0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
141b0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
141c0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  nfo->nColumn; i+
141d0 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
141e0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
141f0 65 6d 4e 75 6c 6c 2c 20 70 41 67 67 49 6e 66 6f  emNull, pAggInfo
14200 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 2c 20  ->aCol[i].iMem, 
14210 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46  0);.  }.  for(pF
14220 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46  unc=pAggInfo->aF
14230 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67  unc, i=0; i<pAgg
14240 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
14250 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20  , pFunc++){.    
14260 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14270 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c 20  (v, OP_MemNull, 
14280 70 46 75 6e 63 2d 3e 69 4d 65 6d 2c 20 30 29 3b  pFunc->iMem, 0);
14290 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
142a0 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
142b0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
142c0 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
142d0 20 20 20 20 20 69 66 28 20 70 45 2d 3e 70 4c 69       if( pE->pLi
142e0 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 4c 69  st==0 || pE->pLi
142f0 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  st->nExpr!=1 ){.
14300 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
14310 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
14320 22 44 49 53 54 49 4e 43 54 20 69 6e 20 61 67 67  "DISTINCT in agg
14330 72 65 67 61 74 65 20 6d 75 73 74 20 62 65 20 66  regate must be f
14340 6f 6c 6c 6f 77 65 64 20 22 0a 20 20 20 20 20 20  ollowed ".      
14350 20 20 20 20 20 22 62 79 20 61 6e 20 65 78 70 72       "by an expr
14360 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20  ession");.      
14370 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e    pFunc->iDistin
14380 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  ct = -1;.      }
14390 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65  else{.        Ke
143a0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
143b0 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
143c0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
143d0 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
143e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
143f0 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75  (v, OP_OpenVirtu
14400 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  al, pFunc->iDist
14410 69 6e 63 74 2c 20 30 2c 20 0a 20 20 20 20 20 20  inct, 0, .      
14420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14430 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
14440 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f  nfo, P3_KEYINFO_
14450 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
14460 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
14470 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
14480 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f  OP_AggFinalize o
14490 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  pcode for every 
144a0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
144b0 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67  on.** in the Agg
144c0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  Info structure..
144d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
144e0 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
144f0 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ons(Parse *pPars
14500 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
14510 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
14520 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
14530 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
14540 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
14550 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   *pF;.  for(i=0,
14560 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
14570 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
14580 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
14590 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  +){.    ExprList
145a0 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
145b0 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
145c0 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
145d0 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70  , OP_AggFinal, p
145e0 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f  F->iMem, pList ?
145f0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
14600 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
14610 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
14620 70 46 2d 3e 70 46 75 6e 63 2c 20 50 33 5f 46 55  pF->pFunc, P3_FU
14630 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  NCDEF);.  }.}../
14640 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20  *.** Update the 
14650 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f  accumulator memo
14660 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20  ry cells for an 
14670 61 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20  aggregate based 
14680 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  on.** the curren
14690 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
146a0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
146b0 64 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61  d updateAccumula
146c0 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
146d0 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
146e0 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
146f0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
14700 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
14710 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
14720 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41   *pF;.  struct A
14730 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a  ggInfo_col *pC;.
14740 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
14750 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66  ectMode = 1;.  f
14760 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
14770 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
14780 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
14790 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69  ++, pF++){.    i
147a0 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74  nt nArg;.    int
147b0 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20   addrNext = 0;. 
147c0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
147d0 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
147e0 70 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70  pList;.    if( p
147f0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41  List ){.      nA
14800 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  rg = pList->nExp
14810 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
14820 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
14830 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 29 3b  (pParse, pList);
14840 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14850 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20    nArg = 0;.    
14860 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44  }.    if( pF->iD
14870 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
14880 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73      addrNext = s
14890 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
148a0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73  bel(v);.      as
148b0 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b  sert( nArg==1 );
148c0 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69  .      codeDisti
148d0 6e 63 74 28 76 2c 20 70 46 2d 3e 69 44 69 73 74  nct(v, pF->iDist
148e0 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20  inct, addrNext, 
148f0 31 2c 20 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 2);.    }.   
14900 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e   if( pF->pFunc->
14910 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20  needCollSeq ){. 
14920 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
14930 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  oll = 0;.      s
14940 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
14950 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
14960 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
14970 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(j=0, pItem=pL
14980 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26  ist->a; !pColl &
14990 26 20 6a 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  & j<pList->nExpr
149a0 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
149b0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
149c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
149d0 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
149e0 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
149f0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43   }.      if( !pC
14a00 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  oll ){.        p
14a10 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
14a20 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
14a30 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
14a40 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
14a50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20  _CollSeq, 0, 0, 
14a60 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
14a70 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  3_COLLSEQ);.    
14a80 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
14a90 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 53 74  eOp3(v, OP_AggSt
14aa0 65 70 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 6e 41  ep, pF->iMem, nA
14ab0 72 67 2c 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70  rg, (void*)pF->p
14ac0 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43 44 45 46  Func, P3_FUNCDEF
14ad0 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e  );.    if( addrN
14ae0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ext ){.      sql
14af0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
14b00 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74  abel(v, addrNext
14b10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  );.    }.  }.  f
14b20 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49  or(i=0, pC=pAggI
14b30 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67  nfo->aCol; i<pAg
14b40 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
14b50 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b  tor; i++, pC++){
14b60 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
14b70 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d  Code(pParse, pC-
14b80 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
14b90 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
14ba0 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 43   OP_MemStore, pC
14bb0 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 7d 0a  ->iMem, 1);.  }.
14bc0 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
14bd0 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 0a  ctMode = 0;.}...
14be0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
14bf0 6f 64 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ode for the give
14c00 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  n SELECT stateme
14c10 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  nt..**.** The re
14c20 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 72 69  sults are distri
14c30 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73  buted in various
14c40 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20   ways depending 
14c50 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  on the.** value 
14c60 6f 66 20 65 44 65 73 74 20 61 6e 64 20 69 50 61  of eDest and iPa
14c70 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44  rm..**.**     eD
14c80 65 73 74 20 56 61 6c 75 65 20 20 20 20 20 20 20  est Value       
14c90 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d  Result.**     --
14ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
14cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
14ce0 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20   SRT_Callback   
14cf0 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c   Invoke the call
14d00 62 61 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f  back for each ro
14d10 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  w of the result.
14d20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d  .**.**     SRT_M
14d30 65 6d 20 20 20 20 20 20 20 20 20 53 74 6f 72 65  em         Store
14d40 20 66 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e   first result in
14d50 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61   memory cell iPa
14d60 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  rm.**.**     SRT
14d70 5f 53 65 74 20 20 20 20 20 20 20 20 20 53 74 6f  _Set         Sto
14d80 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65  re results as ke
14d90 79 73 20 6f 66 20 74 61 62 6c 65 20 69 50 61 72  ys of table iPar
14da0 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  m..**.**     SRT
14db0 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f  _Union       Sto
14dc0 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20  re results as a 
14dd0 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61  key in a tempora
14de0 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a  ry table iParm.*
14df0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63  *.**     SRT_Exc
14e00 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20  ept      Remove 
14e10 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65  results from the
14e20 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
14e30 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20   iParm..**.**   
14e40 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20    SRT_Table     
14e50 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
14e60 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  in temporary tab
14e70 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54  le iParm.**.** T
14e80 68 65 20 74 61 62 6c 65 20 61 62 6f 76 65 20 69  he table above i
14e90 73 20 69 6e 63 6f 6d 70 6c 65 74 65 2e 20 20 41  s incomplete.  A
14ea0 64 64 69 74 69 6f 6e 61 6c 20 65 44 69 73 74 20  dditional eDist 
14eb0 76 61 6c 75 65 20 68 61 76 65 20 62 65 20 61 64  value have be ad
14ec0 64 65 64 0a 2a 2a 20 73 69 6e 63 65 20 74 68 69  ded.** since thi
14ed0 73 20 63 6f 6d 6d 65 6e 74 20 77 61 73 20 77 72  s comment was wr
14ee0 69 74 74 65 6e 2e 20 20 53 65 65 20 74 68 65 20  itten.  See the 
14ef0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
14f00 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a  ) function for.*
14f10 2a 20 61 20 63 6f 6d 70 6c 65 74 65 20 6c 69 73  * a complete lis
14f20 74 69 6e 67 20 6f 66 20 74 68 65 20 61 6c 6c 6f  ting of the allo
14f30 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 65 44  wed values of eD
14f40 65 73 74 20 61 6e 64 20 74 68 65 69 72 20 6d 65  est and their me
14f50 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  anings..**.** Th
14f60 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
14f70 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
14f80 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
14f90 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
14fa0 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
14fb0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
14fc0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
14fd0 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
14fe0 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
14ff0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15000 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
15010 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
15020 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
15030 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
15040 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
15050 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54  do that..**.** T
15060 68 65 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65  he pParent, pare
15070 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70 50 61 72  ntTab, and *pPar
15080 65 6e 74 41 67 67 20 66 69 65 6c 64 73 20 61 72  entAgg fields ar
15090 65 20 66 69 6c 6c 65 64 20 69 6e 20 69 66 20 74  e filled in if t
150a0 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73  his.** SELECT is
150b0 20 61 20 73 75 62 71 75 65 72 79 2e 20 20 54 68   a subquery.  Th
150c0 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 74  is routine may t
150d0 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68  ry to combine th
150e0 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74  is SELECT.** wit
150f0 68 20 69 74 73 20 70 61 72 65 6e 74 20 74 6f 20  h its parent to 
15100 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c  form a single fl
15110 61 74 20 71 75 65 72 79 2e 20 20 49 6e 20 73 6f  at query.  In so
15120 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68 74   doing, it might
15130 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20 70  .** change the p
15140 61 72 65 6e 74 20 71 75 65 72 79 20 66 72 6f 6d  arent query from
15150 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65   a non-aggregate
15160 20 74 6f 20 61 6e 20 61 67 67 72 65 67 61 74 65   to an aggregate
15170 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74   query..** For t
15180 68 61 74 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  hat reason, the 
15190 70 50 61 72 65 6e 74 41 67 67 20 66 6c 61 67 20  pParentAgg flag 
151a0 69 73 20 70 61 73 73 65 64 20 61 73 20 61 20 70  is passed as a p
151b0 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a  ointer, so it.**
151c0 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64 2e   can be changed.
151d0 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
151e0 3a 20 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  :   The meaning 
151f0 6f 66 20 74 68 65 20 70 50 61 72 65 6e 74 20 70  of the pParent p
15200 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
15210 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
15220 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54   t1 JOIN (SELECT
15230 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f   x, count(*) FRO
15240 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a  M t2) JOIN t3;.*
15250 2a 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20  *    \          
15260 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
15270 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f  ____ subquery __
15280 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a  _____/        /.
15290 2a 2a 20 20 20 20 20 5c 20 20 20 20 20 20 20 20  **     \        
152a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a                /.
152d0 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f  **      \_______
152e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75  _____________ ou
152f0 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f  ter query ______
15300 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a  _____________/.*
15310 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15320 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
15330 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
15340 66 69 72 73 74 2e 20 20 20 46 6f 72 20 74 68 61  first.   For tha
15350 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65  t call,.** pPare
15360 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e  nt will be NULL.
15370 20 20 44 75 72 69 6e 67 20 74 68 65 20 70 72 6f    During the pro
15380 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 6f  cessing of the o
15390 75 74 65 72 20 71 75 65 72 79 2c 20 74 68 69 73  uter query, this
153a0 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20   .** routine is 
153b0 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
153c0 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ly to handle the
153d0 20 73 75 62 71 75 65 72 79 2e 20 20 46 6f 72 20   subquery.  For 
153e0 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 2a 2a  the recursive.**
153f0 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77   call, pParent w
15400 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ill point to the
15410 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
15420 65 63 61 75 73 65 20 74 68 65 20 73 75 62 71 75  ecause the subqu
15430 65 72 79 20 69 73 0a 2a 2a 20 74 68 65 20 73 65  ery is.** the se
15440 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20  cond element in 
15450 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e  a three-way join
15460 2c 20 74 68 65 20 70 61 72 65 6e 74 54 61 62 20  , the parentTab 
15470 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a  parameter will.*
15480 2a 20 62 65 20 31 20 28 74 68 65 20 32 6e 64 20  * be 1 (the 2nd 
15490 76 61 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e 64  value of a 0-ind
154a0 65 78 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a  exed array.).*/.
154b0 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
154c0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
154d0 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
154e0 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
154f0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
15500 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
15510 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
15520 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
15530 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  d. */.  int eDes
15540 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
15550 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
15560 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
15570 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20  */.  int iParm, 
15580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
15590 20 70 61 72 61 6d 65 74 65 72 20 75 73 65 64 20   parameter used 
155a0 62 79 20 74 68 65 20 65 44 65 73 74 20 64 69 73  by the eDest dis
155b0 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
155c0 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e    Select *pParen
155d0 74 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  t,       /* Anot
155e0 68 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77  her SELECT for w
155f0 68 69 63 68 20 74 68 69 73 20 69 73 20 61 20 73  hich this is a s
15600 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ub-query */.  in
15610 74 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20  t parentTab,    
15620 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
15630 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f   pParent->pSrc o
15640 66 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  f this query */.
15650 20 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67    int *pParentAg
15660 67 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  g,       /* True
15670 20 69 66 20 70 50 61 72 65 6e 74 20 75 73 65 73   if pParent uses
15680 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
15690 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ions */.  char *
156a0 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20  aff             
156b0 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73 20   /* If eDest is 
156c0 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61  SRT_Union, the a
156d0 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a  ffinity string *
156e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
156f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15700 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
15710 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
15720 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65  WInfo;     /* Re
15730 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65  turn from sqlite
15740 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
15750 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
15760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15770 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
15780 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
15790 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ion */.  int isA
157a0 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gg;             
157b0 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65  /* True for sele
157c0 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63  ct lists like "c
157d0 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78  ount(*)" */.  Ex
157e0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
157f0 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
15800 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61  columns to extra
15810 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ct. */.  SrcList
15820 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
15830 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
15840 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d  s to select from
15850 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
15860 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re;          /* 
15870 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
15880 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
15890 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
158a0 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68  rderBy;    /* Th
158b0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
158c0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
158d0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
158e0 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54  GroupBy;    /* T
158f0 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
15900 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
15910 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
15920 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ing;         /* 
15930 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  The HAVING claus
15940 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
15950 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69  */.  int isDisti
15960 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  nct;        /* T
15970 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
15980 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
15990 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
159a0 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  distinct;       
159b0 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75     /* Table to u
159c0 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
159d0 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  nct set */.  int
159e0 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20   rc = 1;        
159f0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
15a00 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73  return from this
15a10 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
15a20 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  nt addrSortIndex
15a30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
15a40 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 56 69   of an OP_OpenVi
15a50 72 74 75 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  rtual instructio
15a60 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73  n */.  AggInfo s
15a70 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a  AggInfo;      /*
15a80 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65   Information use
15a90 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71  d by aggregate q
15aa0 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ueries */.  int 
15ab0 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  iEnd;           
15ac0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
15ad0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
15ae0 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20  query */..  if( 
15af0 73 71 6c 69 74 65 33 54 73 64 28 29 2d 3e 6d 61  sqlite3Tsd()->ma
15b00 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
15b10 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 3d  arse->nErr || p=
15b20 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
15b30 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
15b40 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
15b50 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
15b60 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31  0, 0) ) return 1
15b70 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67  ;.  memset(&sAgg
15b80 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
15b90 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 23 69 66  sAggInfo));..#if
15ba0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15bb0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
15bc0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
15bd0 73 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65  s are a sequence
15be0 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20   of queries, do 
15bf0 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73  the earlier ones
15c00 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69   first..  */.  i
15c10 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
15c20 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68      if( p->pRigh
15c30 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  tmost==0 ){.    
15c40 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b    Select *pLoop;
15c50 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  .      for(pLoop
15c60 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =p; pLoop; pLoop
15c70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b  =pLoop->pPrior){
15c80 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
15c90 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a  pRightmost = p;.
15ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15cb0 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65    return multiSe
15cc0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
15cd0 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 61 66  eDest, iParm, af
15ce0 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  f);.  }.#endif..
15cf0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
15d00 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  pOrderBy;.  if( 
15d10 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
15d20 28 65 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70  (eDest) ){.    p
15d30 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
15d40 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
15d50 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70  3SelectResolve(p
15d60 50 61 72 73 65 2c 20 70 2c 20 30 29 20 29 7b 0a  Parse, p, 0) ){.
15d70 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
15d80 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f  end;.  }.  p->pO
15d90 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
15da0 79 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f  y;..  /* Make lo
15db0 63 61 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68  cal copies of th
15dc0 65 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72  e parameters for
15dd0 20 74 68 69 73 20 71 75 65 72 79 2e 0a 20 20 2a   this query..  *
15de0 2f 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  /.  pTabList = p
15df0 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68 65 72 65  ->pSrc;.  pWhere
15e00 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
15e10 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
15e20 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e  roupBy;.  pHavin
15e30 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
15e40 20 20 69 73 41 67 67 20 3d 20 70 2d 3e 69 73 41    isAgg = p->isA
15e50 67 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74  gg;.  isDistinct
15e60 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74   = p->isDistinct
15e70 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
15e80 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  pEList;.  if( pE
15e90 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73  List==0 ) goto s
15ea0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
15eb0 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76   .  ** Do not ev
15ec0 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65  en attempt to ge
15ed0 6e 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65 20  nerate any code 
15ee0 69 66 20 77 65 20 68 61 76 65 20 61 6c 72 65 61  if we have alrea
15ef0 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72  dy seen.  ** err
15f00 6f 72 73 20 62 65 66 6f 72 65 20 74 68 69 73 20  ors before this 
15f10 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e 0a  routine starts..
15f20 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
15f30 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f  e->nErr>0 ) goto
15f40 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
15f50 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f  /* If writing to
15f60 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72   memory or gener
15f70 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a  ating a set.  **
15f80 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63   only a single c
15f90 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74  olumn may be out
15fa0 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  put..  */.#ifnde
15fb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
15fc0 42 51 55 45 52 59 0a 20 20 69 66 28 20 28 65 44  BQUERY.  if( (eD
15fd0 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20  est==SRT_Mem || 
15fe0 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20  eDest==SRT_Set) 
15ff0 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
16000 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >1 ){.    sqlite
16010 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
16020 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  , "only a single
16030 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20   result allowed 
16040 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61 20  for ".       "a 
16050 53 45 4c 45 43 54 20 74 68 61 74 20 69 73 20 70  SELECT that is p
16060 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
16070 73 69 6f 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f  sion");.    goto
16080 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
16090 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 52  .#endif..  /* OR
160a0 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72 65  DER BY is ignore
160b0 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73 74 69  d for some desti
160c0 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nations..  */.  
160d0 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64  if( IgnorableOrd
160e0 65 72 62 79 28 65 44 65 73 74 29 20 29 7b 0a 20  erby(eDest) ){. 
160f0 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
16100 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
16110 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65   generating code
16120 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
16130 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
16140 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
16150 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
16160 64 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66  d;..  /* Identif
16170 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  y column names i
16180 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69  f we will be usi
16190 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61 6c  ng them in a cal
161a0 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a  lback.  This.  *
161b0 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65  * step is skippe
161c0 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  d if the output 
161d0 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65  is going to some
161e0 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74 69   other destinati
161f0 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  on..  */.  if( e
16200 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
16210 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ck ){.    genera
16220 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
16230 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
16240 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
16250 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
16260 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65   for all sub-que
16270 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
16280 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66   clause.  */.#if
16290 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
162a0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
162b0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
162c0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20  TE_OMIT_VIEW).  
162d0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
162e0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
162f0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
16300 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65  *zSavedAuthConte
16310 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  xt = 0;.    int 
16320 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65  needRestoreConte
16330 78 74 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53  xt;.    struct S
16340 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
16350 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
16360 61 5b 69 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70  a[i];..    if( p
16370 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  Item->pSelect==0
16380 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
16390 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   if( pItem->zNam
163a0 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53  e!=0 ){.      zS
163b0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
163c0 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43  = pParse->zAuthC
163d0 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 70 50  ontext;.      pP
163e0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
163f0 78 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  xt = pItem->zNam
16400 65 3b 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73  e;.      needRes
16410 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b  toreContext = 1;
16420 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16430 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e    needRestoreCon
16440 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  text = 0;.    }.
16450 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
16460 74 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  t(pParse, pItem-
16470 3e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 56 69  >pSelect, SRT_Vi
16480 72 74 75 61 6c 54 61 62 2c 20 0a 20 20 20 20 20  rtualTab, .     
16490 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
164a0 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70 2c 20 69  m->iCursor, p, i
164b0 2c 20 26 69 73 41 67 67 2c 20 30 29 3b 0a 20 20  , &isAgg, 0);.  
164c0 20 20 69 66 28 20 6e 65 65 64 52 65 73 74 6f 72    if( needRestor
164d0 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20 20 20  eContext ){.    
164e0 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
164f0 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
16500 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  uthContext;.    
16510 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  }.    pTabList =
16520 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70 57   p->pSrc;.    pW
16530 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
16540 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72  ;.    if( !Ignor
16550 61 62 6c 65 4f 72 64 65 72 62 79 28 65 44 65 73  ableOrderby(eDes
16560 74 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64  t) ){.      pOrd
16570 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
16580 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 47  By;.    }.    pG
16590 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
165a0 75 70 42 79 3b 0a 20 20 20 20 70 48 61 76 69 6e  upBy;.    pHavin
165b0 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
165c0 20 20 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d      isDistinct =
165d0 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a   p->isDistinct;.
165e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
165f0 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 73   Check for the s
16600 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61  pecial case of a
16610 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
16620 66 75 6e 63 74 69 6f 6e 20 62 79 20 69 74 73 65  function by itse
16630 6c 66 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  lf.  ** in the r
16640 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a  esult set..  */.
16650 20 20 69 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d    if( simpleMinM
16660 61 78 51 75 65 72 79 28 70 50 61 72 73 65 2c 20  axQuery(pParse, 
16670 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29  p, eDest, iParm)
16680 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a   ){.    rc = 0;.
16690 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
166a0 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  end;.  }..  /* C
166b0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
166c0 68 69 73 20 69 73 20 61 20 73 75 62 71 75 65 72  his is a subquer
166d0 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 22 66  y that can be "f
166e0 6c 61 74 74 65 6e 65 64 22 20 69 6e 74 6f 20 69  lattened" into i
166f0 74 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20  ts parent..  ** 
16700 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
16710 20 61 20 70 6f 73 73 69 62 6c 69 74 79 2c 20 64   a possiblity, d
16720 6f 20 73 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  o so and return 
16730 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a 20  immediately.  . 
16740 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
16750 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69  TE_OMIT_VIEW.  i
16760 66 28 20 70 50 61 72 65 6e 74 20 26 26 20 70 50  f( pParent && pP
16770 61 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20 20  arentAgg &&.    
16780 20 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72    flattenSubquer
16790 79 28 70 50 61 72 73 65 2c 20 70 50 61 72 65 6e  y(pParse, pParen
167a0 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 2a 70  t, parentTab, *p
167b0 50 61 72 65 6e 74 41 67 67 2c 20 69 73 41 67 67  ParentAgg, isAgg
167c0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 41  ) ){.    if( isA
167d0 67 67 20 29 20 2a 70 50 61 72 65 6e 74 41 67 67  gg ) *pParentAgg
167e0 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 73   = 1;.    goto s
167f0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23  elect_end;.  }.#
16800 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
16810 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
16820 20 42 59 20 63 6c 61 75 73 65 2c 20 72 65 73 6f   BY clause, reso
16830 6c 76 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  lve any collatio
16840 6e 20 73 65 71 75 65 6e 63 65 73 0a 20 20 2a 2a  n sequences.  **
16850 20 6e 61 6d 65 73 20 74 68 61 74 20 68 61 76 65   names that have
16860 20 62 65 65 6e 20 65 78 70 6c 69 63 69 74 6c 79   been explicitly
16870 20 73 70 65 63 69 66 69 65 64 20 61 6e 64 20 63   specified and c
16880 72 65 61 74 65 20 61 20 73 6f 72 74 69 6e 67 20  reate a sorting 
16890 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
168a0 20 54 68 69 73 20 73 6f 72 74 69 6e 67 20 69 6e   This sorting in
168b0 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70  dex might end up
168c0 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66   being unused if
168d0 20 74 68 65 20 64 61 74 61 20 63 61 6e 20 62 65   the data can be
168e0 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64   .  ** extracted
168f0 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f   in pre-sorted o
16900 72 64 65 72 2e 20 20 49 66 20 74 68 61 74 20 69  rder.  If that i
16910 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
16920 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65   the.  ** OP_Ope
16930 6e 56 69 72 74 75 61 6c 20 69 6e 73 74 72 75 63  nVirtual instruc
16940 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61  tion will be cha
16950 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f  nged to an OP_No
16960 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20  op once.  ** we 
16970 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20  figure out that 
16980 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
16990 78 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e  x is not needed.
169a0 20 20 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e    The addrSortIn
169b0 64 65 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  dex.  ** variabl
169c0 65 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63  e is used to fac
169d0 69 6c 69 74 61 74 65 20 74 68 61 74 20 63 68 61  ilitate that cha
169e0 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nge..  */.  if( 
169f0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
16a00 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
16a10 69 74 65 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20  item *pTerm;.   
16a20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
16a30 66 6f 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  fo;.    for(i=0,
16a40 20 70 54 65 72 6d 3d 70 4f 72 64 65 72 42 79 2d   pTerm=pOrderBy-
16a50 3e 61 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  >a; i<pOrderBy->
16a60 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 54 65 72  nExpr; i++, pTer
16a70 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
16a80 70 54 65 72 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a  pTerm->zName ){.
16a90 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70          pTerm->p
16aa0 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71  Expr->pColl = sq
16ab0 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
16ac0 65 71 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  eq(pParse, pTerm
16ad0 2d 3e 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20  ->zName, -1);.  
16ae0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16af0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
16b00 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
16b10 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
16b20 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
16b30 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
16b40 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ist(pParse, pOrd
16b50 65 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65  erBy);.    pOrde
16b60 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20  rBy->iECursor = 
16b70 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
16b80 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56      p->addrOpenV
16b90 69 72 74 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72  irt[2] = addrSor
16ba0 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 20  tIndex =.       
16bb0 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
16bc0 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c  , OP_OpenVirtual
16bd0 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
16be0 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e  rsor, pOrderBy->
16bf0 6e 45 78 70 72 2b 32 2c 20 0a 20 20 20 20 20 20  nExpr+2, .      
16c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c10 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
16c20 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P3_KEYINFO_HA
16c30 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b  NDOFF);.  }else{
16c40 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e 64  .    addrSortInd
16c50 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  ex = -1;.  }..  
16c60 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74  /* Set the limit
16c70 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20  er..  */.  iEnd 
16c80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
16c90 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d  eLabel(v);.  com
16ca0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
16cb0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45  rs(pParse, p, iE
16cc0 6e 64 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  nd);..  /* If th
16cd0 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74  e output is dest
16ce0 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f  ined for a tempo
16cf0 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e  rary table, open
16d00 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a   that table..  *
16d10 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
16d20 52 54 5f 56 69 72 74 75 61 6c 54 61 62 20 29 7b  RT_VirtualTab ){
16d30 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16d40 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
16d50 56 69 72 74 75 61 6c 2c 20 69 50 61 72 6d 2c 20  Virtual, iParm, 
16d60 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
16d70 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
16d80 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
16d90 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
16da0 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f  stinct set..  */
16db0 0a 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63  .  if( isDistinc
16dc0 74 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  t ){.    KeyInfo
16dd0 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
16de0 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73  distinct = pPars
16df0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70  e->nTab++;.    p
16e00 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
16e10 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
16e20 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29  arse, p->pEList)
16e30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16e40 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 56  eOp3(v, OP_OpenV
16e50 69 72 74 75 61 6c 2c 20 64 69 73 74 69 6e 63 74  irtual, distinct
16e60 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
16e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
16e80 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
16e90 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
16ea0 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  F);.  }else{.   
16eb0 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a   distinct = -1;.
16ec0 20 20 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67    }..  /* Aggreg
16ed0 61 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72  ate and non-aggr
16ee0 65 67 61 74 65 20 71 75 65 72 69 65 73 20 61 72  egate queries ar
16ef0 65 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72  e handled differ
16f00 65 6e 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21  ently */.  if( !
16f10 69 73 41 67 67 20 26 26 20 70 47 72 6f 75 70 42  isAgg && pGroupB
16f20 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  y==0 ){.    /* T
16f30 68 69 73 20 63 61 73 65 20 69 73 20 66 6f 72 20  his case is for 
16f40 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75  non-aggregate qu
16f50 65 72 69 65 73 0a 20 20 20 20 2a 2a 20 42 65 67  eries.    ** Beg
16f60 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
16f70 73 63 61 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  scan.    */.    
16f80 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
16f90 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
16fa0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
16fb0 65 72 65 2c 20 26 70 4f 72 64 65 72 42 79 29 3b  ere, &pOrderBy);
16fc0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d  .    if( pWInfo=
16fd0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
16fe0 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  _end;..    /* If
16ff0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
17000 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20  hat was created 
17010 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70  by a prior OP_Op
17020 65 6e 56 69 72 74 75 61 6c 20 0a 20 20 20 20 2a  enVirtual .    *
17030 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e  * instruction en
17040 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67  ded up not being
17050 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68   needed, then ch
17060 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
17070 56 69 72 74 75 61 6c 0a 20 20 20 20 2a 2a 20 69  Virtual.    ** i
17080 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a  nto an OP_Noop..
17090 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61      */.    if( a
170a0 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20  ddrSortIndex>=0 
170b0 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  && pOrderBy==0 )
170c0 7b 0a 20 20 20 20 20 20 75 6e 63 72 65 61 74 65  {.      uncreate
170d0 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61  SortingIndex(pPa
170e0 72 73 65 2c 20 61 64 64 72 53 6f 72 74 49 6e 64  rse, addrSortInd
170f0 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  ex);.      p->ad
17100 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 20 3d 20  drOpenVirt[2] = 
17110 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  -1;.    }..    /
17120 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61  * Use the standa
17130 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 20 20  rd inner loop.  
17140 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 65 6c    */.    if( sel
17150 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
17160 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20  rse, p, pEList, 
17170 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20  0, 0, pOrderBy, 
17180 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c  distinct, eDest,
17190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
171a0 20 20 20 20 20 69 50 61 72 6d 2c 20 70 57 49 6e       iParm, pWIn
171b0 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70  fo->iContinue, p
171c0 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 61  WInfo->iBreak, a
171d0 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20 67 6f  ff) ){.       go
171e0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
171f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 64     }..    /* End
17200 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
17210 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
17220 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
17230 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  End(pWInfo);.  }
17240 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
17250 73 20 69 73 20 74 68 65 20 70 72 6f 63 65 73 73  s is the process
17260 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
17270 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 20  e queries */.   
17280 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
17290 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  ;    /* Name con
172a0 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73  text for process
172b0 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e  ing aggregate in
172c0 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
172d0 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20   int iAMem;     
172e0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
172f0 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74  m address for st
17300 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52  oring current GR
17310 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
17320 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iBMem;        
17330 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
17340 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69  ddress for previ
17350 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ous GROUP BY */.
17360 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67      int iUseFlag
17370 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ;       /* Mem a
17380 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66  ddress holding f
17390 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74  lag indicating t
173a0 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20  hat at least.   
173b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173c0 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20       ** one row 
173d0 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20  of the input to 
173e0 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68  the aggregator h
173f0 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  as been.        
17400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17410 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ** processed */.
17420 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c      int iAbortFl
17430 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ag;     /* Mem a
17440 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75  ddress which cau
17450 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20  ses query abort 
17460 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20  if positive */. 
17470 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f     int groupBySo
17480 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63  rt;    /* Rows c
17490 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20  ome from source 
174a0 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65  in GROUP BY orde
174b0 72 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 20 54 68  r */...    /* Th
174c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
174d0 61 62 6c 65 73 20 68 6f 6c 64 20 61 64 64 72 65  ables hold addre
174e0 73 73 65 73 20 6f 72 20 6c 61 62 65 6c 73 20 66  sses or labels f
174f0 6f 72 20 70 61 72 74 73 20 6f 66 20 74 68 65 0a  or parts of the.
17500 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d      ** virtual m
17510 61 63 68 69 6e 65 20 70 72 6f 67 72 61 6d 20 77  achine program w
17520 65 20 61 72 65 20 70 75 74 74 69 6e 67 20 74 6f  e are putting to
17530 67 65 74 68 65 72 20 2a 2f 0a 20 20 20 20 69 6e  gether */.    in
17540 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b  t addrOutputRow;
17550 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
17560 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  f subroutine tha
17570 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75  t outputs a resu
17580 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e  lt row */.    in
17590 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20  t addrSetAbort; 
175a0 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65        /* Set the
175b0 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20   abort flag and 
175c0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 69 6e  return */.    in
175d0 74 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65  t addrInitialize
175e0 4c 6f 6f 70 3b 20 2f 2a 20 53 74 61 72 74 20 6f  Loop; /* Start o
175f0 66 20 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74  f code that init
17600 69 61 6c 69 7a 65 73 20 74 68 65 20 69 6e 70 75  ializes the inpu
17610 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e  t loop */.    in
17620 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b  t addrTopOfLoop;
17630 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
17640 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a  the input loop *
17650 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 47 72  /.    int addrGr
17660 6f 75 70 42 79 43 68 61 6e 67 65 3b 20 20 2f 2a  oupByChange;  /*
17670 20 43 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20   Code that runs 
17680 77 68 65 6e 20 61 6e 79 20 47 52 4f 55 50 20 42  when any GROUP B
17690 59 20 74 65 72 6d 20 63 68 61 6e 67 65 73 20 2a  Y term changes *
176a0 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 50 72  /.    int addrPr
176b0 6f 63 65 73 73 52 6f 77 3b 20 20 20 20 20 2f 2a  ocessRow;     /*
176c0 20 43 6f 64 65 20 74 6f 20 70 72 6f 63 65 73 73   Code to process
176d0 20 61 20 73 69 6e 67 6c 65 20 69 6e 70 75 74 20   a single input 
176e0 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  row */.    int a
176f0 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 20  ddrEnd;         
17700 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 61 6c 6c     /* End of all
17710 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20   processing */. 
17720 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69     int addrSorti
17730 6e 67 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68  ngIdx;     /* Th
17740 65 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c  e OP_OpenVirtual
17750 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67   for the sorting
17760 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
17770 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20  t addrReset;    
17780 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74        /* Subrout
17790 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e  ine for resettin
177a0 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
177b0 72 20 2a 2f 0a 0a 20 20 20 20 61 64 64 72 45 6e  r */..    addrEn
177c0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
177d0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
177e0 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f    /* Convert TK_
177f0 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74  COLUMN nodes int
17800 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  o TK_AGG_COLUMN 
17810 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73  and make entries
17820 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49   in.    ** sAggI
17830 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41  nfo for all TK_A
17840 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
17850 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
17860 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53   of the.    ** S
17870 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
17880 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
17890 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
178a0 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
178b0 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
178c0 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
178d0 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
178e0 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f      sNC.pAggInfo
178f0 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20   = &sAggInfo;.  
17900 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
17910 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f  ingColumn = pGro
17920 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d  upBy ? pGroupBy-
17930 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20  >nExpr+1 : 0;.  
17940 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75    sAggInfo.pGrou
17950 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
17960 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
17970 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
17980 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 20  t(&sNC, pEList) 
17990 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
179a0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
179b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
179c0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
179d0 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79  t(&sNC, pOrderBy
179e0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
179f0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
17a00 7d 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  }.    if( pHavin
17a10 67 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  g && sqlite3Expr
17a20 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
17a30 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29  s(&sNC, pHaving)
17a40 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
17a50 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
17a60 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
17a70 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
17a80 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
17a90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
17aa0 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b  ggInfo.nFunc; i+
17ab0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
17ac0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
17ad0 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41  AggList(&sNC, sA
17ae0 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
17af0 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 20 29 7b  pExpr->pList) ){
17b00 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
17b10 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
17b20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
17b30 73 71 6c 69 74 65 33 54 73 64 28 29 2d 3e 6d 61  sqlite3Tsd()->ma
17b40 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
17b50 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
17b60 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67     /* Processing
17b70 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20   for aggregates 
17b80 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73  with GROUP BY is
17b90 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20   very different 
17ba0 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20  and.    ** much 
17bb0 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61  more complex tha
17bc0 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
17bd0 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a  out a GROUP BY..
17be0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
17bf0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
17c00 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
17c10 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69  fo;  /* Keying i
17c20 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
17c30 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75  he group by clau
17c40 73 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  se */..      /* 
17c50 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 74 68  Create labels th
17c60 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 6e 65  at we will be ne
17c70 65 64 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20  eding.      */. 
17c80 20 20 20 20 0a 20 20 20 20 20 20 61 64 64 72 49      .      addrI
17c90 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 20 3d 20  nitializeLoop = 
17ca0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
17cb0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61  abel(v);.      a
17cc0 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65  ddrGroupByChange
17cd0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
17ce0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
17cf0 20 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77    addrProcessRow
17d00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
17d10 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20  keLabel(v);..   
17d20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
17d30 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  s a GROUP BY cla
17d40 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65  use we might nee
17d50 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  d a sorting inde
17d60 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d  x to.      ** im
17d70 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c  plement it.  All
17d80 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69  ocate that sorti
17d90 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49  ng index now.  I
17da0 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20  f it turns out. 
17db0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
17dc0 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61  do not need it a
17dd0 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 70  fter all, the Op
17de0 65 6e 56 69 72 74 75 61 6c 20 69 6e 73 74 72 75  enVirtual instru
17df0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77  ction.      ** w
17e00 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
17e10 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a   into a Noop.  .
17e20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
17e30 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
17e40 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
17e50 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  b++;.      pKeyI
17e60 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
17e70 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
17e80 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  , pGroupBy);.   
17e90 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64     addrSortingId
17ea0 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71  x =.          sq
17eb0 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
17ec0 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20  OP_OpenVirtual, 
17ed0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
17ee0 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Idx,.           
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 41                sA
17f00 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
17f10 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20  olumn,.         
17f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f30 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
17f40 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
17f50 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  OFF);..      /* 
17f60 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
17f70 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64  y locations used
17f80 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67   by GROUP BY agg
17f90 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e  regate processin
17fa0 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  g.      */.     
17fb0 20 69 55 73 65 46 6c 61 67 20 3d 20 70 50 61 72   iUseFlag = pPar
17fc0 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
17fd0 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 70    iAbortFlag = p
17fe0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
17ff0 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61       iAMem = pPa
18000 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
18010 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
18020 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
18030 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20  ;.      iBMem = 
18040 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
18050 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
18060 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45   += pGroupBy->nE
18070 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
18080 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
18090 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 69 41 62  P_MemInt, 0, iAb
180a0 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
180b0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
180c0 22 23 20 63 6c 65 61 72 20 61 62 6f 72 74 20 66  "# clear abort f
180d0 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
180e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
180f0 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20  , OP_MemInt, 0, 
18100 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
18110 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
18120 20 22 23 20 69 6e 64 69 63 61 74 65 20 61 63 63   "# indicate acc
18130 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29  umulator empty")
18140 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18150 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
18160 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 49 6e 69  Goto, 0, addrIni
18170 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 0a 20  tializeLoop);.. 
18180 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
18190 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
181a0 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e  at outputs a sin
181b0 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  gle row of the r
181c0 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73  esult.      ** s
181d0 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75  et.  This subrou
181e0 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73  tine first looks
181f0 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67   at the iUseFlag
18200 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20  .  If iUseFlag. 
18210 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20       ** is less 
18220 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
18230 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f   zero, the subro
18240 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
18250 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74  .  If.      ** t
18260 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61  he processing ca
18270 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72  lls for the quer
18280 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73  y to abort, this
18290 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
182a0 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20    ** increments 
182b0 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d  the iAbortFlag m
182c0 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62  emory location b
182d0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
182e0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
182f0 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20  r to signal the 
18300 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e  caller to abort.
18310 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
18320 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73  addrSetAbort = s
18330 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
18340 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
18350 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18360 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31  (v, OP_MemInt, 1
18370 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
18380 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
18390 28 28 76 2c 20 22 23 20 73 65 74 20 61 62 6f 72  ((v, "# set abor
183a0 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
183b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
183c0 70 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  p(v, OP_Return, 
183d0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64  0, 0);.      add
183e0 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
183f0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
18400 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
18410 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
18420 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69  , OP_IfMemPos, i
18430 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74  UseFlag, addrOut
18440 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20  putRow+2);.     
18450 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
18460 20 22 23 20 47 72 6f 75 70 62 79 20 72 65 73 75   "# Groupby resu
18470 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74  lt generator ent
18480 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20  ry point"));.   
18490 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
184a0 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  dOp(v, OP_Return
184b0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  , 0, 0);.      f
184c0 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
184d0 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
184e0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  gInfo);.      if
184f0 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
18500 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
18510 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
18520 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74  pHaving, addrOut
18530 70 75 74 52 6f 77 2b 31 2c 20 31 29 3b 0a 20 20  putRow+1, 1);.  
18540 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
18550 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
18560 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
18570 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
18580 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
18590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185a0 20 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73    distinct, eDes
185b0 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20  t, iParm, .     
185c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185d0 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
185e0 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62  Row+1, addrSetAb
185f0 6f 72 74 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  ort, aff);.     
18600 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
18610 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
18620 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
18630 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18640 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  Op(v, OP_Return,
18650 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 56 64   0, 0);.      Vd
18660 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
18670 20 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73   end groupby res
18680 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29  ult generator"))
18690 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
186a0 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
186b0 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65  e that will rese
186c0 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61  t the group-by a
186d0 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20  ccumulator.     
186e0 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 52 65   */.      addrRe
186f0 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  set = sqlite3Vdb
18700 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
18710 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75  .      resetAccu
18720 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
18730 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
18740 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18750 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  Op(v, OP_Return,
18760 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f   0, 0);..      /
18770 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74  * Begin a loop t
18780 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
18790 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73   all source rows
187a0 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
187b0 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  er..      ** Thi
187c0 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20  s might involve 
187d0 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f  two separate loo
187e0 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f  ps with an OP_So
187f0 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f  rt in between, o
18800 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69  r.      ** it mi
18810 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ght be a single 
18820 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20 61  loop that uses a
18830 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61  n index to extra
18840 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20  ct information. 
18850 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72       ** in the r
18860 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65  ight order to be
18870 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20  gin with..      
18880 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
18890 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
188a0 28 76 2c 20 61 64 64 72 49 6e 69 74 69 61 6c 69  (v, addrInitiali
188b0 7a 65 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73  zeLoop);.      s
188c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
188d0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20  v, OP_Gosub, 0, 
188e0 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
188f0 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
18900 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
18910 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
18920 57 68 65 72 65 2c 20 26 70 47 72 6f 75 70 42 79  Where, &pGroupBy
18930 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
18940 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
18950 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
18960 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20  if( pGroupBy==0 
18970 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
18980 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61  e optimizer is a
18990 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72  ble to deliver r
189a0 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20  ows in group by 
189b0 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20  order so.       
189c0 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61   ** we do not ha
189d0 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65  ve to sort.  The
189e0 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 20   OP_OpenVirtual 
189f0 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20  table will be.  
18a00 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c        ** cancell
18a10 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73 65  ed later because
18a20 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
18a30 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e  o use the pKeyIn
18a40 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  fo.        */.  
18a50 20 20 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d        pGroupBy =
18a60 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
18a70 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
18a80 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  t = 0;.      }el
18a90 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52  se{.        /* R
18aa0 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f  ows are coming o
18ab0 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e  ut in undetermin
18ac0 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61  ed order.  We ha
18ad0 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20  ve to push.     
18ae0 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69     ** each row i
18af0 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  nto a sorting in
18b00 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74  dex, terminate t
18b10 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20  he first loop,. 
18b20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c         ** then l
18b30 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72  oop over the sor
18b40 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72  ting index in or
18b50 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f  der to get the o
18b60 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a  utput.        **
18b70 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
18b80 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
18b90 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
18ba0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 1;.        sql
18bb0 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
18bc0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
18bd0 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20  oupBy);.        
18be0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18bf0 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c  (v, OP_Sequence,
18c00 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
18c10 67 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 20 20  gIdx, 0);.      
18c20 20 20 6a 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e    j = pGroupBy->
18c30 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 20 20 20  nExpr+1;.       
18c40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
18c50 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
18c60 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  +){.          st
18c70 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
18c80 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e   *pCol = &sAggIn
18c90 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20  fo.aCol[i];.    
18ca0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
18cb0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 6a 20  iSorterColumn<j 
18cc0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
18cd0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
18ce0 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
18cf0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18d00 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
18d10 52 6f 77 69 64 2c 20 70 43 6f 6c 2d 3e 69 54 61  Rowid, pCol->iTa
18d20 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ble, 0);.       
18d30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18d40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18d50 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
18d60 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c  umn, pCol->iTabl
18d70 65 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e  e, pCol->iColumn
18d80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
18d90 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
18da0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18db0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18dc0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
18dd0 64 2c 20 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20  d, j, 0);.      
18de0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18df0 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  Op(v, OP_IdxInse
18e00 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
18e10 74 69 6e 67 49 64 78 2c 20 30 29 3b 0a 20 20 20  tingIdx, 0);.   
18e20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
18e30 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
18e40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18e50 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
18e60 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
18e70 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29  ingIdx, addrEnd)
18e80 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
18e90 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 47 52 4f  mment((v, "# GRO
18ea0 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a 20  UP BY sort"));. 
18eb0 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
18ec0 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  useSortingIdx = 
18ed0 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  1;.      }..    
18ee0 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
18ef0 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
18f00 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f  BY terms and sto
18f10 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32  re in b0, b1, b2
18f20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30  ....      ** (b0
18f30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74   is memory locat
18f40 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20  ion iBMem+0, b1 
18f50 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20  is iBMem+1, and 
18f60 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20  so forth).      
18f70 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20  ** Then compare 
18f80 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
18f90 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e  P BY terms again
18fa0 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  st the GROUP BY 
18fb0 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66  terms.      ** f
18fc0 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
18fd0 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73   row currently s
18fe0 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c  tored in a0, a1,
18ff0 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a   a2....      */.
19000 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c        addrTopOfL
19010 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
19020 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
19030 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
19040 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  j<pGroupBy->nExp
19050 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
19060 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
19070 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
19080 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
19090 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 41 67  , OP_Column, sAg
190a0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
190b0 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , j);.        }e
190c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
190d0 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f  AggInfo.directMo
190e0 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  de = 1;.        
190f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
19100 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  e(pParse, pGroup
19110 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b  By->a[j].pExpr);
19120 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19130 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19140 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
19150 72 65 2c 20 69 42 4d 65 6d 2b 6a 2c 20 6a 3c 70  re, iBMem+j, j<p
19160 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31  GroupBy->nExpr-1
19170 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19180 20 66 6f 72 28 6a 3d 70 47 72 6f 75 70 42 79 2d   for(j=pGroupBy-
19190 3e 6e 45 78 70 72 2d 31 3b 20 6a 3e 3d 30 3b 20  >nExpr-1; j>=0; 
191a0 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j--){.        if
191b0 28 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ( j<pGroupBy->nE
191c0 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  xpr-1 ){.       
191d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
191e0 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
191f0 64 2c 20 69 42 4d 65 6d 2b 6a 2c 20 30 29 3b 0a  d, iBMem+j, 0);.
19200 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19210 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19220 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
19230 2c 20 69 41 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20  , iAMem+j, 0);. 
19240 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20         if( j==0 
19250 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
19260 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
19270 20 4f 50 5f 45 71 2c 20 30 78 32 30 30 2c 20 61   OP_Eq, 0x200, a
19280 64 64 72 50 72 6f 63 65 73 73 52 6f 77 29 3b 0a  ddrProcessRow);.
19290 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
192a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
192b0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
192c0 4e 65 2c 20 30 78 32 30 30 2c 20 61 64 64 72 47  Ne, 0x200, addrG
192d0 72 6f 75 70 42 79 43 68 61 6e 67 65 29 3b 0a 20  roupByChange);. 
192e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
192f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
19300 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 76 6f 69  geP3(v, -1, (voi
19310 64 2a 29 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  d*)pKeyInfo->aCo
19320 6c 6c 5b 6a 5d 2c 20 50 33 5f 43 4f 4c 4c 53 45  ll[j], P3_COLLSE
19330 51 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  Q);.      }..   
19340 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
19350 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68  ode that runs wh
19360 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55 50  enever the GROUP
19370 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20   BY changes..   
19380 20 20 20 2a 2a 20 43 68 61 6e 67 65 20 69 6e 20     ** Change in 
19390 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 72 65  the GROUP BY are
193a0 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68 65   detected by the
193b0 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20   previous code. 
193c0 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20       ** block.  
193d0 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f  If there were no
193e0 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62   changes, this b
193f0 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e  lock is skipped.
19400 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
19410 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70  ** This code cop
19420 69 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75  ies current grou
19430 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30  p by terms in b0
19440 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20  ,b1,b2,....     
19450 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61   ** over to a0,a
19460 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63  1,a2.  It then c
19470 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20  alls the output 
19480 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
19490 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74   ** and resets t
194a0 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
194b0 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65  umulator registe
194c0 72 73 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  rs in preparatio
194d0 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  n.      ** for t
194e0 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59  he next GROUP BY
194f0 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f   batch..      */
19500 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19510 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
19520 2c 20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61  , addrGroupByCha
19530 6e 67 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  nge);.      for(
19540 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d  j=0; j<pGroupBy-
19550 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
19560 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19570 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
19580 4d 6f 76 65 2c 20 69 41 4d 65 6d 2b 6a 2c 20 69  Move, iAMem+j, i
19590 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 7d  BMem+j);.      }
195a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
195b0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
195c0 73 75 62 2c 20 30 2c 20 61 64 64 72 4f 75 74 70  sub, 0, addrOutp
195d0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
195e0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
195f0 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22   output one row"
19600 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
19610 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
19620 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 41 62 6f 72  _IfMemPos, iAbor
19630 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b  tFlag, addrEnd);
19640 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
19650 6e 74 28 28 76 2c 20 22 23 20 63 68 65 63 6b 20  nt((v, "# check 
19660 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
19670 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19680 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75  AddOp(v, OP_Gosu
19690 62 2c 20 30 2c 20 61 64 64 72 52 65 73 65 74 29  b, 0, addrReset)
196a0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
196b0 65 6e 74 28 28 76 2c 20 22 23 20 72 65 73 65 74  ent((v, "# reset
196c0 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
196d0 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
196e0 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  e the aggregate 
196f0 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73  accumulators bas
19700 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
19710 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  t of.      ** th
19720 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20  e current row.  
19730 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
19740 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
19750 61 62 65 6c 28 76 2c 20 61 64 64 72 50 72 6f 63  abel(v, addrProc
19760 65 73 73 52 6f 77 29 3b 0a 20 20 20 20 20 20 75  essRow);.      u
19770 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
19780 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
19790 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
197a0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
197b0 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 69 55 73  P_MemInt, 1, iUs
197c0 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
197d0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
197e0 20 69 6e 64 69 63 61 74 65 20 64 61 74 61 20 69   indicate data i
197f0 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29  n accumulator"))
19800 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;..      /* End 
19810 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20  of the loop.    
19820 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67    */.      if( g
19830 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
19840 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19850 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
19860 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
19870 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f  ingIdx, addrTopO
19880 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d 65  fLoop);.      }e
19890 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
198a0 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
198b0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 75 6e  nfo);.        un
198c0 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64  createSortingInd
198d0 65 78 28 70 50 61 72 73 65 2c 20 61 64 64 72 53  ex(pParse, addrS
198e0 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20 20  ortingIdx);.    
198f0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75    }..      /* Ou
19900 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72  tput the final r
19910 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20  ow of result.   
19920 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
19930 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
19940 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64  OP_Gosub, 0, add
19950 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
19960 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
19970 76 2c 20 22 23 20 6f 75 74 70 75 74 20 66 69 6e  v, "# output fin
19980 61 6c 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20  al row"));.     
19990 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66   .    } /* endif
199a0 20 70 47 72 6f 75 70 42 79 20 2a 2f 0a 20 20 20   pGroupBy */.   
199b0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a   else {.      /*
199c0 20 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20   This case runs 
199d0 69 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  if the aggregate
199e0 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59   has no GROUP BY
199f0 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20   clause.  The.  
19a00 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
19a10 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65  g is much simple
19a20 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  r since there is
19a30 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72   only a single r
19a40 6f 77 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f  ow.      ** of o
19a50 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  utput..      */.
19a60 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
19a70 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
19a80 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
19a90 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
19aa0 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
19ab0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
19ac0 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  here, 0);.      
19ad0 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
19ae0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
19af0 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63  .      updateAcc
19b00 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
19b10 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
19b20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
19b30 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
19b40 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e    finalizeAggFun
19b50 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26  ctions(pParse, &
19b60 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
19b70 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
19b80 20 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67       if( pHaving
19b90 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
19ba0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
19bb0 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
19bc0 61 64 64 72 45 6e 64 2c 20 31 29 3b 0a 20 20 20  addrEnd, 1);.   
19bd0 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63     }.      selec
19be0 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
19bf0 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
19c00 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20   0, 0, 0, -1, . 
19c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c20 20 20 20 20 20 65 44 65 73 74 2c 20 69 50 61 72       eDest, iPar
19c30 6d 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72  m, addrEnd, addr
19c40 45 6e 64 2c 20 61 66 66 29 3b 0a 20 20 20 20 7d  End, aff);.    }
19c50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19c60 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
19c70 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20  addrEnd);.    . 
19c80 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72   } /* endif aggr
19c90 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a  egate query */..
19ca0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
19cb0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
19cc0 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65  use, then we nee
19cd0 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65  d to sort the re
19ce0 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73  sults.  ** and s
19cf0 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20  end them to the 
19d00 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20  callback one by 
19d10 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
19d20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
19d30 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
19d40 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70  (pParse, p, v, p
19d50 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44  EList->nExpr, eD
19d60 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d  est, iParm);.  }
19d70 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
19d80 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
19d90 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
19da0 61 20 73 75 62 71 75 65 72 79 2c 20 77 65 20 68  a subquery, we h
19db0 61 76 65 20 6e 6f 77 20 63 6f 6e 76 65 72 74 65  ave now converte
19dc0 64 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  d the subquery i
19dd0 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f  nto a.  ** tempo
19de0 72 61 72 79 20 74 61 62 6c 65 2e 20 20 53 6f 20  rary table.  So 
19df0 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 71 75  delete the subqu
19e00 65 72 79 20 73 74 72 75 63 74 75 72 65 20 66 72  ery structure fr
19e10 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 0a 20 20  om the parent.  
19e20 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68  ** to prevent th
19e30 69 73 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d  is subquery from
19e40 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64   being evaluated
19e50 20 61 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f   again and to fo
19e60 72 63 65 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  rce the.  ** the
19e70 20 75 73 65 20 6f 66 20 74 68 65 20 74 65 6d 70   use of the temp
19e80 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a  orary table..  *
19e90 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20  /.  if( pParent 
19ea0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
19eb0 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53  Parent->pSrc->nS
19ec0 72 63 3e 70 61 72 65 6e 74 54 61 62 20 29 3b 0a  rc>parentTab );.
19ed0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
19ee0 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72  ent->pSrc->a[par
19ef0 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 3d  entTab].pSelect=
19f00 3d 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =p );.    sqlite
19f10 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 29  3SelectDelete(p)
19f20 3b 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70  ;.    pParent->p
19f30 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62  Src->a[parentTab
19f40 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20  ].pSelect = 0;. 
19f50 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
19f60 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69  Jump here to ski
19f70 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a  p this query.  *
19f80 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
19f90 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
19fa0 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  End);..  /* The 
19fb0 53 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65  SELECT was succe
19fc0 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20  ssfully coded.  
19fd0 20 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20   Set the return 
19fe0 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74  code to 0.  ** t
19ff0 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72  o indicate no er
1a000 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  rors..  */.  rc 
1a010 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72  = 0;..  /* Contr
1a020 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65  ol jumps to here
1a030 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
1a040 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76  encountered abov
1a050 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20  e, or upon.  ** 
1a060 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e  successful codin
1a070 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  g of the SELECT.
1a080 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64  .  */.select_end
1a090 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 73  :.  sqliteFree(s
1a0a0 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20  AggInfo.aCol);. 
1a0b0 20 73 71 6c 69 74 65 46 72 65 65 28 73 41 67 67   sqliteFree(sAgg
1a0c0 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72  Info.aFunc);.  r
1a0d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a              eturn rc;.}.