/ Hex Artifact Content
Login

Artifact e51efe5479d1cb4f48defe0b97cdba7391df42a755ba9592b9159510d03cf738:


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 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 73 2f 25 70 3a 20 22 2c 28 53 29 2d 3e 7a  "%s/%p: ",(S)->z
02c0: 53 65 6c 4e 61 6d 65 2c 28 53 29 29 2c 5c 0a 20  SelName,(S)),\. 
02d0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
02e0: 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23 20  rintf X.#else.# 
02f0: 64 65 66 69 6e 65 20 53 45 4c 45 43 54 54 52 41  define SELECTTRA
0300: 43 45 28 4b 2c 50 2c 53 2c 58 29 0a 23 65 6e 64  CE(K,P,S,X).#end
0310: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  if.../*.** An in
0320: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
0330: 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20 69  llowing object i
0340: 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72 64  s used to record
0350: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
0360: 75 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70 72 6f  ut.** how to pro
0370: 63 65 73 73 20 74 68 65 20 44 49 53 54 49 4e 43  cess the DISTINC
0380: 54 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20 73 69  T keyword, to si
0390: 6d 70 6c 69 66 79 20 70 61 73 73 69 6e 67 20 74  mplify passing t
03a0: 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  hat information.
03b0: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 6c 65  ** into the sele
03c0: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 72 6f  ctInnerLoop() ro
03d0: 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65  utine..*/.typede
03e0: 66 20 73 74 72 75 63 74 20 44 69 73 74 69 6e 63  f struct Distinc
03f0: 74 43 74 78 20 44 69 73 74 69 6e 63 74 43 74 78  tCtx DistinctCtx
0400: 3b 0a 73 74 72 75 63 74 20 44 69 73 74 69 6e 63  ;.struct Distinc
0410: 74 43 74 78 20 7b 0a 20 20 75 38 20 69 73 54 6e  tCtx {.  u8 isTn
0420: 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ct;      /* True
0430: 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
0440: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
0450: 65 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54 6e 63  ent */.  u8 eTnc
0460: 74 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e 65 20  tType;   /* One 
0470: 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44 49 53  of the WHERE_DIS
0480: 54 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74 6f 72  TINCT_* operator
0490: 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 54 6e  s */.  int tabTn
04a0: 63 74 3b 20 20 20 20 2f 2a 20 45 70 68 65 6d 65  ct;    /* Epheme
04b0: 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20 66  ral table used f
04c0: 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63  or DISTINCT proc
04d0: 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  essing */.  int 
04e0: 61 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a 20 41  addrTnct;   /* A
04f0: 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65  ddress of OP_Ope
0500: 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f 64  nEphemeral opcod
0510: 65 20 66 6f 72 20 74 61 62 54 6e 63 74 20 2a 2f  e for tabTnct */
0520: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
0530: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
0540: 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20 69  llowing object i
0550: 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72 64  s used to record
0560: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
0570: 75 74 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  ut.** the ORDER 
0580: 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29  BY (or GROUP BY)
0590: 20 63 6c 61 75 73 65 20 6f 66 20 71 75 65 72 79   clause of query
05a0: 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64 2e   is being coded.
05b0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
05c0: 63 74 20 53 6f 72 74 43 74 78 20 53 6f 72 74 43  ct SortCtx SortC
05d0: 74 78 3b 0a 73 74 72 75 63 74 20 53 6f 72 74 43  tx;.struct SortC
05e0: 74 78 20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  tx {.  ExprList 
05f0: 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20  *pOrderBy;   /* 
0600: 54 68 65 20 4f 52 44 45 52 20 42 59 20 28 6f 72  The ORDER BY (or
0610: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
0620: 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61  ) */.  int nOBSa
0630: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
0640: 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20  Number of ORDER 
0650: 42 59 20 74 65 72 6d 73 20 73 61 74 69 73 66 69  BY terms satisfi
0660: 65 64 20 62 79 20 69 6e 64 69 63 65 73 20 2a 2f  ed by indices */
0670: 0a 20 20 69 6e 74 20 69 45 43 75 72 73 6f 72 3b  .  int iECursor;
0680: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
0690: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
06a0: 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e  e sorter */.  in
06b0: 74 20 72 65 67 52 65 74 75 72 6e 3b 20 20 20 20  t regReturn;    
06c0: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
06d0: 68 6f 6c 64 69 6e 67 20 62 6c 6f 63 6b 2d 6f 75  holding block-ou
06e0: 74 70 75 74 20 72 65 74 75 72 6e 20 61 64 64 72  tput return addr
06f0: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  ess */.  int lab
0700: 65 6c 42 6b 4f 75 74 3b 20 20 20 20 20 20 20 2f  elBkOut;       /
0710: 2a 20 53 74 61 72 74 20 6c 61 62 65 6c 20 66 6f  * Start label fo
0720: 72 20 74 68 65 20 62 6c 6f 63 6b 2d 6f 75 74 70  r the block-outp
0730: 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ut subroutine */
0740: 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 49  .  int addrSortI
0750: 6e 64 65 78 3b 20 20 20 20 2f 2a 20 41 64 64 72  ndex;    /* Addr
0760: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 53 6f  ess of the OP_So
0770: 72 74 65 72 4f 70 65 6e 20 6f 72 20 4f 50 5f 4f  rterOpen or OP_O
0780: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a 2f 0a  penEphemeral */.
0790: 20 20 69 6e 74 20 6c 61 62 65 6c 44 6f 6e 65 3b    int labelDone;
07a0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
07b0: 68 65 72 65 20 77 68 65 6e 20 64 6f 6e 65 2c 20  here when done, 
07c0: 65 78 3a 20 4c 49 4d 49 54 20 72 65 61 63 68 65  ex: LIMIT reache
07d0: 64 20 2a 2f 0a 20 20 75 38 20 73 6f 72 74 46 6c  d */.  u8 sortFl
07e0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ags;         /* 
07f0: 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53 4f 52  Zero or more SOR
0800: 54 46 4c 41 47 5f 2a 20 62 69 74 73 20 2a 2f 0a  TFLAG_* bits */.
0810: 20 20 75 38 20 62 4f 72 64 65 72 65 64 49 6e 6e    u8 bOrderedInn
0820: 65 72 4c 6f 6f 70 3b 20 2f 2a 20 4f 52 44 45 52  erLoop; /* ORDER
0830: 20 42 59 20 63 6f 72 72 65 63 74 6c 79 20 73 6f   BY correctly so
0840: 72 74 73 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f  rts the inner lo
0850: 6f 70 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65  op */.};.#define
0860: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
0870: 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a 20 55  ter  0x01   /* U
0880: 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e  se SorterOpen in
0890: 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45 70 68  stead of OpenEph
08a0: 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  emeral */../*.**
08b0: 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20   Delete all the 
08c0: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c  content of a Sel
08d0: 65 63 74 20 73 74 72 75 63 74 75 72 65 2e 20 20  ect structure.  
08e0: 44 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  Deallocate the s
08f0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65  tructure.** itse
0900: 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46 72 65 65  lf only if bFree
0910: 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
0920: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0930: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0940: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
0950: 20 62 46 72 65 65 29 7b 0a 20 20 77 68 69 6c 65   bFree){.  while
0960: 28 20 70 20 29 7b 0a 20 20 20 20 53 65 6c 65 63  ( p ){.    Selec
0970: 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
0980: 50 72 69 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74  Prior;.    sqlit
0990: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
09a0: 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  (db, p->pEList);
09b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
09c0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
09d0: 3e 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69  >pSrc);.    sqli
09e0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
09f0: 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  , p->pWhere);.  
0a00: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0a10: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
0a20: 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71  GroupBy);.    sq
0a30: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0a40: 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  db, p->pHaving);
0a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0a60: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0a70: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
0a80: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
0a90: 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
0aa0: 29 3b 0a 20 20 20 20 69 66 28 20 4f 4b 5f 49 46  );.    if( OK_IF
0ab0: 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70 2d 3e  _ALWAYS_TRUE(p->
0ac0: 70 57 69 74 68 29 20 29 20 73 71 6c 69 74 65 33  pWith) ) sqlite3
0ad0: 57 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20 70  WithDelete(db, p
0ae0: 2d 3e 70 57 69 74 68 29 3b 0a 20 20 20 20 69 66  ->pWith);.    if
0af0: 28 20 62 46 72 65 65 20 29 20 73 71 6c 69 74 65  ( bFree ) sqlite
0b00: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29  3DbFreeNN(db, p)
0b10: 3b 0a 20 20 20 20 70 20 3d 20 70 50 72 69 6f 72  ;.    p = pPrior
0b20: 3b 0a 20 20 20 20 62 46 72 65 65 20 3d 20 31 3b  ;.    bFree = 1;
0b30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
0b40: 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63  itialize a Selec
0b50: 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e  tDest structure.
0b60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0b70: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53  SelectDestInit(S
0b80: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
0b90: 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74  , int eDest, int
0ba0: 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74   iParm){.  pDest
0bb0: 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29 65 44  ->eDest = (u8)eD
0bc0: 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53  est;.  pDest->iS
0bd0: 44 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20  DParm = iParm;. 
0be0: 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74   pDest->zAffSdst
0bf0: 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69   = 0;.  pDest->i
0c00: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
0c10: 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a  t->nSdst = 0;.}.
0c20: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
0c30: 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74   a new Select st
0c40: 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75  ructure and retu
0c50: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
0c60: 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72  that.** structur
0c70: 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71  e..*/.Select *sq
0c80: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a  lite3SelectNew(.
0c90: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
0ca0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
0cb0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
0cc0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
0cd0: 2c 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63  ,     /* which c
0ce0: 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64  olumns to includ
0cf0: 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  e in the result 
0d00: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
0d10: 72 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  rc,        /* th
0d20: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d  e FROM clause --
0d30: 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f   which tables to
0d40: 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20   scan */.  Expr 
0d50: 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
0d60: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
0d70: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
0d80: 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20  st *pGroupBy,   
0d90: 2f 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  /* the GROUP BY 
0da0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
0db0: 20 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20   *pHaving,      
0dc0: 20 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20    /* the HAVING 
0dd0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
0de0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
0df0: 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42    /* the ORDER B
0e00: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 33  Y clause */.  u3
0e10: 32 20 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20  2 selFlags,     
0e20: 20 20 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61      /* Flag para
0e30: 6d 65 74 65 72 73 2c 20 73 75 63 68 20 61 73 20  meters, such as 
0e40: 53 46 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20  SF_Distinct */. 
0e50: 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 20 20   Expr *pLimit   
0e60: 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20         /* LIMIT 
0e70: 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61  value.  NULL mea
0e80: 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 29  ns not used */.)
0e90: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
0ea0: 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64  ;.  Select stand
0eb0: 69 6e 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  in;.  pNew = sql
0ec0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
0ed0: 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  N(pParse->db, si
0ee0: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
0ef0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
0f00: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
0f10: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
0f20: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
0f30: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d   = &standin;.  }
0f40: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
0f50: 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d   ){.    pEList =
0f60: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0f70: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
0f80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fa0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
0fb0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 54 4b 5f 41  (pParse->db,TK_A
0fc0: 53 54 45 52 49 53 4b 2c 30 29 29 3b 0a 20 20 7d  STERISK,0));.  }
0fd0: 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20  .  pNew->pEList 
0fe0: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77  = pEList;.  pNew
0ff0: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
1000: 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61  ;.  pNew->selFla
1010: 67 73 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20  gs = selFlags;. 
1020: 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20   pNew->iLimit = 
1030: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  0;.  pNew->iOffs
1040: 65 74 20 3d 20 30 3b 0a 23 69 66 20 53 45 4c 45  et = 0;.#if SELE
1050: 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
1060: 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65    pNew->zSelName
1070: 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  [0] = 0;.#endif.
1080: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
1090: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
10a0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
10b0: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
10c0: 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d  ew->nSelectRow =
10d0: 20 30 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d   0;.  if( pSrc==
10e0: 30 20 29 20 70 53 72 63 20 3d 20 73 71 6c 69 74  0 ) pSrc = sqlit
10f0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
1100: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
1110: 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65  f(*pSrc));.  pNe
1120: 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  w->pSrc = pSrc;.
1130: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
1140: 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d   pWhere;.  pNew-
1150: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
1160: 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  upBy;.  pNew->pH
1170: 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b  aving = pHaving;
1180: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
1190: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
11a0: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30  pNew->pPrior = 0
11b0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
11c0: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  = 0;.  pNew->pLi
11d0: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
11e0: 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 30 3b  pNew->pWith = 0;
11f0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
1200: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1210: 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c  ) {.    clearSel
1220: 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ect(pParse->db, 
1230: 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26 73 74 61  pNew, pNew!=&sta
1240: 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e 65 77 20  ndin);.    pNew 
1250: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1260: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
1270: 70 53 72 63 21 3d 30 20 7c 7c 20 70 50 61 72 73  pSrc!=0 || pPars
1280: 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20 20 7d  e->nErr>0 );.  }
1290: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 21  .  assert( pNew!
12a0: 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a 20 20 72  =&standin );.  r
12b0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 23  eturn pNew;.}..#
12c0: 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
12d0: 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 53 65 74  NABLED./*.** Set
12e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 53   the name of a S
12f0: 65 6c 65 63 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a  elect object.*/.
1300: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
1310: 63 74 53 65 74 4e 61 6d 65 28 53 65 6c 65 63 74  ctSetName(Select
1320: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
1330: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 70  *zName){.  if( p
1340: 20 26 26 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20   && zName ){.   
1350: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1360: 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a 53 65 6c  f(sizeof(p->zSel
1370: 4e 61 6d 65 29 2c 20 70 2d 3e 7a 53 65 6c 4e 61  Name), p->zSelNa
1380: 6d 65 2c 20 22 25 73 22 2c 20 7a 4e 61 6d 65 29  me, "%s", zName)
1390: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
13a0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
13b0: 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20 73  e given Select s
13c0: 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c  tructure and all
13d0: 20 6f 66 20 69 74 73 20 73 75 62 73 74 72 75 63   of its substruc
13e0: 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tures..*/.void s
13f0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
1400: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
1410: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66  Select *p){.  if
1420: 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54  ( OK_IF_ALWAYS_T
1430: 52 55 45 28 70 29 20 29 20 63 6c 65 61 72 53 65  RUE(p) ) clearSe
1440: 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29 3b 0a  lect(db, p, 1);.
1450: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1460: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1470: 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
1480: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
1490: 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73  a compound..*/.s
14a0: 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66 69  tatic Select *fi
14b0: 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c 65  ndRightmost(Sele
14c0: 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28  ct *p){.  while(
14d0: 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d 20   p->pNext ) p = 
14e0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74 75  p->pNext;.  retu
14f0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
1500: 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e  iven 1 to 3 iden
1510: 74 69 66 69 65 72 73 20 70 72 65 63 65 64 69 6e  tifiers precedin
1520: 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f  g the JOIN keywo
1530: 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68  rd, determine th
1540: 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69  e.** type of joi
1550: 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
1560: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74  teger constant t
1570: 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68  hat expresses th
1580: 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65  at type.** in te
1590: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  rms of the follo
15a0: 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a  wing bit values:
15b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e  .**.**     JT_IN
15c0: 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52  NER.**     JT_CR
15d0: 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55  OSS.**     JT_OU
15e0: 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41  TER.**     JT_NA
15f0: 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f  TURAL.**     JT_
1600: 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52  LEFT.**     JT_R
1610: 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c  IGHT.**.** A ful
1620: 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20  l outer join is 
1630: 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  the combination 
1640: 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a  of JT_LEFT and J
1650: 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49  T_RIGHT..**.** I
1660: 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20  f an illegal or 
1670: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
1680: 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74   type is seen, t
1690: 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  hen still return
16a0: 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c  .** a join type,
16b0: 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f   but put an erro
16c0: 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  r in the pParse 
16d0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
16e0: 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70  t sqlite3JoinTyp
16f0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1700: 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65   Token *pA, Toke
1710: 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43  n *pB, Token *pC
1720: 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70  ){.  int jointyp
1730: 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a  e = 0;.  Token *
1740: 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65  apAll[3];.  Toke
1750: 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20  n *p;.          
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37     /*   01234567
1780: 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
1790: 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20  456789 123 */.  
17a0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
17b0: 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22  r zKeyText[] = "
17c0: 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69  naturaleftouteri
17d0: 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73  ghtfullinnercros
17e0: 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  s";.  static con
17f0: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
1800: 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20  u8 i;        /* 
1810: 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79  Beginning of key
1820: 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65  word text in zKe
1830: 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75  yText[] */.    u
1840: 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c  8 nChar;    /* L
1850: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79  ength of the key
1860: 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74 65  word in characte
1870: 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64  rs */.    u8 cod
1880: 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74  e;     /* Join t
1890: 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20  ype mask */.  } 
18a0: 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20  aKeyword[] = {. 
18b0: 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f     /* natural */
18c0: 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54   { 0,  7, JT_NAT
18d0: 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20 20  URAL            
18e0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65      },.    /* le
18f0: 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34  ft    */ { 6,  4
1900: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
1910: 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ER          },. 
1920: 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f     /* outer   */
1930: 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54   { 10, 5, JT_OUT
1940: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1950: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69      },.    /* ri
1960: 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35  ght   */ { 14, 5
1970: 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  , JT_RIGHT|JT_OU
1980: 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  TER         },. 
1990: 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f     /* full    */
19a0: 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46   { 19, 4, JT_LEF
19b0: 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  T|JT_RIGHT|JT_OU
19c0: 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e  TER },.    /* in
19d0: 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35  ner   */ { 23, 5
19e0: 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20  , JT_INNER      
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1a00: 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f     /* cross   */
1a10: 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 28, 5, JT_INN
1a20: 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20  ER|JT_CROSS     
1a30: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e      },.  };.  in
1a40: 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b  t i, j;.  apAll[
1a50: 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c  0] = pA;.  apAll
1a60: 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c  [1] = pB;.  apAl
1a70: 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72  l[2] = pC;.  for
1a80: 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41  (i=0; i<3 && apA
1a90: 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll[i]; i++){.   
1aa0: 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20   p = apAll[i];. 
1ab0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72     for(j=0; j<Ar
1ac0: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
1ad0: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); j++){.      i
1ae0: 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72  f( p->n==aKeywor
1af0: 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20  d[j].nChar .    
1b00: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
1b10: 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
1b20: 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b  p->z, &zKeyText[
1b30: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20  aKeyword[j].i], 
1b40: 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p->n)==0 ){.    
1b50: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
1b60: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65  aKeyword[j].code
1b70: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1b80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b90: 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
1ba0: 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d  0 || j==1 || j==
1bb0: 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d  2 || j==3 || j==
1bc0: 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d  4 || j==5 || j==
1bd0: 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d  6 );.    if( j>=
1be0: 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f  ArraySize(aKeywo
1bf0: 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69  rd) ){.      joi
1c00: 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f  ntype |= JT_ERRO
1c10: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
1c20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a      }.  }.  if(.
1c30: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
1c40: 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55   (JT_INNER|JT_OU
1c50: 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52  TER))==(JT_INNER
1c60: 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20  |JT_OUTER) ||.  
1c70: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a     (jointype & J
1c80: 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b  T_ERROR)!=0.  ){
1c90: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1ca0: 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20  *zSp = " ";.    
1cb0: 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b  assert( pB!=0 );
1cc0: 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29  .    if( pC==0 )
1cd0: 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73  { zSp++; }.    s
1ce0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1cf0: 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
1d00: 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a  or unsupported j
1d10: 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20  oin type: ".    
1d20: 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c 20     "%T %T%s%T", 
1d30: 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29  pA, pB, zSp, pC)
1d40: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
1d50: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c   JT_INNER;.  }el
1d60: 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65  se if( (jointype
1d70: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
1d80: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f  .         && (jo
1d90: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
1da0: 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54  T|JT_RIGHT))!=JT
1db0: 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c  _LEFT ){.    sql
1dc0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1dd0: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47  rse, .      "RIG
1de0: 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45  HT and FULL OUTE
1df0: 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20  R JOINs are not 
1e00: 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72  currently suppor
1e10: 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74  ted");.    joint
1e20: 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a  ype = JT_INNER;.
1e30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69    }.  return joi
1e40: 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ntype;.}../*.** 
1e50: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1e60: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   of a column in 
1e70: 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  a table.  Return
1e80: 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d   -1 if the colum
1e90: 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74  n.** is not cont
1ea0: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62  ained in the tab
1eb0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1ec0: 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61  t columnIndex(Ta
1ed0: 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74  ble *pTab, const
1ee0: 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20   char *zCol){.  
1ef0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1f00: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
1f10: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
1f20: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61  lite3StrICmp(pTa
1f30: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  b->aCol[i].zName
1f40: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74  , zCol)==0 ) ret
1f50: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
1f60: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
1f70: 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72 73   Search the firs
1f80: 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53  t N tables in pS
1f90: 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  rc, from left to
1fa0: 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20   right, looking 
1fb0: 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74  for a.** table t
1fc0: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e  hat has a column
1fd0: 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a   named zCol.  .*
1fe0: 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c  *.** When found,
1ff0: 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20   set *piTab and 
2000: 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61  *piCol to the ta
2010: 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f  ble index and co
2020: 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66  lumn index.** of
2030: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f   the matching co
2040: 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20  lumn and return 
2050: 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  TRUE..**.** If n
2060: 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  ot found, return
2070: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
2080: 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f  c int tableAndCo
2090: 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63  lumnIndex(.  Src
20a0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
20b0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61    /* Array of ta
20c0: 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a  bles to search *
20d0: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
20e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
20f0: 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
2100: 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61  pSrc->a[] to sea
2110: 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  rch */.  const c
2120: 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a  har *zCol,    /*
2130: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
2140: 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  umn we are looki
2150: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ng for */.  int 
2160: 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  *piTab,         
2170: 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20   /* Write index 
2180: 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72  of pSrc->a[] her
2190: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f  e */.  int *piCo
21a0: 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l           /* W
21b0: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
21c0: 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54  rc->a[*piTab].pT
21d0: 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20  ab->aCol[] here 
21e0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2200: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
2210: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20   tables in pSrc 
2220: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
2230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2240: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74  ex of column mat
2250: 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20  ching zCol */.. 
2260: 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62 3d   assert( (piTab=
2270: 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20  =0)==(piCol==0) 
2280: 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e  );  /* Both or n
2290: 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20  either are NULL 
22a0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
22b0: 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f  N; i++){.    iCo
22c0: 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  l = columnIndex(
22d0: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c  pSrc->a[i].pTab,
22e0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20   zCol);.    if( 
22f0: 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
2300: 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20   if( piTab ){.  
2310: 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69        *piTab = i
2320: 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c  ;.        *piCol
2330: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d   = iCol;.      }
2340: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2350: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2360: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2370: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2380: 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65 72   used to add ter
2390: 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f  ms implied by JO
23a0: 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65  IN syntax to the
23b0: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
23c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61   expression of a
23d0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
23e0: 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c  t. The new term,
23f0: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44   which.** is AND
2400: 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69 73  ed with the exis
2410: 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73  ting WHERE claus
2420: 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  e, is of the for
2430: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62  m:.**.**    (tab
2440: 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f  1.col1 = tab2.co
2450: 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  l2).**.** where 
2460: 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72 63  tab1 is the iSrc
2470: 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63  'th table in Src
2480: 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74 61  List pSrc and ta
2490: 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69  b2 is the .** (i
24a0: 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d  Src+1)'th. Colum
24b0: 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e  n col1 is column
24c0: 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62   iColLeft of tab
24d0: 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a  1, and col2 is.*
24e0: 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67  * column iColRig
24f0: 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73  ht of tab2..*/.s
2500: 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68  tatic void addWh
2510: 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ereTerm(.  Parse
2520: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2540: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
2550: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
2560: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2570: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
2580: 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61  bles in FROM cla
2590: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  use */.  int iLe
25a0: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
25b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
25c0: 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65  x of first table
25d0: 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63   to join in pSrc
25e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65   */.  int iColLe
25f0: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
2600: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2610: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73  f column in firs
2620: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
2630: 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20 20   iRight,        
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2650: 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20  Index of second 
2660: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f  table in pSrc */
2670: 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74  .  int iColRight
2680: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2690: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
26a0: 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20  olumn in second 
26b0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
26c0: 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20  sOuterJoin,     
26d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
26e0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
26f0: 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20   OUTER join */. 
2700: 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20   Expr **ppWhere 
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2720: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20   /* IN/OUT: The 
2730: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
2740: 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  add to */.){.  s
2750: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
2760: 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
2770: 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45  *pE1;.  Expr *pE
2780: 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a  2;.  Expr *pEq;.
2790: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66 74  .  assert( iLeft
27a0: 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  <iRight );.  ass
27b0: 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e  ert( pSrc->nSrc>
27c0: 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65  iRight );.  asse
27d0: 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66  rt( pSrc->a[iLef
27e0: 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73  t].pTab );.  ass
27f0: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69  ert( pSrc->a[iRi
2800: 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20  ght].pTab );..  
2810: 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65  pE1 = sqlite3Cre
2820: 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62  ateColumnExpr(db
2830: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
2840: 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20  ColLeft);.  pE2 
2850: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43  = sqlite3CreateC
2860: 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53  olumnExpr(db, pS
2870: 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c  rc, iRight, iCol
2880: 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d  Right);..  pEq =
2890: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
28a0: 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31  arse, TK_EQ, pE1
28b0: 2c 20 70 45 32 29 3b 0a 20 20 69 66 28 20 70 45  , pE2);.  if( pE
28c0: 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e  q && isOuterJoin
28d0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
28e0: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
28f0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61  FromJoin);.    a
2900: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2910: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
2920: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
2930: 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70  uced) );.    Exp
2940: 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
2950: 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  pEq, EP_NoReduce
2960: 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69 67  );.    pEq->iRig
2970: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69  htJoinTable = (i
2980: 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a  16)pE2->iTable;.
2990: 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20 3d    }.  *ppWhere =
29a0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
29b0: 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70 45  db, *ppWhere, pE
29c0: 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  q);.}../*.** Set
29d0: 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   the EP_FromJoin
29e0: 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c   property on all
29f0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69   terms of the gi
2a00: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ven expression..
2a10: 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20 45  ** And set the E
2a20: 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61  xpr.iRightJoinTa
2a30: 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f  ble to iTable fo
2a40: 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  r every term in 
2a50: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
2a60: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f  n..**.** The EP_
2a70: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
2a80: 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72  y is used on ter
2a90: 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  ms of an express
2aa0: 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74  ion to tell.** t
2ab0: 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  he LEFT OUTER JO
2ac0: 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  IN processing lo
2ad0: 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65  gic that this te
2ae0: 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  rm is part of th
2af0: 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69  e.** join restri
2b00: 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20  ction specified 
2b10: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
2b20: 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f  NG clause and no
2b30: 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74  t a part.** of t
2b40: 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20  he more general 
2b50: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54  WHERE clause.  T
2b60: 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d  hese terms are m
2b70: 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65  oved over to the
2b80: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
2b90: 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f   during join pro
2ba0: 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e  cessing but we n
2bb0: 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
2bc0: 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69  that they.** ori
2bd0: 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f  ginated in the O
2be0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2bf0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70  e..**.** The Exp
2c00: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
2c10: 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52  e tells the WHER
2c20: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
2c30: 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ing that the.** 
2c40: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e  expression depen
2c50: 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67  ds on table iRig
2c60: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e  htJoinTable even
2c70: 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20 69   if that table i
2c80: 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69  s not.** explici
2c90: 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e  tly mentioned in
2ca0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
2cb0: 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69    That informati
2cc0: 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20  on is needed.** 
2cd0: 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74  for cases like t
2ce0: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  his:.**.**    SE
2cf0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
2d00: 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
2d10: 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e  1.a=t2.b AND t1.
2d20: 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68  x=5.**.** The wh
2d30: 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73  ere clause needs
2d40: 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68 61   to defer the ha
2d50: 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31  ndling of the t1
2d60: 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74  .x=5.** term unt
2d70: 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32 20  il after the t2 
2d80: 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e  loop of the join
2d90: 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20  .  In that way, 
2da0: 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77  a.** NULL t2 row
2db0: 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65   will be inserte
2dc0: 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21  d whenever t1.x!
2dd0: 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f  =5.  If we do no
2de0: 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68  t.** defer the h
2df0: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d  andling of t1.x=
2e00: 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72  5, it will be pr
2e10: 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74  ocessed immediat
2e20: 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65  ely.** after the
2e30: 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77   t1 loop and row
2e40: 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77  s with t1.x!=5 w
2e50: 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72  ill never appear
2e60: 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75   in.** the outpu
2e70: 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f  t, which is inco
2e80: 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrect..*/.static
2e90: 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70   void setJoinExp
2ea0: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  r(Expr *p, int i
2eb0: 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28  Table){.  while(
2ec0: 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65   p ){.    ExprSe
2ed0: 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  tProperty(p, EP_
2ee0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61  FromJoin);.    a
2ef0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2f00: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
2f10: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
2f20: 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53  ed) );.    ExprS
2f30: 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 2c  etVVAProperty(p,
2f40: 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
2f50: 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e     p->iRightJoin
2f60: 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61  Table = (i16)iTa
2f70: 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ble;.    if( p->
2f80: 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
2f90: 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  && p->x.pList ){
2fa0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
2fb0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2fc0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
2fd0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2fe0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78  setJoinExpr(p->x
2ff0: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
3000: 70 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr, iTable);.   
3010: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
3020: 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c  etJoinExpr(p->pL
3030: 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20  eft, iTable);.  
3040: 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b    p = p->pRight;
3050: 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 20 55 6e 64 6f  .  } .}../* Undo
3060: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 73 65 74   the work of set
3070: 4a 6f 69 6e 45 78 70 72 28 29 2e 20 20 49 6e 20  JoinExpr().  In 
3080: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
3090: 72 65 65 20 70 2c 20 63 6f 6e 76 65 72 74 20 65  ree p, convert e
30a0: 76 65 72 79 0a 2a 2a 20 74 65 72 6d 20 74 68 61  very.** term tha
30b0: 74 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  t is marked with
30c0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 61 6e 64   EP_FromJoin and
30d0: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
30e0: 3d 3d 69 54 61 62 6c 65 20 69 6e 74 6f 0a 2a 2a  ==iTable into.**
30f0: 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 65 72   an ordinary ter
3100: 6d 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65  m that omits the
3110: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 6d 61 72   EP_FromJoin mar
3120: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 68 61  k..**.** This ha
3130: 70 70 65 6e 73 20 77 68 65 6e 20 61 20 4c 45 46  ppens when a LEF
3140: 54 20 4a 4f 49 4e 20 69 73 20 73 69 6d 70 6c 69  T JOIN is simpli
3150: 66 69 65 64 20 69 6e 74 6f 20 61 6e 20 6f 72 64  fied into an ord
3160: 69 6e 61 72 79 20 4a 4f 49 4e 2e 0a 2a 2f 0a 73  inary JOIN..*/.s
3170: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 73 65 74  tatic void unset
3180: 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70  JoinExpr(Expr *p
3190: 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20  , int iTable){. 
31a0: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
31b0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
31c0: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
31d0: 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 28 69 54  oin).     && (iT
31e0: 61 62 6c 65 3c 30 20 7c 7c 20 70 2d 3e 69 52 69  able<0 || p->iRi
31f0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54  ghtJoinTable==iT
3200: 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 45  able) ){.      E
3210: 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79  xprClearProperty
3220: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
3230: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3240: 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  p->op==TK_FUNCTI
3250: 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74  ON && p->x.pList
3260: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
3270: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
3280: 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  i<p->x.pList->nE
3290: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
32a0: 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72     unsetJoinExpr
32b0: 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69  (p->x.pList->a[i
32c0: 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 29  ].pExpr, iTable)
32d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
32e0: 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70      unsetJoinExp
32f0: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  r(p->pLeft, iTab
3300: 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  le);.    p = p->
3310: 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a  pRight;.  } .}..
3320: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3330: 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65  ne processes the
3340: 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f   join informatio
3350: 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73  n for a SELECT s
3360: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20  tatement..** ON 
3370: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
3380: 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  s are converted 
3390: 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73  into extra terms
33a0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
33b0: 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c  ause..** NATURAL
33c0: 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61   joins also crea
33d0: 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63  te extra WHERE c
33e0: 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a  lause terms..**.
33f0: 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20  ** The terms of 
3400: 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72  a FROM clause ar
3410: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
3420: 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73  he Select.pSrc s
3430: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65  tructure..** The
3440: 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65   left most table
3450: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e   is the first en
3460: 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53  try in Select.pS
3470: 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d  rc.  The right-m
3480: 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  ost.** table is 
3490: 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20  the last entry. 
34a0: 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   The join operat
34b0: 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68  or is held in th
34c0: 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68  e entry to.** th
34d0: 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e  e left.  Thus en
34e0: 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74  try 0 contains t
34f0: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
3500: 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65   for the join be
3510: 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73  tween.** entries
3520: 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f   0 and 1.  Any O
3530: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
3540: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
3550: 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a  th the join are.
3560: 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64  ** also attached
3570: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74   to the left ent
3580: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
3590: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
35a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
35b0: 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  ors encountered.
35c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
35d0: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
35e0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
35f0: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72  Select *p){.  Sr
3600: 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3620: 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74   All tables in t
3630: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
3640: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
3650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3660: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
3670: 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ters */.  struct
3680: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
3690: 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66  Left;     /* Lef
36a0: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
36b0: 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ined */.  struct
36c0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
36d0: 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67  Right;    /* Rig
36e0: 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ht table being j
36f0: 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63  oined */..  pSrc
3700: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c   = p->pSrc;.  pL
3710: 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30  eft = &pSrc->a[0
3720: 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70  ];.  pRight = &p
3730: 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69  Left[1];.  for(i
3740: 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
3750: 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b  -1; i++, pRight+
3760: 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20  +, pLeft++){.   
3770: 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54 61   Table *pRightTa
3780: 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61 62  b = pRight->pTab
3790: 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74 65  ;.    int isOute
37a0: 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56 45  r;..    if( NEVE
37b0: 52 28 70 4c 65 66 74 2d 3e 70 54 61 62 3d 3d 30  R(pLeft->pTab==0
37c0: 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30   || pRightTab==0
37d0: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
37e0: 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69    isOuter = (pRi
37f0: 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  ght->fg.jointype
3800: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b   & JT_OUTER)!=0;
3810: 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68  ..    /* When th
3820: 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
3830: 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64  d is present, ad
3840: 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  d WHERE clause t
3850: 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20  erms for.    ** 
3860: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61  every column tha
3870: 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  t the two tables
3880: 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e   have in common.
3890: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
38a0: 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74  pRight->fg.joint
38b0: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
38c0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52   ){.      if( pR
38d0: 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69  ight->pOn || pRi
38e0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
38f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3900: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3910: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d  a NATURAL join m
3920: 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20  ay not have ".  
3930: 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20           "an ON 
3940: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22  or USING clause"
3950: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 0);.        re
3960: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
3970: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
3980: 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c  <pRightTab->nCol
3990: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
39a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f  char *zName;   /
39b0: 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e  * Name of column
39c0: 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 74 61   in the right ta
39d0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ble */.        i
39e0: 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a  nt iLeft;     /*
39f0: 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74   Matching left t
3a00: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
3a10: 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f  int iLeftCol;  /
3a20: 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  * Matching colum
3a30: 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61  n in the left ta
3a40: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ble */..        
3a50: 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61  zName = pRightTa
3a60: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
3a70: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 61  ;.        if( ta
3a80: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
3a90: 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61  x(pSrc, i+1, zNa
3aa0: 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65  me, &iLeft, &iLe
3ab0: 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  ftCol) ){.      
3ac0: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
3ad0: 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69  (pParse, pSrc, i
3ae0: 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20  Left, iLeftCol, 
3af0: 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20  i+1, j,.        
3b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
3b10: 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65  sOuter, &p->pWhe
3b20: 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  re);.        }. 
3b30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
3b40: 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f    /* Disallow bo
3b50: 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  th ON and USING 
3b60: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
3b70: 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a  ame join.    */.
3b80: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
3b90: 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70  pOn && pRight->p
3ba0: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  Using ){.      s
3bb0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3bc0: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68  Parse, "cannot h
3bd0: 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  ave both ON and 
3be0: 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20  USING ".        
3bf0: 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20  "clauses in the 
3c00: 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20  same join");.   
3c10: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3c20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74   }..    /* Add t
3c30: 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20  he ON clause to 
3c40: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
3c50: 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e  HERE clause, con
3c60: 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a  nected by.    **
3c70: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
3c80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
3c90: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a   pRight->pOn ){.
3ca0: 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74 65        if( isOute
3cb0: 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  r ) setJoinExpr(
3cc0: 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69  pRight->pOn, pRi
3cd0: 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  ght->iCursor);. 
3ce0: 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d       p->pWhere =
3cf0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
3d00: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
3d10: 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70  Where, pRight->p
3d20: 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68  On);.      pRigh
3d30: 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20  t->pOn = 0;.    
3d40: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
3d50: 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20   extra terms on 
3d60: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3d70: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
3d80: 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e   named.    ** in
3d90: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
3da0: 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20  e.  Example: If 
3db0: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74  the two tables t
3dc0: 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20  o be joined are 
3dd0: 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20  .    ** A and B 
3de0: 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c  and the USING cl
3df0: 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c  ause names X, Y,
3e00: 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64   and Z, then add
3e10: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20   this.    ** to 
3e20: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3e30: 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44  :    A.X=B.X AND
3e40: 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a   A.Y=B.Y AND A.Z
3e50: 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f  =B.Z.    ** Repo
3e60: 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61  rt an error if a
3e70: 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f  ny column mentio
3e80: 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47  ned in the USING
3e90: 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a   clause is.    *
3ea0: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  * not contained 
3eb0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74  in both tables t
3ec0: 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20  o be joined..   
3ed0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
3ee0: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
3ef0: 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73      IdList *pLis
3f00: 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69  t = pRight->pUsi
3f10: 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ng;.      for(j=
3f20: 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; j<pList->nId;
3f30: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
3f40: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
3f50: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
3f60: 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47  erm in the USING
3f70: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
3f80: 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20     int iLeft;   
3f90: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20      /* Table on 
3fa0: 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61  the left with ma
3fb0: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61  tching column na
3fc0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  me */.        in
3fd0: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f  t iLeftCol;    /
3fe0: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
3ff0: 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  of matching colu
4000: 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  mn on the left *
4010: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  /.        int iR
4020: 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f  ightCol;   /* Co
4030: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d  lumn number of m
4040: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f  atching column o
4050: 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a  n the right */..
4060: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
4070: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  pList->a[j].zNam
4080: 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67 68  e;.        iRigh
4090: 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64  tCol = columnInd
40a0: 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e  ex(pRightTab, zN
40b0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
40c0: 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20  ( iRightCol<0.  
40d0: 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65         || !table
40e0: 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
40f0: 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c  Src, i+1, zName,
4100: 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43   &iLeft, &iLeftC
4110: 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ol).        ){. 
4120: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4130: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4140: 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73   "cannot join us
4150: 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20  ing column %s - 
4160: 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20  column ".       
4170: 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e       "not presen
4180: 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  t in both tables
4190: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
41a0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
41b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
41c0: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50   addWhereTerm(pP
41d0: 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66  arse, pSrc, iLef
41e0: 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31  t, iLeftCol, i+1
41f0: 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20  , iRightCol,.   
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4210: 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70    isOuter, &p->p
4220: 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Where);.      }.
4230: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4240: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  rn 0;.}../* Forw
4250: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
4260: 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20  .static KeyInfo 
4270: 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  *keyInfoFromExpr
4280: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
4290: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
42a0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
42b0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
42c0: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72  List,     /* For
42d0: 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62  m the KeyInfo ob
42e0: 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45  ject from this E
42f0: 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  xprList */.  int
4300: 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20 20   iStart,        
4310: 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20    /* Begin with 
4320: 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70  this column of p
4330: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  List */.  int nE
4340: 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 2f  xtra           /
4350: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
4360: 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f  extra columns to
4370: 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a 0a   the end */.);..
4380: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
4390: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ode that will pu
43a0: 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  sh the record in
43b0: 20 72 65 67 69 73 74 65 72 73 20 72 65 67 44 61   registers regDa
43c0: 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65  ta.** through re
43d0: 67 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e  gData+nData-1 on
43e0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a  to the sorter..*
43f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75  /.static void pu
4400: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
4410: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4420: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
4430: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f   context */.  So
4440: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
4450: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
4460: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52  ion about the OR
4470: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
4480: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
4490: 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ct,       /* The
44a0: 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74   whole SELECT st
44b0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
44c0: 20 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20   regData,       
44d0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67      /* First reg
44e0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61  ister holding da
44f0: 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  ta to be sorted 
4500: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67  */.  int regOrig
4510: 44 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20 46  Data,       /* F
4520: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f  irst register ho
4530: 6c 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72  lding data befor
4540: 65 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20 69  e packing */.  i
4550: 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20  nt nData,       
4560: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4570: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  of elements in t
4580: 68 65 20 64 61 74 61 20 61 72 72 61 79 20 2a 2f  he data array */
4590: 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65  .  int nPrefixRe
45a0: 67 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e  g         /* No.
45b0: 20 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74 6f   of reg prior to
45c0: 20 72 65 67 44 61 74 61 20 61 76 61 69 6c 61 62   regData availab
45d0: 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b  le for use */.){
45e0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
45f0: 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4610: 20 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65      /* Stmt unde
4620: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
4630: 2f 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20 28  /.  int bSeq = (
4640: 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67  (pSort->sortFlag
4650: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
4660: 53 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69  Sorter)==0);.  i
4670: 6e 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72 74  nt nExpr = pSort
4680: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
4690: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
46a0: 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20  /* No. of ORDER 
46b0: 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e  BY terms */.  in
46c0: 74 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72 20  t nBase = nExpr 
46d0: 2b 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b 20  + bSeq + nData; 
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
46f0: 2a 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72 74  * Fields in sort
4700: 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  er record */.  i
4710: 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20  nt regBase;     
4720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4740: 2f 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72 74  /* Regs for sort
4750: 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  er record */.  i
4760: 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20 2b  nt regRecord = +
4770: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20  +pParse->nMem;  
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4790: 2f 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f 72  /* Assembled sor
47a0: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
47b0: 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f  int nOBSat = pSo
47c0: 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20  rt->nOBSat;     
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72   /* ORDER BY ter
47f0: 6d 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20  ms to skip */.  
4800: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4820: 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20     /* Opcode to 
4830: 61 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72  add sorter recor
4840: 64 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 20  d to sorter */. 
4850: 20 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20 20   int iLimit;    
4860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4870: 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f 75      /* LIMIT cou
4880: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
4890: 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53  t( bSeq==0 || bS
48a0: 65 71 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  eq==1 );.  asser
48b0: 74 28 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20 72  t( nData==1 || r
48c0: 65 67 44 61 74 61 3d 3d 72 65 67 4f 72 69 67 44  egData==regOrigD
48d0: 61 74 61 20 7c 7c 20 72 65 67 4f 72 69 67 44 61  ata || regOrigDa
48e0: 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e  ta==0 );.  if( n
48f0: 50 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20 20  PrefixReg ){.   
4900: 20 61 73 73 65 72 74 28 20 6e 50 72 65 66 69 78   assert( nPrefix
4910: 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71 20  Reg==nExpr+bSeq 
4920: 29 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d  );.    regBase =
4930: 20 72 65 67 44 61 74 61 20 2d 20 6e 45 78 70 72   regData - nExpr
4940: 20 2d 20 62 53 65 71 3b 0a 20 20 7d 65 6c 73 65   - bSeq;.  }else
4950: 7b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  {.    regBase = 
4960: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
4970: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
4980: 65 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d  em += nBase;.  }
4990: 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65  .  assert( pSele
49a0: 63 74 2d 3e 69 4f 66 66 73 65 74 3d 3d 30 20 7c  ct->iOffset==0 |
49b0: 7c 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69  | pSelect->iLimi
49c0: 74 21 3d 30 20 29 3b 0a 20 20 69 4c 69 6d 69 74  t!=0 );.  iLimit
49d0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66   = pSelect->iOff
49e0: 73 65 74 20 3f 20 70 53 65 6c 65 63 74 2d 3e 69  set ? pSelect->i
49f0: 4f 66 66 73 65 74 2b 31 20 3a 20 70 53 65 6c 65  Offset+1 : pSele
4a00: 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 70 53  ct->iLimit;.  pS
4a10: 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20 3d  ort->labelDone =
4a20: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
4a30: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 73 71 6c 69  Label(v);.  sqli
4a40: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
4a50: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ist(pParse, pSor
4a60: 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65 67  t->pOrderBy, reg
4a70: 42 61 73 65 2c 20 72 65 67 4f 72 69 67 44 61 74  Base, regOrigDat
4a80: 61 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a,.             
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
4aa0: 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 7c 20 28  ITE_ECEL_DUP | (
4ab0: 72 65 67 4f 72 69 67 44 61 74 61 3f 20 53 51 4c  regOrigData? SQL
4ac0: 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 3a 20 30  ITE_ECEL_REF : 0
4ad0: 29 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20 29  ));.  if( bSeq )
4ae0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
4af0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
4b00: 71 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69  quence, pSort->i
4b10: 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65  ECursor, regBase
4b20: 2b 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69  +nExpr);.  }.  i
4b30: 66 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 30  f( nPrefixReg==0
4b40: 20 26 26 20 6e 44 61 74 61 3e 30 20 29 7b 0a 20   && nData>0 ){. 
4b50: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
4b60: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
4b70: 65 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b  egData, regBase+
4b80: 6e 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61 74  nExpr+bSeq, nDat
4b90: 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  a);.  }.  sqlite
4ba0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4bb0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
4bc0: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
4bd0: 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 52  ase-nOBSat, regR
4be0: 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e 4f  ecord);.  if( nO
4bf0: 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e  BSat>0 ){.    in
4c00: 74 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20 20  t regPrevKey;   
4c10: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f 42  /* The first nOB
4c20: 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  Sat columns of t
4c30: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
4c40: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 46  */.    int addrF
4c50: 69 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64 72  irst;    /* Addr
4c60: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49 66  ess of the OP_If
4c70: 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  Not opcode */.  
4c80: 20 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20    int addrJmp;  
4c90: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4ca0: 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70  f the OP_Jump op
4cb0: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62 65  code */.    Vdbe
4cc0: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a  Op *pOp;      /*
4cd0: 20 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70 65   Opcode that ope
4ce0: 6e 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  ns the sorter */
4cf0: 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20  .    int nKey;  
4d00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4d10: 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79 20   of sorting key 
4d20: 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69  columns, includi
4d30: 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a  ng OP_Sequence *
4d40: 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
4d50: 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  KI;     /* Origi
4d60: 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74  nal KeyInfo on t
4d70: 68 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65 20  he sorter table 
4d80: 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72 65 76 4b  */..    regPrevK
4d90: 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ey = pParse->nMe
4da0: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
4db0: 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e  >nMem += pSort->
4dc0: 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79  nOBSat;.    nKey
4dd0: 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74   = nExpr - pSort
4de0: 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b  ->nOBSat + bSeq;
4df0: 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29 7b  .    if( bSeq ){
4e00: 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74  .      addrFirst
4e10: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4e20: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
4e30: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29  , regBase+nExpr)
4e40: 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ; .    }else{.  
4e50: 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20      addrFirst = 
4e60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4e70: 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  1(v, OP_Sequence
4e80: 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43  Test, pSort->iEC
4e90: 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
4ea0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
4eb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4ec0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
4ed0: 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b  ompare, regPrevK
4ee0: 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f  ey, regBase, pSo
4ef0: 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20  rt->nOBSat);.   
4f00: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
4f10: 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74  beGetOp(v, pSort
4f20: 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  ->addrSortIndex)
4f30: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
4f40: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
4f50: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ed ) return;.   
4f60: 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20   pOp->p2 = nKey 
4f70: 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49  + nData;.    pKI
4f80: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
4f90: 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  nfo;.    memset(
4fa0: 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  pKI->aSortOrder,
4fb0: 20 30 2c 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65   0, pKI->nKeyFie
4fc0: 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50  ld); /* Makes OP
4fd0: 5f 4a 75 6d 70 20 74 65 73 74 61 62 6c 65 20 2a  _Jump testable *
4fe0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
4ff0: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
5000: 20 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f   (char*)pKI, P4_
5010: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65  KEYINFO);.    te
5020: 73 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 41 6c  stcase( pKI->nAl
5030: 6c 46 69 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e 4b  lField > pKI->nK
5040: 65 79 46 69 65 6c 64 2b 32 20 29 3b 0a 20 20 20  eyField+2 );.   
5050: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
5060: 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
5070: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
5080: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
5090: 20 6e 4f 42 53 61 74 2c 0a 20 20 20 20 20 20 20   nOBSat,.       
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 20 20 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65      pKI->nAllFie
50d0: 6c 64 2d 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c  ld-pKI->nKeyFiel
50e0: 64 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d  d-1);.    addrJm
50f0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
5100: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
5110: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5120: 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
5130: 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20 61   addrJmp+1, 0, a
5140: 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65 43  ddrJmp+1); VdbeC
5150: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
5160: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
5170: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
5180: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
5190: 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72   pSort->regRetur
51a0: 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
51b0: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
51c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
51d0: 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65  Gosub, pSort->re
51e0: 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  gReturn, pSort->
51f0: 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20  labelBkOut);.   
5200: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5210: 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f  p1(v, OP_ResetSo
5220: 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43  rter, pSort->iEC
5230: 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ursor);.    if( 
5240: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
5250: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5260: 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69  2(v, OP_IfNot, i
5270: 4c 69 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c 61  Limit, pSort->la
5280: 62 65 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20  belDone);.      
5290: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
52a0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
52b0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
52c0: 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  , addrFirst);.  
52d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
52e0: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
52f0: 67 42 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65  gBase, regPrevKe
5300: 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  y, pSort->nOBSat
5310: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5320: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
5330: 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66  drJmp);.  }.  if
5340: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
5350: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
5360: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f  eSorter ){.    o
5370: 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  p = OP_SorterIns
5380: 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ert;.  }else{.  
5390: 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73    op = OP_IdxIns
53a0: 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ert;.  }.  sqlit
53b0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
53c0: 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45  v, op, pSort->iE
53d0: 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72  Cursor, regRecor
53e0: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
53f0: 20 20 20 20 20 20 20 20 20 20 72 65 67 42 61 73            regBas
5400: 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d  e+nOBSat, nBase-
5410: 6e 4f 42 53 61 74 29 3b 0a 20 20 69 66 28 20 69  nOBSat);.  if( i
5420: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74  Limit ){.    int
5430: 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20 72   addr;.    int r
5440: 31 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 46 69  1 = 0;.    /* Fi
5450: 6c 6c 20 74 68 65 20 73 6f 72 74 65 72 20 75 6e  ll the sorter un
5460: 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  til it contains 
5470: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 65 6e 74  LIMIT+OFFSET ent
5480: 72 69 65 73 2e 20 20 28 54 68 65 20 69 4c 69 6d  ries.  (The iLim
5490: 69 74 0a 20 20 20 20 2a 2a 20 72 65 67 69 73 74  it.    ** regist
54a0: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
54b0: 64 20 77 69 74 68 20 76 61 6c 75 65 20 6f 66 20  d with value of 
54c0: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 29 20 20  LIMIT+OFFSET.)  
54d0: 41 66 74 65 72 20 74 68 65 20 73 6f 72 74 65 72  After the sorter
54e0: 0a 20 20 20 20 2a 2a 20 66 69 6c 6c 73 20 75 70  .    ** fills up
54f0: 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 65 61  , delete the lea
5500: 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
5510: 73 6f 72 74 65 72 20 61 66 74 65 72 20 65 61 63  sorter after eac
5520: 68 20 69 6e 73 65 72 74 2e 0a 20 20 20 20 2a 2a  h insert..    **
5530: 20 54 68 75 73 20 77 65 20 6e 65 76 65 72 20 68   Thus we never h
5540: 6f 6c 64 20 6d 6f 72 65 20 74 68 61 6e 20 74 68  old more than th
5550: 65 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 72  e LIMIT+OFFSET r
5560: 6f 77 73 20 69 6e 20 6d 65 6d 6f 72 79 20 61 74  ows in memory at
5570: 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 61 64 64   once */.    add
5580: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
5590: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
55a0: 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 20  tZero, iLimit); 
55b0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
55c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
55d0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73  AddOp1(v, OP_Las
55e0: 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  t, pSort->iECurs
55f0: 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6f  or);.    if( pSo
5600: 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65  rt->bOrderedInne
5610: 72 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 72  rLoop ){.      r
5620: 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  1 = ++pParse->nM
5630: 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
5640: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5650: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 53 6f 72 74 2d  P_Column, pSort-
5660: 3e 69 45 43 75 72 73 6f 72 2c 20 6e 45 78 70 72  >iECursor, nExpr
5670: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
5680: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
5690: 71 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  q"));.    }.    
56a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
56b0: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
56c0: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29  pSort->iECursor)
56d0: 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d  ;.    if( pSort-
56e0: 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  >bOrderedInnerLo
56f0: 6f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  op ){.      /* I
5700: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
5710: 20 69 73 20 64 72 69 76 65 6e 20 62 79 20 61 6e   is driven by an
5720: 20 69 6e 64 65 78 20 73 75 63 68 20 74 68 61 74   index such that
5730: 20 76 61 6c 75 65 73 20 66 72 6f 6d 0a 20 20 20   values from.   
5740: 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 69     ** the same i
5750: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
5760: 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 72 65 20 69  inner loop are i
5770: 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20  n sorted order, 
5780: 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6d  then.      ** im
5790: 6d 65 64 69 61 74 65 6c 79 20 6a 75 6d 70 20 74  mediately jump t
57a0: 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
57b0: 74 69 6f 6e 20 6f 66 20 61 6e 20 69 6e 6e 65 72  tion of an inner
57c0: 20 6c 6f 6f 70 20 69 66 20 74 68 65 0a 20 20 20   loop if the.   
57d0: 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 72 6f 6d     ** entry from
57e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 74 65   the current ite
57f0: 72 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ration does not 
5800: 66 69 74 20 69 6e 74 6f 20 74 68 65 20 74 6f 70  fit into the top
5810: 0a 20 20 20 20 20 20 2a 2a 20 4c 49 4d 49 54 2b  .      ** LIMIT+
5820: 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 6f  OFFSET entries o
5830: 66 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f  f the sorter. */
5840: 0a 20 20 20 20 20 20 69 6e 74 20 69 42 72 6b 20  .      int iBrk 
5850: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
5860: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
5870: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5880: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
5890: 71 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  q, regBase+nExpr
58a0: 2c 20 69 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  , iBrk, r1);.   
58b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
58c0: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
58d0: 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
58e0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
58f0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5900: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
5910: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
5920: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
5930: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
5940: 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63  OFFSET.*/.static
5950: 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74   void codeOffset
5960: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
5970: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
5980: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
5990: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66   VM */.  int iOf
59a0: 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65  fset,      /* Re
59b0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
59c0: 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65  he offset counte
59d0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  r */.  int iCont
59e0: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
59f0: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
5a00: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
5a10: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66   */.){.  if( iOf
5a20: 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73 71  fset>0 ){.    sq
5a30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5a40: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66  v, OP_IfPos, iOf
5a50: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  fset, iContinue,
5a60: 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   1); VdbeCoverag
5a70: 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  e(v);.    VdbeCo
5a80: 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45  mment((v, "OFFSE
5a90: 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  T"));.  }.}../*.
5aa0: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74  ** Add code that
5ab0: 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d   will check to m
5ac0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72  ake sure the N r
5ad0: 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
5ae0: 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72  g at iMem.** for
5af0: 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74  m a distinct ent
5b00: 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73  ry.  iTab is a s
5b10: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
5b20: 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73  t holds previous
5b30: 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69  ly.** seen combi
5b40: 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e  nations of the N
5b50: 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20   values.  A new 
5b60: 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e  entry is made in
5b70: 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20   iTab.** if the 
5b80: 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73  current N values
5b90: 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20   are new..**.** 
5ba0: 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65  A jump to addrRe
5bb0: 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64  peat is made and
5bc0: 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20   the N+1 values 
5bd0: 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20  are popped from 
5be0: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20  the.** stack if 
5bf0: 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e  the top N elemen
5c00: 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69  ts are not disti
5c10: 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nct..*/.static v
5c20: 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74  oid codeDistinct
5c30: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5c40: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
5c50: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
5c60: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
5c70: 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20  .  int iTab,    
5c80: 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69        /* A sorti
5c90: 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  ng index used to
5ca0: 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e   test for distin
5cb0: 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20  ctness */.  int 
5cc0: 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f  addrRepeat,    /
5cd0: 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69  * Jump to here i
5ce0: 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a  f not distinct *
5cf0: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
5d00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5d10: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a   of elements */.
5d20: 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20    int iMem      
5d30: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c       /* First el
5d40: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  ement */.){.  Vd
5d50: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b  be *v;.  int r1;
5d60: 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ..  v = pParse->
5d70: 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71  pVdbe;.  r1 = sq
5d80: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
5d90: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
5da0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
5db0: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61  v, OP_Found, iTa
5dc0: 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69  b, addrRepeat, i
5dd0: 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76  Mem, N); VdbeCov
5de0: 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
5df0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5e00: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
5e10: 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20  iMem, N, r1);.  
5e20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5e30: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
5e40: 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 2c 20  sert, iTab, r1, 
5e50: 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69  iMem, N);.  sqli
5e60: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
5e70: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
5e80: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69  KRESULT);.  sqli
5e90: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5ea0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
5eb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5ec0: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
5ed0: 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  he code for the 
5ee0: 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e  inside of the in
5ef0: 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61  ner loop.** of a
5f00: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49   SELECT..**.** I
5f10: 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67 61  f srcTab is nega
5f20: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70  tive, then the p
5f30: 2d 3e 70 45 4c 69 73 74 20 65 78 70 72 65 73 73  ->pEList express
5f40: 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c  ions.** are eval
5f50: 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  uated in order t
5f60: 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66  o get the data f
5f70: 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66  or this row.  If
5f80: 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65   srcTab is.** ze
5f90: 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e  ro or more, then
5fa0: 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20   data is pulled 
5fb0: 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20  from srcTab and 
5fc0: 70 2d 3e 70 45 4c 69 73 74 20 69 73 20 75 73 65  p->pEList is use
5fd0: 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67 65  d only .** to ge
5fe0: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
5ff0: 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20  columns and the 
6000: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
6010: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
6020: 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  mn..*/.static vo
6030: 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  id selectInnerLo
6040: 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  op(.  Parse *pPa
6050: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
6060: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
6070: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
6080: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
6090: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65   /* The complete
60a0: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
60b0: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
60c0: 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20  .  int srcTab,  
60d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
60e0: 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  ll data from thi
60f0: 73 20 74 61 62 6c 65 20 69 66 20 6e 6f 6e 2d 6e  s table if non-n
6100: 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 53 6f 72  egative */.  Sor
6110: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
6120: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
6130: 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77  ULL, info on how
6140: 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52 44 45   to process ORDE
6150: 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e  R BY */.  Distin
6160: 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e 63 74  ctCtx *pDistinct
6170: 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  , /* If not NULL
6180: 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  , info on how to
6190: 20 70 72 6f 63 65 73 73 20 44 49 53 54 49 4e 43   process DISTINC
61a0: 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  T */.  SelectDes
61b0: 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
61c0: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
61d0: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
61e0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
61f0: 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ue,          /* 
6200: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e  Jump here to con
6210: 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20  tinue with next 
6220: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  row */.  int iBr
6230: 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  eak             
6240: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
6250: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
6260: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a  e inner loop */.
6270: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
6280: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
6290: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73  int i;.  int has
62a0: 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
62b0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
62c0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
62d0: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
62e0: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
62f0: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20   pDest->eDest;  
6300: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
6310: 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f  se of results */
6320: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
6330: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f  Dest->iSDParm; /
6340: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
6350: 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74   to disposal met
6360: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  hod */.  int nRe
6370: 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  sultCol;        
6380: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6390: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
63a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69   */.  int nPrefi
63b0: 78 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  xReg = 0;       
63c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
63d0: 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 62  xtra registers b
63e0: 65 66 6f 72 65 20 72 65 67 52 65 73 75 6c 74 20  efore regResult 
63f0: 2a 2f 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79  */..  /* Usually
6400: 2c 20 72 65 67 52 65 73 75 6c 74 20 69 73 20 74  , regResult is t
6410: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e  he first cell in
6420: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6d 65 6d   an array of mem
6430: 6f 72 79 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 63  ory cells.  ** c
6440: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75  ontaining the cu
6450: 72 72 65 6e 74 20 72 65 73 75 6c 74 20 72 6f 77  rrent result row
6460: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72  . In this case r
6470: 65 67 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f  egOrig is set to
6480: 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76   the.  ** same v
6490: 61 6c 75 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  alue. However, i
64a0: 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72  f the results ar
64b0: 65 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20  e being sent to 
64c0: 74 68 65 20 73 6f 72 74 65 72 2c 20 74 68 65 0a  the sorter, the.
64d0: 20 20 2a 2a 20 76 61 6c 75 65 73 20 66 6f 72 20    ** values for 
64e0: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 73 20  any expressions 
64f0: 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 70 61  that are also pa
6500: 72 74 20 6f 66 20 74 68 65 20 73 6f 72 74 2d 6b  rt of the sort-k
6510: 65 79 20 61 72 65 20 6f 6d 69 74 74 65 64 0a 20  ey are omitted. 
6520: 20 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20 61 72   ** from this ar
6530: 72 61 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ray. In this cas
6540: 65 20 72 65 67 4f 72 69 67 20 69 73 20 73 65 74  e regOrig is set
6550: 20 74 6f 20 7a 65 72 6f 2e 20 20 2a 2f 0a 20 20   to zero.  */.  
6560: 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20  int regResult;  
6570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
6580: 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68  tart of memory h
6590: 6f 6c 64 69 6e 67 20 63 75 72 72 65 6e 74 20 72  olding current r
65a0: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
65b0: 72 65 67 4f 72 69 67 3b 20 20 20 20 20 20 20 20  regOrig;        
65c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
65d0: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69   of memory holdi
65e0: 6e 67 20 66 75 6c 6c 20 72 65 73 75 6c 74 20 28  ng full result (
65f0: 6f 72 20 30 29 20 2a 2f 0a 0a 20 20 61 73 73 65  or 0) */..  asse
6600: 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72  rt( v );.  asser
6610: 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20  t( p->pEList!=0 
6620: 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74  );.  hasDistinct
6630: 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70   = pDistinct ? p
6640: 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54  Distinct->eTnctT
6650: 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54  ype : WHERE_DIST
6660: 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28  INCT_NOOP;.  if(
6670: 20 70 53 6f 72 74 20 26 26 20 70 53 6f 72 74 2d   pSort && pSort-
6680: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 70  >pOrderBy==0 ) p
6690: 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Sort = 0;.  if( 
66a0: 70 53 6f 72 74 3d 3d 30 20 26 26 20 21 68 61 73  pSort==0 && !has
66b0: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
66c0: 61 73 73 65 72 74 28 20 69 43 6f 6e 74 69 6e 75  assert( iContinu
66d0: 65 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64 65  e!=0 );.    code
66e0: 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
66f0: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29  fset, iContinue)
6700: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c  ;.  }..  /* Pull
6710: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
6720: 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e  olumns..  */.  n
6730: 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 2d 3e 70  ResultCol = p->p
6740: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20  EList->nExpr;.. 
6750: 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
6760: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  t==0 ){.    if( 
6770: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 6e  pSort ){.      n
6780: 50 72 65 66 69 78 52 65 67 20 3d 20 70 53 6f 72  PrefixReg = pSor
6790: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
67a0: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 21 28  pr;.      if( !(
67b0: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
67c0: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
67d0: 6f 72 74 65 72 29 20 29 20 6e 50 72 65 66 69 78  orter) ) nPrefix
67e0: 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61  Reg++;.      pPa
67f0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72  rse->nMem += nPr
6800: 65 66 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20  efixReg;.    }. 
6810: 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20     pDest->iSdst 
6820: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
6830: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
6840: 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  em += nResultCol
6850: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44  ;.  }else if( pD
6860: 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75  est->iSdst+nResu
6870: 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e  ltCol > pParse->
6880: 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54  nMem ){.    /* T
6890: 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 20  his is an error 
68a0: 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61 74 20 63  condition that c
68b0: 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f 72 20 65  an result, for e
68c0: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 53  xample, when a S
68d0: 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20  ELECT.    ** on 
68e0: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
68f0: 69 64 65 20 6f 66 20 61 6e 20 49 4e 53 45 52 54  ide of an INSERT
6900: 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72   contains more r
6910: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68  esult columns th
6920: 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20  an.    ** there 
6930: 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  are columns in t
6940: 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
6950: 6c 65 66 74 2e 20 20 54 68 65 20 65 72 72 6f 72  left.  The error
6960: 20 77 69 6c 6c 20 62 65 20 63 61 75 67 68 74 0a   will be caught.
6970: 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72      ** and repor
6980: 74 65 64 20 6c 61 74 65 72 2e 20 20 42 75 74 20  ted later.  But 
6990: 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  we need to make 
69a0: 73 75 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f  sure enough memo
69b0: 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a  ry is allocated.
69c0: 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20      ** to avoid 
69d0: 6f 74 68 65 72 20 73 70 75 72 69 6f 75 73 20 65  other spurious e
69e0: 72 72 6f 72 73 20 69 6e 20 74 68 65 20 6d 65 61  rrors in the mea
69f0: 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50  ntime. */.    pP
6a00: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
6a10: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20  esultCol;.  }.  
6a20: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e  pDest->nSdst = n
6a30: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67  ResultCol;.  reg
6a40: 4f 72 69 67 20 3d 20 72 65 67 52 65 73 75 6c 74  Orig = regResult
6a50: 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b   = pDest->iSdst;
6a60: 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30  .  if( srcTab>=0
6a70: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
6a80: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
6a90: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
6aa0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6ab0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61  OP_Column, srcTa
6ac0: 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b  b, i, regResult+
6ad0: 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  i);.      VdbeCo
6ae0: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
6af0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  p->pEList->a[i].
6b00: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
6b10: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
6b20: 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a  !=SRT_Exists ){.
6b30: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
6b40: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20  stination is an 
6b50: 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72  EXISTS(...) expr
6b60: 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75  ession, the actu
6b70: 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  al.    ** values
6b80: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
6b90: 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20   SELECT are not 
6ba0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
6bb0: 0a 20 20 20 20 75 38 20 65 63 65 6c 46 6c 61 67  .    u8 ecelFlag
6bc0: 73 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74  s;.    if( eDest
6bd0: 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
6be0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
6bf0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
6c00: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
6c10: 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c 49  ecelFlags = SQLI
6c20: 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20 20  TE_ECEL_DUP;.   
6c30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 63   }else{.      ec
6c40: 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  elFlags = 0;.   
6c50: 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74   }.    if( pSort
6c60: 20 26 26 20 68 61 73 44 69 73 74 69 6e 63 74 3d   && hasDistinct=
6c70: 3d 30 20 26 26 20 65 44 65 73 74 21 3d 53 52 54  =0 && eDest!=SRT
6c80: 5f 45 70 68 65 6d 54 61 62 20 26 26 20 65 44 65  _EphemTab && eDe
6c90: 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b  st!=SRT_Table ){
6ca0: 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61  .      /* For ea
6cb0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
6cc0: 20 70 2d 3e 70 45 4c 69 73 74 20 74 68 61 74 20   p->pEList that 
6cd0: 69 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20  is a copy of an 
6ce0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 0a 20 20  expression in.  
6cf0: 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52      ** the ORDER
6d00: 20 42 59 20 63 6c 61 75 73 65 20 28 70 53 6f 72   BY clause (pSor
6d10: 74 2d 3e 70 4f 72 64 65 72 42 79 29 2c 20 73 65  t->pOrderBy), se
6d20: 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  t the associated
6d30: 20 0a 20 20 20 20 20 20 2a 2a 20 69 4f 72 64 65   .      ** iOrde
6d40: 72 42 79 43 6f 6c 20 76 61 6c 75 65 20 74 6f 20  rByCol value to 
6d50: 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68  one more than th
6d60: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 4f  e index of the O
6d70: 52 44 45 52 20 42 59 20 0a 20 20 20 20 20 20 2a  RDER BY .      *
6d80: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  * expression wit
6d90: 68 69 6e 20 74 68 65 20 73 6f 72 74 2d 6b 65 79  hin the sort-key
6da0: 20 74 68 61 74 20 70 75 73 68 4f 6e 74 6f 53 6f   that pushOntoSo
6db0: 72 74 65 72 28 29 20 77 69 6c 6c 20 67 65 6e 65  rter() will gene
6dc0: 72 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54  rate..      ** T
6dd0: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 70  his allows the p
6de0: 2d 3e 70 45 4c 69 73 74 20 66 69 65 6c 64 20 74  ->pEList field t
6df0: 6f 20 62 65 20 6f 6d 69 74 74 65 64 20 66 72 6f  o be omitted fro
6e00: 6d 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 63  m the sorted rec
6e10: 6f 72 64 2c 0a 20 20 20 20 20 20 2a 2a 20 73 61  ord,.      ** sa
6e20: 76 69 6e 67 20 73 70 61 63 65 20 61 6e 64 20 43  ving space and C
6e30: 50 55 20 63 79 63 6c 65 73 2e 20 20 2a 2f 0a 20  PU cycles.  */. 
6e40: 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20 7c       ecelFlags |
6e50: 3d 20 28 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f  = (SQLITE_ECEL_O
6e60: 4d 49 54 52 45 46 7c 53 51 4c 49 54 45 5f 45 43  MITREF|SQLITE_EC
6e70: 45 4c 5f 52 45 46 29 3b 0a 20 20 20 20 20 20 66  EL_REF);.      f
6e80: 6f 72 28 69 3d 70 53 6f 72 74 2d 3e 6e 4f 42 53  or(i=pSort->nOBS
6e90: 61 74 3b 20 69 3c 70 53 6f 72 74 2d 3e 70 4f 72  at; i<pSort->pOr
6ea0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
6eb0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
6ec0: 6a 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  j;.        if( (
6ed0: 6a 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65  j = pSort->pOrde
6ee0: 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f  rBy->a[i].u.x.iO
6ef0: 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a  rderByCol)>0 ){.
6f00: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c            p->pEL
6f10: 69 73 74 2d 3e 61 5b 6a 2d 31 5d 2e 75 2e 78 2e  ist->a[j-1].u.x.
6f20: 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 69 2b  iOrderByCol = i+
6f30: 31 2d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  1-pSort->nOBSat;
6f40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6f50: 20 7d 0a 20 20 20 20 20 20 72 65 67 4f 72 69 67   }.      regOrig
6f60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
6f70: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  rt( eDest==SRT_S
6f80: 65 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  et || eDest==SRT
6f90: 5f 4d 65 6d 20 0a 20 20 20 20 20 20 20 20 20 20  _Mem .          
6fa0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
6fb0: 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65 73  oroutine || eDes
6fc0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
6fd0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 52 65 73 75  .    }.    nResu
6fe0: 6c 74 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 45  ltCol = sqlite3E
6ff0: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
7000: 70 50 61 72 73 65 2c 70 2d 3e 70 45 4c 69 73 74  pParse,p->pEList
7010: 2c 72 65 67 52 65 73 75 6c 74 2c 0a 20 20 20 20  ,regResult,.    
7020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7040: 20 20 20 20 20 30 2c 65 63 65 6c 46 6c 61 67 73       0,ecelFlags
7050: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
7060: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
7070: 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74  word was present
7080: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
7090: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e  tatement.  ** an
70a0: 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62  d this row has b
70b0: 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c  een seen before,
70c0: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b   then do not mak
70d0: 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20  e this row.  ** 
70e0: 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  part of the resu
70f0: 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68  lt..  */.  if( h
7100: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
7110: 20 20 73 77 69 74 63 68 28 20 70 44 69 73 74 69    switch( pDisti
7120: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29  nct->eTnctType )
7130: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  {.      case WHE
7140: 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
7150: 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56  RED: {.        V
7160: 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20  dbeOp *pOp;     
7170: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e         /* No lon
7180: 67 65 72 20 72 65 71 75 69 72 65 64 20 4f 70 65  ger required Ope
7190: 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
71a0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
71b0: 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20   iJump;         
71c0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73       /* Jump des
71d0: 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  tination */.    
71e0: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b      int regPrev;
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7200: 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74  revious row cont
7210: 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ent */..        
7220: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
7230: 65 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  e for the previo
7240: 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  us row */.      
7250: 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72    regPrev = pPar
7260: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
7270: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
7280: 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a   += nResultCol;.
7290: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  .        /* Chan
72a0: 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
72b0: 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61  hemeral coded ea
72c0: 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e  rlier to an OP_N
72d0: 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  ull.        ** s
72e0: 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61  ets the MEM_Clea
72f0: 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66  red bit on the f
7300: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 6f 66  irst register of
7310: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
7320: 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20  previous value. 
7330: 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
7340: 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77   the OP_Ne below
7350: 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20   to always.     
7360: 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68     ** fail on th
7370: 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
7380: 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76  n of the loop ev
7390: 65 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  en if the first.
73a0: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69          ** row i
73b0: 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20  s all NULLs..   
73c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
73d0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
73e0: 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74  eToNoop(v, pDist
73f0: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
7400: 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73  .        pOp = s
7410: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
7420: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
7430: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
7440: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
7450: 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  P_Null;.        
7460: 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20  pOp->p1 = 1;.   
7470: 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72       pOp->p2 = r
7480: 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20  egPrev;..       
7490: 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33   iJump = sqlite3
74a0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
74b0: 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  v) + nResultCol;
74c0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
74d0: 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  ; i<nResultCol; 
74e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
74f0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
7500: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
7510: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
7520: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
7530: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
7540: 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31  ( i<nResultCol-1
7550: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7560: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7570: 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52  3(v, OP_Ne, regR
7580: 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20  esult+i, iJump, 
7590: 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20  regPrev+i);.    
75a0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
75b0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
75c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
75d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
75e0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71  eAddOp3(v, OP_Eq
75f0: 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69  , regResult+i, i
7600: 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65  Continue, regPre
7610: 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  v+i);.          
7620: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
7630: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a  );.           }.
7640: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7650: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
7660: 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72   -1, (const char
7670: 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
7680: 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20  LSEQ);.         
7690: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
76a0: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
76b0: 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20  ULLEQ);.        
76c0: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
76d0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  ( sqlite3VdbeCur
76e0: 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75  rentAddr(v)==iJu
76f0: 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  mp || pParse->db
7700: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7710: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7720: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
7730: 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c  P_Copy, regResul
7740: 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73  t, regPrev, nRes
7750: 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20  ultCol-1);.     
7760: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7770: 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  }..      case WH
7780: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
7790: 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  QUE: {.        s
77a0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
77b0: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
77c0: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
77d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
77e0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65       }..      de
77f0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
7800: 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e   assert( pDistin
7810: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57  ct->eTnctType==W
7820: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
7830: 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20  ORDERED );.     
7840: 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
7850: 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63  pParse, pDistinc
7860: 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e  t->tabTnct, iCon
7870: 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f  tinue, nResultCo
7880: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
7890: 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c          regResul
78a0: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
78b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
78c0: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 3d 3d  .    if( pSort==
78d0: 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f  0 ){.      codeO
78e0: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
78f0: 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  set, iContinue);
7900: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77  .    }.  }..  sw
7910: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
7920: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f     /* In this mo
7930: 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71  de, write each q
7940: 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74  uery result to t
7950: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65  he key of the te
7960: 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74  mporary.    ** t
7970: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
7980: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
7990: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
79a0: 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20  SELECT.    case 
79b0: 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20  SRT_Union: {.   
79c0: 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
79d0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
79e0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
79f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7a00: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
7a10: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
7a20: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
7a30: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
7a40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
7a50: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
7a60: 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 65  t, iParm, r1, re
7a70: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
7a80: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Col);.      sqli
7a90: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
7aa0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
7ab0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7ac0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  }..    /* Constr
7ad0: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
7ae0: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
7af0: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
7b00: 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  of.    ** saving
7b10: 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73   that record, us
7b20: 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f  e it as a key to
7b30: 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73   delete elements
7b40: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
7b50: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
7b60: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
7b70: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
7b80: 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  pt: {.      sqli
7b90: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7ba0: 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69   OP_IdxDelete, i
7bb0: 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c  Parm, regResult,
7bc0: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
7bd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7be0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7bf0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
7c00: 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f  SELECT */..    /
7c10: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
7c20: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
7c30: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
7c40: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
7c50: 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61 73  RT_Fifo:.    cas
7c60: 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a  e SRT_DistFifo:.
7c70: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
7c80: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
7c90: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
7ca0: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
7cb0: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
7cc0: 70 50 61 72 73 65 2c 20 6e 50 72 65 66 69 78 52  pParse, nPrefixR
7cd0: 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 74 65 73  eg+1);.      tes
7ce0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
7cf0: 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  T_Table );.     
7d00: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
7d10: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
7d20: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7d30: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66  ( eDest==SRT_Fif
7d40: 6f 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  o );.      testc
7d50: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
7d60: 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 20 20  DistFifo );.    
7d70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7d80: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
7d90: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
7da0: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b   nResultCol, r1+
7db0: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 23 69 66  nPrefixReg);.#if
7dc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7dd0: 5f 43 54 45 0a 20 20 20 20 20 20 69 66 28 20 65  _CTE.      if( e
7de0: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69  Dest==SRT_DistFi
7df0: 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  fo ){.        /*
7e00: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
7e10: 69 6f 6e 20 69 73 20 44 69 73 74 46 69 66 6f 2c  ion is DistFifo,
7e20: 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50   then cursor (iP
7e30: 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20  arm+1) is open. 
7e40: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20         ** on an 
7e50: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e  ephemeral index.
7e60: 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
7e70: 72 6f 77 20 69 73 20 61 6c 72 65 61 64 79 20 70  row is already p
7e80: 72 65 73 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  resent.        *
7e90: 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20  * in the index, 
7ea0: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20  do not write it 
7eb0: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 49  to the output. I
7ec0: 66 20 6e 6f 74 2c 20 61 64 64 20 74 68 65 0a 20  f not, add the. 
7ed0: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
7ee0: 74 20 72 6f 77 20 74 6f 20 74 68 65 20 69 6e 64  t row to the ind
7ef0: 65 78 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77  ex and proceed w
7f00: 69 74 68 20 77 72 69 74 69 6e 67 20 69 74 20 74  ith writing it t
7f10: 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
7f20: 20 6f 75 74 70 75 74 20 74 61 62 6c 65 20 61 73   output table as
7f30: 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20   well.  */.     
7f40: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
7f50: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
7f60: 41 64 64 72 28 76 29 20 2b 20 34 3b 0a 20 20 20  Addr(v) + 4;.   
7f70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7f80: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
7f90: 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20  Found, iParm+1, 
7fa0: 61 64 64 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20  addr, r1, 0);.  
7fb0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
7fc0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
7fd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
7fe0: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
7ff0: 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31  ert, iParm+1, r1
8000: 2c 72 65 67 52 65 73 75 6c 74 2c 6e 52 65 73 75  ,regResult,nResu
8010: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
8020: 61 73 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30  assert( pSort==0
8030: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
8040: 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  if.      if( pSo
8050: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  rt ){.        pu
8060: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
8070: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
8080: 31 2b 6e 50 72 65 66 69 78 52 65 67 2c 72 65 67  1+nPrefixReg,reg
8090: 52 65 73 75 6c 74 2c 31 2c 6e 50 72 65 66 69 78  Result,1,nPrefix
80a0: 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
80b0: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e{.        int r
80c0: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
80d0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
80e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
80f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
8100: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
8110: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r2);.        sql
8120: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8130: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
8140: 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
8150: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8160: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
8170: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
8180: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
8190: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
81a0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
81b0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
81c0: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
81d0: 72 73 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78  rse, r1, nPrefix
81e0: 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72  Reg+1);.      br
81f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
8200: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8210: 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
8220: 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
8230: 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
8240: 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
8250: 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
8260: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
8270: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
8280: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
8290: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
82a0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
82b0: 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
82c0: 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
82d0: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
82e0: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
82f0: 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74  .      if( pSort
8300: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
8310: 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79  t first glance y
8320: 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77  ou would think w
8330: 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65  e could optimize
8340: 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 20   out the.       
8350: 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20   ** ORDER BY in 
8360: 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65 20  this case since 
8370: 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74  the order of ent
8380: 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a  ries in the set.
8390: 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20          ** does 
83a0: 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74  not matter.  But
83b0: 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   there might be 
83c0: 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20  a LIMIT clause, 
83d0: 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  in which.       
83e0: 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64   ** case the ord
83f0: 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a  er does matter *
8400: 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  /.        pushOn
8410: 74 6f 53 6f 72 74 65 72 28 0a 20 20 20 20 20 20  toSorter(.      
8420: 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53        pParse, pS
8430: 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c  ort, p, regResul
8440: 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73  t, regOrig, nRes
8450: 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52  ultCol, nPrefixR
8460: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
8470: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  {.        int r1
8480: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
8490: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
84a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
84b0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44  lite3Strlen30(pD
84c0: 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 3d 3d  est->zAffSdst)==
84d0: 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a 20 20  nResultCol );.  
84e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
84f0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
8500: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
8510: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  ult, nResultCol,
8520: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 31   .            r1
8530: 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73  , pDest->zAffSds
8540: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
8550: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
8560: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
8570: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
8580: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
8590: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
85a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
85b0: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
85c0: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
85d0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
85e0: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
85f0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
8600: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
8610: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8620: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
8630: 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77     /* If any row
8640: 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65   exist in the re
8650: 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64  sult set, record
8660: 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61   that fact and a
8670: 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  bort..    */.   
8680: 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73   case SRT_Exists
8690: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
86a0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
86b0: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50  P_Integer, 1, iP
86c0: 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  arm);.      /* T
86d0: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
86e0: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
86f0: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
8700: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
8710: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
8720: 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72  this is a scalar
8730: 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20   select that is 
8740: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
8750: 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ssion, then.    
8760: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
8770: 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
8780: 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
8790: 65 6c 6c 20 6f 72 20 61 72 72 61 79 20 6f 66 20  ell or array of 
87a0: 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63  .    ** memory c
87b0: 65 6c 6c 73 20 61 6e 64 20 62 72 65 61 6b 20 6f  ells and break o
87c0: 75 74 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ut of the scan l
87d0: 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
87e0: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
87f0: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
8800: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
8810: 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3c 3d 70  t( nResultCol<=p
8820: 44 65 73 74 2d 3e 6e 53 64 73 74 20 29 3b 0a 20  Dest->nSdst );. 
8830: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
8840: 6f 72 74 65 72 28 0a 20 20 20 20 20 20 20 20 20  orter(.         
8850: 20 20 20 70 50 61 72 73 65 2c 20 70 53 6f 72 74     pParse, pSort
8860: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  , p, regResult, 
8870: 72 65 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74  regOrig, nResult
8880: 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65 67 29  Col, nPrefixReg)
8890: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
88a0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
88b0: 52 65 73 75 6c 74 43 6f 6c 3d 3d 70 44 65 73 74  ResultCol==pDest
88c0: 2d 3e 6e 53 64 73 74 20 29 3b 0a 20 20 20 20 20  ->nSdst );.     
88d0: 20 20 20 61 73 73 65 72 74 28 20 72 65 67 52 65     assert( regRe
88e0: 73 75 6c 74 3d 3d 69 50 61 72 6d 20 29 3b 0a 20  sult==iParm );. 
88f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49         /* The LI
8900: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
8910: 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  jump out of the 
8920: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
8930: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
8940: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
8950: 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
8960: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
8970: 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53 52   */..    case SR
8980: 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20  T_Coroutine:    
8990: 20 20 20 2f 2a 20 53 65 6e 64 20 64 61 74 61 20     /* Send data 
89a0: 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  to a co-routine 
89b0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
89c0: 4f 75 74 70 75 74 3a 20 7b 20 20 20 20 20 20 20  Output: {       
89d0: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72   /* Return the r
89e0: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20  esults */.      
89f0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
8a00: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
8a10: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8a20: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
8a30: 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  put );.      if(
8a40: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
8a50: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
8a60: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20  (pParse, pSort, 
8a70: 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65  p, regResult, re
8a80: 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f  gOrig, nResultCo
8a90: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
8aa0: 20 20 20 20 20 20 20 20 20 20 6e 50 72 65 66 69            nPrefi
8ab0: 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xReg);.      }el
8ac0: 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  se if( eDest==SR
8ad0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
8ae0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8af0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
8b00: 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44  ield, pDest->iSD
8b10: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Parm);.      }el
8b20: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
8b30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8b40: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72   OP_ResultRow, r
8b50: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
8b60: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
8b70: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
8b80: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
8b90: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
8ba0: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
8bb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
8bc0: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
8bd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
8be0: 45 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  E.    /* Write t
8bf0: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  he results into 
8c00: 61 20 70 72 69 6f 72 69 74 79 20 71 75 65 75 65  a priority queue
8c10: 20 74 68 61 74 20 69 73 20 6f 72 64 65 72 20 61   that is order a
8c20: 63 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20 20 20  ccording to.    
8c30: 2a 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72  ** pDest->pOrder
8c40: 42 79 20 28 69 6e 20 70 53 4f 29 2e 20 20 70 44  By (in pSO).  pD
8c50: 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e  est->iSDParm (in
8c60: 20 69 50 61 72 6d 29 20 69 73 20 74 68 65 20 63   iParm) is the c
8c70: 75 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20  ursor for an.   
8c80: 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 70   ** index with p
8c90: 53 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75  SO->nExpr+2 colu
8ca0: 6d 6e 73 2e 20 20 42 75 69 6c 64 20 61 20 6b 65  mns.  Build a ke
8cb0: 79 20 75 73 69 6e 67 20 70 53 4f 20 66 6f 72 20  y using pSO for 
8cc0: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a  the first.    **
8cd0: 20 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75   pSO->nExpr colu
8ce0: 6d 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  mns, then make s
8cf0: 75 72 65 20 61 6c 6c 20 6b 65 79 73 20 61 72 65  ure all keys are
8d00: 20 75 6e 69 71 75 65 20 62 79 20 61 64 64 69 6e   unique by addin
8d10: 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c  g a.    ** final
8d20: 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c   OP_Sequence col
8d30: 75 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74 20 63  umn.  The last c
8d40: 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 72 65 63  olumn is the rec
8d50: 6f 72 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20  ord as a blob.. 
8d60: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
8d70: 52 54 5f 44 69 73 74 51 75 65 75 65 3a 0a 20 20  RT_DistQueue:.  
8d80: 20 20 63 61 73 65 20 53 52 54 5f 51 75 65 75 65    case SRT_Queue
8d90: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b  : {.      int nK
8da0: 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  ey;.      int r1
8db0: 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20 20 20 20  , r2, r3;.      
8dc0: 69 6e 74 20 61 64 64 72 54 65 73 74 20 3d 20 30  int addrTest = 0
8dd0: 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  ;.      ExprList
8de0: 20 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f   *pSO;.      pSO
8df0: 20 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72   = pDest->pOrder
8e00: 42 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  By;.      assert
8e10: 28 20 70 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e  ( pSO );.      n
8e20: 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72  Key = pSO->nExpr
8e30: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
8e40: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
8e50: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 32  Parse);.      r2
8e60: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
8e70: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
8e80: 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 72 33  Key+2);.      r3
8e90: 20 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20   = r2+nKey+1;.  
8ea0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
8eb0: 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a  RT_DistQueue ){.
8ec0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
8ed0: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
8ee0: 20 44 69 73 74 51 75 65 75 65 2c 20 74 68 65 6e   DistQueue, then
8ef0: 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31   cursor (iParm+1
8f00: 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20  ) is open.      
8f10: 20 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64    ** on a second
8f20: 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
8f30: 20 74 68 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20   that holds all 
8f40: 76 61 6c 75 65 73 20 65 76 65 72 79 20 70 72 65  values every pre
8f50: 76 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 20 20  viously.        
8f60: 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ** added to the 
8f70: 71 75 65 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20  queue. */.      
8f80: 20 20 61 64 64 72 54 65 73 74 20 3d 20 73 71 6c    addrTest = sql
8f90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
8fa0: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
8fb0: 50 61 72 6d 2b 31 2c 20 30 2c 20 0a 20 20 20 20  Parm+1, 0, .    
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fe0: 20 20 20 20 72 65 67 52 65 73 75 6c 74 2c 20 6e      regResult, n
8ff0: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
9000: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
9010: 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
9020: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9030: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
9040: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
9050: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33  , nResultCol, r3
9060: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
9070: 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st==SRT_DistQueu
9080: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
9090: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
90a0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
90b0: 69 50 61 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20  iParm+1, r3);.  
90c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
90d0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
90e0: 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
90f0: 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T);.      }.    
9100: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65    for(i=0; i<nKe
9110: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
9120: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9130: 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a  p2(v, OP_SCopy,.
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9150: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
9160: 75 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e  ult + pSO->a[i].
9170: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
9180: 2d 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  - 1,.           
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
91a0: 32 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  2+i);.      }.  
91b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
91c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp2(v, OP_Sequ
91d0: 65 6e 63 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b  ence, iParm, r2+
91e0: 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 73 71 6c  nKey);.      sql
91f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
9200: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
9210: 20 72 32 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29   r2, nKey+2, r1)
9220: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9230: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
9240: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
9250: 61 72 6d 2c 20 72 31 2c 20 72 32 2c 20 6e 4b 65  arm, r1, r2, nKe
9260: 79 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  y+2);.      if( 
9270: 61 64 64 72 54 65 73 74 20 29 20 73 71 6c 69 74  addrTest ) sqlit
9280: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
9290: 2c 20 61 64 64 72 54 65 73 74 29 3b 0a 20 20 20  , addrTest);.   
92a0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
92b0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
92c0: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
92d0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
92e0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 32 2c 20  nge(pParse, r2, 
92f0: 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 62  nKey+2);.      b
9300: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
9310: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
9320: 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20  T_CTE */....#if 
9330: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9340: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20  OMIT_TRIGGER).  
9350: 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
9360: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20   results.  This 
9370: 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45  is used for SELE
9380: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  CT statements in
9390: 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  side.    ** the 
93a0: 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45  body of a TRIGGE
93b0: 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  R.  The purpose 
93c0: 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20  of such selects 
93d0: 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a  is to call.    *
93e0: 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  * user-defined f
93f0: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  unctions that ha
9400: 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e  ve side effects.
9410: 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65    We do not care
9420: 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68  .    ** about th
9430: 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73  e actual results
9440: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a   of the select..
9450: 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
9460: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
9470: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  rt( eDest==SRT_D
9480: 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20  iscard );.      
9490: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
94a0: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  dif.  }..  /* Ju
94b0: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
94c0: 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
94d0: 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
94e0: 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20  d.  Except, if. 
94f0: 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 73   ** there is a s
9500: 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20  orter, in which 
9510: 63 61 73 65 20 74 68 65 20 73 6f 72 74 65 72 20  case the sorter 
9520: 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69  has already limi
9530: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74  ted.  ** the out
9540: 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f  put for us..  */
9550: 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20  .  if( pSort==0 
9560: 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  && p->iLimit ){.
9570: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9580: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
9590: 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  JumpZero, p->iLi
95a0: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  mit, iBreak); Vd
95b0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
95c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
95d0: 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f  cate a KeyInfo o
95e0: 62 6a 65 63 74 20 73 75 66 66 69 63 69 65 6e 74  bject sufficient
95f0: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66   for an index of
9600: 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61   N key columns a
9610: 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f  nd.** X extra co
9620: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  lumns..*/.KeyInf
9630: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
9640: 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a  oAlloc(sqlite3 *
9650: 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58  db, int N, int X
9660: 29 7b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  ){.  int nExtra 
9670: 3d 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28  = (N+X)*(sizeof(
9680: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 2d 20 73  CollSeq*)+1) - s
9690: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 3b  izeof(CollSeq*);
96a0: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20  .  KeyInfo *p = 
96b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
96c0: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
96d0: 4b 65 79 49 6e 66 6f 29 20 2b 20 6e 45 78 74 72  KeyInfo) + nExtr
96e0: 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  a);.  if( p ){. 
96f0: 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72     p->aSortOrder
9700: 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c   = (u8*)&p->aCol
9710: 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e  l[N+X];.    p->n
9720: 4b 65 79 46 69 65 6c 64 20 3d 20 28 75 31 36 29  KeyField = (u16)
9730: 4e 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 46 69  N;.    p->nAllFi
9740: 65 6c 64 20 3d 20 28 75 31 36 29 28 4e 2b 58 29  eld = (u16)(N+X)
9750: 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45  ;.    p->enc = E
9760: 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64  NC(db);.    p->d
9770: 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e  b = db;.    p->n
9780: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d  Ref = 1;.    mem
9790: 73 65 74 28 26 70 5b 31 5d 2c 20 30 2c 20 6e 45  set(&p[1], 0, nE
97a0: 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xtra);.  }else{.
97b0: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
97c0: 75 6c 74 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ult(db);.  }.  r
97d0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
97e0: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b  * Deallocate a K
97f0: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
9800: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79  .void sqlite3Key
9810: 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66  InfoUnref(KeyInf
9820: 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  o *p){.  if( p )
9830: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
9840: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70  >nRef>0 );.    p
9850: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
9860: 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73  ( p->nRef==0 ) s
9870: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 70  qlite3DbFreeNN(p
9880: 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  ->db, p);.  }.}.
9890: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65  ./*.** Make a ne
98a0: 77 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  w pointer to a K
98b0: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
98c0: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
98d0: 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49  3KeyInfoRef(KeyI
98e0: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  nfo *p){.  if( p
98f0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9900: 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  p->nRef>0 );.   
9910: 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a   p->nRef++;.  }.
9920: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23    return p;.}..#
9930: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
9940: 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
9950: 54 52 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66  TRUE if a KeyInf
9960: 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20  o object can be 
9970: 63 68 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79  change.  The Key
9980: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63  Info object.** c
9990: 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67  an only be chang
99a0: 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6a 75  ed if this is ju
99b0: 73 74 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65  st a single refe
99c0: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a  rence to the obj
99d0: 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ect..**.** This 
99e0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
99f0: 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61  only inside of a
9a00: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
9a10: 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
9a20: 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
9a30: 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29  able(KeyInfo *p)
9a40: 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66  { return p->nRef
9a50: 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  ==1; }.#endif /*
9a60: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
9a70: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
9a80: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
9a90: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79  , generate a Key
9aa0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
9ab0: 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74  hat records.** t
9ac0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
9ad0: 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65  uence for each e
9ae0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61  xpression in tha
9af0: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
9b00: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
9b10: 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f  ExprList is an O
9b20: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
9b30: 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20   BY clause then 
9b40: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  the resulting.**
9b50: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
9b60: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
9b70: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
9b80: 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64  ng a virtual ind
9b90: 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ex to.** impleme
9ba0: 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20  nt that clause. 
9bb0: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
9bc0: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73   is the result s
9bd0: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a  et of a SELECT.*
9be0: 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e  * then the KeyIn
9bf0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
9c00: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
9c10: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
9c20: 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20  irtual.** index 
9c30: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44  to implement a D
9c40: 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a  ISTINCT test..**
9c50: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
9c60: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
9c70: 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69  ructure is obtai
9c80: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
9c90: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a    The calling.**
9ca0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
9cb0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65  ponsible for see
9cc0: 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
9cd0: 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
9ce0: 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a  ually.** freed..
9cf0: 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66  */.static KeyInf
9d00: 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  o *keyInfoFromEx
9d10: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
9d20: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
9d30: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
9d40: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
9d50: 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46  *pList,     /* F
9d60: 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  orm the KeyInfo 
9d70: 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73  object from this
9d80: 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69   ExprList */.  i
9d90: 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20  nt iStart,      
9da0: 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74      /* Begin wit
9db0: 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66  h this column of
9dc0: 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
9dd0: 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  nExtra          
9de0: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
9df0: 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  y extra columns 
9e00: 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 7b  to the end */.){
9e10: 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20  .  int nExpr;.  
9e20: 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a  KeyInfo *pInfo;.
9e30: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
9e40: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
9e50: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9e60: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
9e70: 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70   i;..  nExpr = p
9e80: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
9e90: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
9ea0: 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
9eb0: 45 78 70 72 2d 69 53 74 61 72 74 2c 20 6e 45 78  Expr-iStart, nEx
9ec0: 74 72 61 2b 31 29 3b 0a 20 20 69 66 28 20 70 49  tra+1);.  if( pI
9ed0: 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nfo ){.    asser
9ee0: 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
9ef0: 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 49 6e  oIsWriteable(pIn
9f00: 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  fo) );.    for(i
9f10: 3d 69 53 74 61 72 74 2c 20 70 49 74 65 6d 3d 70  =iStart, pItem=p
9f20: 4c 69 73 74 2d 3e 61 2b 69 53 74 61 72 74 3b 20  List->a+iStart; 
9f30: 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  i<nExpr; i++, pI
9f40: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49  tem++){.      pI
9f50: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74  nfo->aColl[i-iSt
9f60: 61 72 74 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  art] = sqlite3Ex
9f70: 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72  prNNCollSeq(pPar
9f80: 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
9f90: 29 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  );.      pInfo->
9fa0: 61 53 6f 72 74 4f 72 64 65 72 5b 69 2d 69 53 74  aSortOrder[i-iSt
9fb0: 61 72 74 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f  art] = pItem->so
9fc0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
9fd0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66   }.  return pInf
9fe0: 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  o;.}../*.** Name
9ff0: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
a000: 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65  on operator, use
a010: 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  d for error mess
a020: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
a030: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65  const char *sele
a040: 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29  ctOpName(int id)
a050: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  {.  char *z;.  s
a060: 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20  witch( id ){.   
a070: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
a080: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41      z = "UNION A
a090: 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  LL";   break;.  
a0a0: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
a0b0: 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53  ECT: z = "INTERS
a0c0: 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ECT";   break;. 
a0d0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
a0e0: 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50  T:    z = "EXCEP
a0f0: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
a100: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
a110: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
a120: 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  N";       break;
a130: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b  .  }.  return z;
a140: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
a150: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
a160: 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20  /*.** Unless an 
a170: 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
a180: 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  LAN" command is 
a190: 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c  being processed,
a1a0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
a1b0: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  * is a no-op. Ot
a1c0: 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73  herwise, it adds
a1d0: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
a1e0: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45   output to the E
a1f0: 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68  QP result,.** wh
a200: 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20  ere the caption 
a210: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
a220: 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45 4d  **.**   "USE TEM
a230: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78 78  P B-TREE FOR xxx
a240: 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78  ".**.** where xx
a250: 78 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49 53  x is one of "DIS
a260: 54 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20 42  TINCT", "ORDER B
a270: 59 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59 22  Y" or "GROUP BY"
a280: 2e 20 45 78 61 63 74 6c 79 20 77 68 69 63 68 0a  . Exactly which.
a290: 2a 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  ** is determined
a2a0: 20 62 79 20 74 68 65 20 7a 55 73 61 67 65 20 61   by the zUsage a
a2b0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
a2c0: 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 54  ic void explainT
a2d0: 65 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  empTable(Parse *
a2e0: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
a2f0: 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69  ar *zUsage){.  i
a300: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
a310: 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62  in==2 ){.    Vdb
a320: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
a330: 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Vdbe;.    char *
a340: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
a350: 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
a360: 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52  , "USE TEMP B-TR
a370: 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61  EE FOR %s", zUsa
a380: 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ge);.    sqlite3
a390: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
a3a0: 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
a3b0: 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
a3c0: 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  0, zMsg, P4_DYNA
a3d0: 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  MIC);.  }.}../*.
a3e0: 2a 2a 20 41 73 73 69 67 6e 20 65 78 70 72 65 73  ** Assign expres
a3f0: 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65  sion b to lvalue
a400: 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f   a. A second, no
a410: 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20  -op, version of 
a420: 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73  this macro.** is
a430: 20 70 72 6f 76 69 64 65 64 20 77 68 65 6e 20 53   provided when S
a440: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
a450: 49 4e 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54  IN is defined. T
a460: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  his allows the c
a470: 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65  ode.** in sqlite
a480: 33 53 65 6c 65 63 74 28 29 20 74 6f 20 61 73 73  3Select() to ass
a490: 69 67 6e 20 76 61 6c 75 65 73 20 74 6f 20 73 74  ign values to st
a4a0: 72 75 63 74 75 72 65 20 6d 65 6d 62 65 72 20 76  ructure member v
a4b0: 61 72 69 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a  ariables that.**
a4c0: 20 6f 6e 6c 79 20 65 78 69 73 74 20 69 66 20 53   only exist if S
a4d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
a4e0: 49 4e 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  IN is not define
a4f0: 64 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74  d without pollut
a500: 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  ing the.** code 
a510: 77 69 74 68 20 23 69 66 6e 64 65 66 20 64 69 72  with #ifndef dir
a520: 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65  ectives..*/.# de
a530: 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49  fine explainSetI
a540: 6e 74 65 67 65 72 28 61 2c 20 62 29 20 61 20 3d  nteger(a, b) a =
a550: 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d   b..#else./* No-
a560: 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  op versions of t
a570: 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20  he explainXXX() 
a580: 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61  functions and ma
a590: 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e  cros. */.# defin
a5a0: 65 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62  e explainTempTab
a5b0: 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65  le(y,z).# define
a5c0: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
a5d0: 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  er(y,z).#endif..
a5e0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
a5f0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
a600: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
a610: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
a620: 4e 44 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a  ND_SELECT)./*.**
a630: 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c   Unless an "EXPL
a640: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20  AIN QUERY PLAN" 
a650: 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67  command is being
a660: 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73   processed, this
a670: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
a680: 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
a690: 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69  se, it adds a si
a6a0: 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70  ngle row of outp
a6b0: 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65  ut to the EQP re
a6c0: 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74  sult,.** where t
a6d0: 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66  he caption is of
a6e0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20   one of the two 
a6f0: 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  forms:.**.**   "
a700: 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45  COMPOSITE SUBQUE
a710: 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69  RIES iSub1 and i
a720: 53 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20  Sub2 (op)".**   
a730: 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55  "COMPOSITE SUBQU
a740: 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20  ERIES iSub1 and 
a750: 69 53 75 62 32 20 55 53 49 4e 47 20 54 45 4d 50  iSub2 USING TEMP
a760: 20 42 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a   B-TREE (op)".**
a770: 0a 2a 2a 20 77 68 65 72 65 20 69 53 75 62 31 20  .** where iSub1 
a780: 61 6e 64 20 69 53 75 62 32 20 61 72 65 20 74 68  and iSub2 are th
a790: 65 20 69 6e 74 65 67 65 72 73 20 70 61 73 73 65  e integers passe
a7a0: 64 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70  d as the corresp
a7b0: 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  onding.** functi
a7c0: 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61  on parameters, a
a7d0: 6e 64 20 6f 70 20 69 73 20 74 68 65 20 74 65 78  nd op is the tex
a7e0: 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
a7f0: 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   of the paramete
a800: 72 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65  r.** of the same
a810: 20 6e 61 6d 65 2e 20 54 68 65 20 70 61 72 61 6d   name. The param
a820: 65 74 65 72 20 22 6f 70 22 20 6d 75 73 74 20 62  eter "op" must b
a830: 65 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f  e one of TK_UNIO
a840: 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a  N, TK_EXCEPT,.**
a850: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f 72   TK_INTERSECT or
a860: 20 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72   TK_ALL. The fir
a870: 73 74 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20  st form is used 
a880: 69 66 20 61 72 67 75 6d 65 6e 74 20 62 55 73 65  if argument bUse
a890: 54 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65  Tmp is .** false
a8a0: 2c 20 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20  , or the second 
a8b0: 66 6f 72 6d 20 69 66 20 69 74 20 69 73 20 74 72  form if it is tr
a8c0: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
a8d0: 69 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73  id explainCompos
a8e0: 69 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ite(.  Parse *pP
a8f0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
a900: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
a910: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
a920: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
a930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a940: 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c  One of TK_UNION,
a950: 20 54 4b 5f 45 58 43 45 50 54 20 65 74 63 2e 20   TK_EXCEPT etc. 
a960: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 31 2c 20  */.  int iSub1, 
a970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a980: 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79       /* Subquery
a990: 20 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69   id 1 */.  int i
a9a0: 53 75 62 32 2c 20 20 20 20 20 20 20 20 20 20 20  Sub2,           
a9b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
a9c0: 62 71 75 65 72 79 20 69 64 20 32 20 2a 2f 0a 20  bquery id 2 */. 
a9d0: 20 69 6e 74 20 62 55 73 65 54 6d 70 20 20 20 20   int bUseTmp    
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9f0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74 65   /* True if a te
aa00: 6d 70 20 74 61 62 6c 65 20 77 61 73 20 75 73 65  mp table was use
aa10: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
aa20: 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c  ( op==TK_UNION |
aa30: 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  | op==TK_EXCEPT 
aa40: 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  || op==TK_INTERS
aa50: 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c  ECT || op==TK_AL
aa60: 4c 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  L );.  if( pPars
aa70: 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
aa80: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70  .    Vdbe *v = p
aa90: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
aaa0: 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73    char *zMsg = s
aab0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20  qlite3MPrintf(. 
aac0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64         pParse->d
aad0: 62 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42  b, "COMPOUND SUB
aae0: 51 55 45 52 49 45 53 20 25 64 20 41 4e 44 20 25  QUERIES %d AND %
aaf0: 64 20 25 73 28 25 73 29 22 2c 20 69 53 75 62 31  d %s(%s)", iSub1
ab00: 2c 20 69 53 75 62 32 2c 0a 20 20 20 20 20 20 20  , iSub2,.       
ab10: 20 62 55 73 65 54 6d 70 3f 22 55 53 49 4e 47 20   bUseTmp?"USING 
ab20: 54 45 4d 50 20 42 2d 54 52 45 45 20 22 3a 22 22  TEMP B-TREE ":""
ab30: 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f  , selectOpName(o
ab40: 70 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  p).    );.    sq
ab50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
ab60: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  v, OP_Explain, p
ab70: 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
ab80: 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  , 0, 0, zMsg, P4
ab90: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
aba0: 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20  .#else./* No-op 
abb0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
abc0: 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e  explainXXX() fun
abd0: 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f  ctions and macro
abe0: 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s. */.# define e
abf0: 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
ac00: 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  v,w,x,y,z).#endi
ac10: 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
ac20: 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67  inner loop was g
ac30: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61  enerated using a
ac40: 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72   non-null pOrder
ac50: 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  By argument,.** 
ac60: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  then the results
ac70: 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20   were placed in 
ac80: 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72  a sorter.  After
ac90: 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72   the loop is ter
aca0: 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65  minated.** we ne
acb0: 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f  ed to run the so
acc0: 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20  rter and output 
acd0: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
ace0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
acf0: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
ad00: 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64   the code needed
ad10: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
ad20: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
ad30: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20  rateSortTail(.  
ad40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
ad50: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
ad60: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
ad70: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *p,        /* T
ad80: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
ad90: 65 6e 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78  ent */.  SortCtx
ada0: 20 2a 70 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e   *pSort,   /* In
adb0: 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65  formation on the
adc0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
add0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
ade0: 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  n,      /* Numbe
adf0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
ae00: 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
ae10: 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57  Dest *pDest /* W
ae20: 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20  rite the sorted 
ae30: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
ae40: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
ae50: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae70: 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
ae80: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
ae90: 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 20 3d   int addrBreak =
aea0: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e   pSort->labelDon
aeb0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
aec0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65 78   Jump here to ex
aed0: 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  it loop */.  int
aee0: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20   addrContinue = 
aef0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
af00: 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d  abel(v);  /* Jum
af10: 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20  p here for next 
af20: 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61  cycle */.  int a
af30: 64 64 72 3b 0a 20 20 69 6e 74 20 61 64 64 72 4f  ddr;.  int addrO
af40: 6e 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  nce = 0;.  int i
af50: 54 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  Tab;.  ExprList 
af60: 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 6f 72  *pOrderBy = pSor
af70: 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  t->pOrderBy;.  i
af80: 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74  nt eDest = pDest
af90: 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69  ->eDest;.  int i
afa0: 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53  Parm = pDest->iS
afb0: 44 50 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65 67  DParm;.  int reg
afc0: 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f  Row;.  int regRo
afd0: 77 69 64 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  wid;.  int iCol;
afe0: 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69  .  int nKey;.  i
aff0: 6e 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20  nt iSortTab;    
b000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b010: 2a 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20  * Sorter cursor 
b020: 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
b030: 20 20 69 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b    int nSortData;
b040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b050: 20 20 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76 61    /* Trailing va
b060: 6c 75 65 73 20 74 6f 20 72 65 61 64 20 66 72 6f  lues to read fro
b070: 6d 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e  m sorter */.  in
b080: 74 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b  t i;.  int bSeq;
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0a0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
b0b0: 66 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  f sorter record 
b0c0: 69 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f  includes seq. no
b0d0: 2e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78  . */.  struct Ex
b0e0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75  prList_item *aOu
b0f0: 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  tEx = p->pEList-
b100: 3e 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  >a;..  assert( a
b110: 64 64 72 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20  ddrBreak<0 );.  
b120: 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  if( pSort->label
b130: 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c  BkOut ){.    sql
b140: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b150: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72  , OP_Gosub, pSor
b160: 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53  t->regReturn, pS
b170: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
b180: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b190: 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 42 72 65  eGoto(v, addrBre
b1a0: 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ak);.    sqlite3
b1b0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
b1c0: 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  (v, pSort->label
b1d0: 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54  BkOut);.  }.  iT
b1e0: 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75  ab = pSort->iECu
b1f0: 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73  rsor;.  if( eDes
b200: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
b210: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
b220: 75 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d  utine || eDest==
b230: 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 72  SRT_Mem ){.    r
b240: 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20  egRowid = 0;.   
b250: 20 72 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d   regRow = pDest-
b260: 3e 69 53 64 73 74 3b 0a 20 20 20 20 6e 53 6f 72  >iSdst;.    nSor
b270: 74 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b  tData = nColumn;
b280: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
b290: 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  gRowid = sqlite3
b2a0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
b2b0: 65 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d  e);.    regRow =
b2c0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
b2d0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
b2e0: 6c 75 6d 6e 29 3b 0a 20 20 20 20 6e 53 6f 72 74  lumn);.    nSort
b2f0: 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a  Data = nColumn;.
b300: 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72    }.  nKey = pOr
b310: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70  derBy->nExpr - p
b320: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20  Sort->nOBSat;.  
b330: 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46  if( pSort->sortF
b340: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
b350: 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  UseSorter ){.   
b360: 20 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20   int regSortOut 
b370: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
b380: 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d  ;.    iSortTab =
b390: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
b3a0: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  .    if( pSort->
b3b0: 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20  labelBkOut ){.  
b3c0: 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73      addrOnce = s
b3d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
b3e0: 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
b3f0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
b400: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
b410: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b420: 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f  _OpenPseudo, iSo
b430: 72 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75  rtTab, regSortOu
b440: 74 2c 20 6e 4b 65 79 2b 31 2b 6e 53 6f 72 74 44  t, nKey+1+nSortD
b450: 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 61 64  ata);.    if( ad
b460: 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33  drOnce ) sqlite3
b470: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
b480: 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61  addrOnce);.    a
b490: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
b4a0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b4b0: 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54  P_SorterSort, iT
b4c0: 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  ab, addrBreak);.
b4d0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
b4e0: 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  (v);.    codeOff
b4f0: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
b500: 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  t, addrContinue)
b510: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b520: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
b530: 72 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20  rterData, iTab, 
b540: 72 65 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72  regSortOut, iSor
b550: 74 54 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20  tTab);.    bSeq 
b560: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
b570: 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c    addr = 1 + sql
b580: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b590: 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c  , OP_Sort, iTab,
b5a0: 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62   addrBreak); Vdb
b5b0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b5c0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
b5d0: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
b5e0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69  Continue);.    i
b5f0: 53 6f 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a  SortTab = iTab;.
b600: 20 20 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20      bSeq = 1;.  
b610: 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f  }.  for(i=0, iCo
b620: 6c 3d 6e 4b 65 79 2b 62 53 65 71 2d 31 3b 20 69  l=nKey+bSeq-1; i
b630: 3c 6e 53 6f 72 74 44 61 74 61 3b 20 69 2b 2b 29  <nSortData; i++)
b640: 7b 0a 20 20 20 20 69 66 28 20 61 4f 75 74 45 78  {.    if( aOutEx
b650: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
b660: 43 6f 6c 3d 3d 30 20 29 20 69 43 6f 6c 2b 2b 3b  Col==0 ) iCol++;
b670: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6e 53 6f  .  }.  for(i=nSo
b680: 72 74 44 61 74 61 2d 31 3b 20 69 3e 3d 30 3b 20  rtData-1; i>=0; 
b690: 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 69 52  i--){.    int iR
b6a0: 65 61 64 3b 0a 20 20 20 20 69 66 28 20 61 4f 75  ead;.    if( aOu
b6b0: 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  tEx[i].u.x.iOrde
b6c0: 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  rByCol ){.      
b6d0: 69 52 65 61 64 20 3d 20 61 4f 75 74 45 78 5b 69  iRead = aOutEx[i
b6e0: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
b6f0: 6c 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  l-1;.    }else{.
b700: 20 20 20 20 20 20 69 52 65 61 64 20 3d 20 69 43        iRead = iC
b710: 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ol--;.    }.    
b720: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b730: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
b740: 69 53 6f 72 74 54 61 62 2c 20 69 52 65 61 64 2c  iSortTab, iRead,
b750: 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20   regRow+i);.    
b760: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
b770: 22 25 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e  "%s", aOutEx[i].
b780: 7a 4e 61 6d 65 20 3f 20 61 4f 75 74 45 78 5b 69  zName ? aOutEx[i
b790: 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78  ].zName : aOutEx
b7a0: 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 7d  [i].zSpan));.  }
b7b0: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
b7c0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54   ){.    case SRT
b7d0: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
b7e0: 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
b7f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b800: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
b810: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
b820: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
b830: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b840: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
b850: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20   iParm, regRow, 
b860: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
b870: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
b880: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
b890: 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72  PPEND);.      br
b8a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
b8b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
b8c0: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
b8d0: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
b8e0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
b8f0: 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  n==sqlite3Strlen
b900: 33 30 28 70 44 65 73 74 2d 3e 7a 41 66 66 53 64  30(pDest->zAffSd
b910: 73 74 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  st) );.      sql
b920: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
b930: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
b940: 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e   regRow, nColumn
b950: 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20  , regRowid,.    
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b970: 20 20 20 20 70 44 65 73 74 2d 3e 7a 41 66 66 53      pDest->zAffS
b980: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
b990: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b9a0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
b9b0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
b9c0: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ow, nColumn);.  
b9d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b9e0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
b9f0: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
ba00: 20 72 65 67 52 6f 77 69 64 2c 20 72 65 67 52 6f   regRowid, regRo
ba10: 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  w, nColumn);.   
ba20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ba30: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
ba40: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
ba50: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
ba60: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
ba70: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
ba80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ba90: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
baa0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
bab0: 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52  ssert( eDest==SR
bac0: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
bad0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
bae0: 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63   ); .      testc
baf0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
bb00: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
bb10: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
bb20: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
bb30: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
bb40: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
bb50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bb60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
bb70: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65 73  _ResultRow, pDes
bb80: 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d  t->iSdst, nColum
bb90: 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
bba0: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
bbb0: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
bbc0: 65 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  e, pDest->iSdst,
bbd0: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
bbe0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
bbf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bc00: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
bc10: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
bc20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
bc30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
bc40: 20 69 66 28 20 72 65 67 52 6f 77 69 64 20 29 7b   if( regRowid ){
bc50: 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d  .    if( eDest==
bc60: 53 52 54 5f 53 65 74 20 29 7b 0a 20 20 20 20 20  SRT_Set ){.     
bc70: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
bc80: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
bc90: 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e   regRow, nColumn
bca0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
bcb0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
bcc0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
bcd0: 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 7d  , regRow);.    }
bce0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
bcf0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
bd00: 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  e, regRowid);.  
bd10: 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f  }.  /* The botto
bd20: 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  m of the loop.  
bd30: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
bd40: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
bd50: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
bd60: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
bd70: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
bd80: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
bd90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bda0: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
bdb0: 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
bdc0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
bdd0: 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  v);.  }else{.   
bde0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bdf0: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
be00: 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65  Tab, addr); Vdbe
be10: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
be20: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 72 65  .  if( pSort->re
be30: 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69 74 65  gReturn ) sqlite
be40: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
be50: 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d  P_Return, pSort-
be60: 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 73  >regReturn);.  s
be70: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
be80: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72  eLabel(v, addrBr
be90: 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  eak);.}../*.** R
bea0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
beb0: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  to a string cont
bec0: 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c  aining the 'decl
bed0: 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66  aration type' of
bee0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
bef0: 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74  on pExpr. The st
bf00: 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61  ring may be trea
bf10: 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79  ted as static by
bf20: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
bf30: 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20 65  ** Also try to e
bf40: 73 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a 65  stimate the size
bf50: 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   of the returned
bf60: 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72   value and retur
bf70: 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74  n that.** result
bf80: 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e 0a   in *pEstWidth..
bf90: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  **.** The declar
bfa0: 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68  ation type is th
bfb0: 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65  e exact datatype
bfc0: 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72   definition extr
bfd0: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  acted from the.*
bfe0: 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54  * original CREAT
bff0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
c000: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
c010: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
c020: 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74   The.** declarat
c030: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52  ion type for a R
c040: 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e  OWID field is IN
c050: 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77  TEGER. Exactly w
c060: 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  hen an expressio
c070: 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  n.** is consider
c080: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  ed a column can 
c090: 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68  be complex in th
c0a0: 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75  e presence of su
c0b0: 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a  bqueries. The.**
c0c0: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
c0d0: 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66  ession in all of
c0e0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53   the following S
c0f0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
c100: 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72   is .** consider
c110: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74  ed a column by t
c120: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
c130: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c  .**   SELECT col
c140: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
c150: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
c160: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
c170: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
c180: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   col FROM tbl);.
c190: 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20  **   SELECT abc 
c1a0: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c  FROM (SELECT col
c1b0: 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c   AS abc FROM tbl
c1c0: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65  );.** .** The de
c1d0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
c1e0: 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  or any expressio
c1f0: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  n other than a c
c200: 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a  olumn is NULL..*
c210: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c220: 65 20 68 61 73 20 65 69 74 68 65 72 20 33 20 6f  e has either 3 o
c230: 72 20 36 20 70 61 72 61 6d 65 74 65 72 73 20 64  r 6 parameters d
c240: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
c250: 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68  her or not.** th
c260: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
c270: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20  COLUMN_METADATA 
c280: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
c290: 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a  ion is used..*/.
c2a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c2b0: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
c2c0: 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63 6f  DATA.# define co
c2d0: 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44  lumnType(A,B,C,D
c2e0: 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ,E) columnTypeIm
c2f0: 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 29 0a 23 65  pl(A,B,C,D,E).#e
c300: 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e  lse /* if !defin
c310: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
c320: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
c330: 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f  ) */.# define co
c340: 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44  lumnType(A,B,C,D
c350: 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ,E) columnTypeIm
c360: 70 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 0a 73  pl(A,B).#endif.s
c370: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c380: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c   *columnTypeImpl
c390: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
c3a0: 2a 70 4e 43 2c 20 0a 23 69 66 6e 64 65 66 20 53  *pNC, .#ifndef S
c3b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
c3c0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 45  UMN_METADATA.  E
c3d0: 78 70 72 20 2a 70 45 78 70 72 0a 23 65 6c 73 65  xpr *pExpr.#else
c3e0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a  .  Expr *pExpr,.
c3f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
c400: 7a 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74  zOrigDb,.  const
c410: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61   char **pzOrigTa
c420: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
c430: 2a 2a 70 7a 4f 72 69 67 43 6f 6c 0a 23 65 6e 64  **pzOrigCol.#end
c440: 69 66 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  if.){.  char con
c450: 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  st *zType = 0;. 
c460: 20 69 6e 74 20 6a 3b 0a 23 69 66 64 65 66 20 53   int j;.#ifdef S
c470: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
c480: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 63  UMN_METADATA.  c
c490: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
c4a0: 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  Db = 0;.  char c
c4b0: 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d  onst *zOrigTab =
c4c0: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
c4d0: 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a   *zOrigCol = 0;.
c4e0: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
c4f0: 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ( pExpr!=0 );.  
c500: 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72  assert( pNC->pSr
c510: 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73  cList!=0 );.  as
c520: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
c530: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
c540: 3b 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  ;  /* This routi
c550: 6e 65 20 72 75 6e 65 73 20 62 65 66 6f 72 65 20  ne runes before 
c560: 61 67 67 72 65 67 61 74 65 73 0a 20 20 20 20 20  aggregates.     
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c590: 20 20 2a 2a 20 61 72 65 20 70 72 6f 63 65 73 73    ** are process
c5a0: 65 64 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20  ed */.  switch( 
c5b0: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
c5c0: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
c5d0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
c5e0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
c5f0: 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74  column. Locate t
c600: 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c  he table the col
c610: 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20  umn is being.   
c620: 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20     ** extracted 
c630: 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74  from in NameCont
c640: 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68  ext.pSrcList. Th
c650: 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20  is table may be 
c660: 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61  real.      ** da
c670: 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20  tabase table or 
c680: 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  a subquery..    
c690: 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
c6a0: 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
c6b0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
c6c0: 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e  structure column
c6d0: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
c6e0: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65  om */.      Sele
c6f0: 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20  ct *pS = 0;     
c700: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
c710: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  t the column is 
c720: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a  extracted from *
c730: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  /.      int iCol
c740: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
c750: 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20  n;  /* Index of 
c760: 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a  column in pTab *
c770: 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  /.      while( p
c780: 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20  NC && !pTab ){. 
c790: 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a         SrcList *
c7a0: 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pTabList = pNC->
c7b0: 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20  pSrcList;.      
c7c0: 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62    for(j=0;j<pTab
c7d0: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
c7e0: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
c7f0: 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61  rsor!=pExpr->iTa
c800: 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20  ble;j++);.      
c810: 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74    if( j<pTabList
c820: 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ->nSrc ){.      
c830: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
c840: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
c850: 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70            pS = p
c860: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53  TabList->a[j].pS
c870: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d  elect;.        }
c880: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
c890: 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74  pNC = pNC->pNext
c8a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c8b0: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
c8c0: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
c8d0: 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65    /* At one time
c8e0: 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20 22  , code such as "
c8f0: 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69  SELECT new.x" wi
c900: 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20 77  thin a trigger w
c910: 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ould.        ** 
c920: 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69  cause this condi
c930: 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69  tion to run.  Si
c940: 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76  nce then, we hav
c950: 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20 68  e restructured h
c960: 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  ow.        ** tr
c970: 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67 65  igger code is ge
c980: 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74  nerated and so t
c990: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  his condition is
c9a0: 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20   no longer .    
c9b0: 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e      ** possible.
c9c0: 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e   However, it can
c9d0: 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66   still be true f
c9e0: 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69  or statements li
c9f0: 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ke.        ** th
ca00: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20  e following:.   
ca10: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
ca20: 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
ca30: 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52  E t1(col INTEGER
ca40: 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  );.        **   
ca50: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74  SELECT (SELECT t
ca60: 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d  1.col) FROM FROM
ca70: 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a   t1;.        **.
ca80: 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20          ** when 
ca90: 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20  columnType() is 
caa0: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78  called on the ex
cab0: 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c  pression "t1.col
cac0: 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20  " in the .      
cad0: 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e    ** sub-select.
cae0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73   In this case, s
caf0: 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  et the column ty
cb00: 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e  pe to NULL, even
cb10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75  .        ** thou
cb20: 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61  gh it should rea
cb30: 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52 22  lly be "INTEGER"
cb40: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
cb50: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
cb60: 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61  not a problem, a
cb70: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  s the column typ
cb80: 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73  e of "t1.col" is
cb90: 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a   never.        *
cba0: 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c  * used. When col
cbb0: 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c  umnType() is cal
cbc0: 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65  led on the expre
cbd0: 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a  ssion .        *
cbe0: 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f  * "(SELECT t1.co
cbf0: 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74  l)", the correct
cc00: 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e 65   type is returne
cc10: 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45  d (see the TK_SE
cc20: 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20  LECT.        ** 
cc30: 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a  branch below.  *
cc40: 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
cc50: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
cc60: 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20  assert( pTab && 
cc70: 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61  pExpr->pTab==pTa
cc80: 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b );.      if( p
cc90: 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  S ){.        /* 
cca0: 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61  The "table" is a
ccb0: 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65  ctually a sub-se
ccc0: 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69  lect or a view i
ccd0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
cce0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
ccf0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
cd00: 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65  ment. Return the
cd10: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
cd20: 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20  e and origin.   
cd30: 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72       ** data for
cd40: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20   the result-set 
cd50: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75  column of the su
cd60: 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20  b-select..      
cd70: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
cd80: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
cd90: 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <pS->pEList->nEx
cda0: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pr ){.          
cdb0: 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65  /* If iCol is le
cdc0: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
cdd0: 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
cde0: 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20  n requests the. 
cdf0: 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69           ** rowi
ce00: 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  d of the sub-sel
ce10: 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69  ect or view. Thi
ce20: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
ce30: 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20  legal (see .    
ce40: 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61        ** test ca
ce50: 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20  se misc2.2.2) - 
ce60: 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61  it always evalua
ce70: 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20  tes to NULL..   
ce80: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
ce90: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
cea0: 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45  sNC;.          E
ceb0: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
cec0: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
ced0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  pr;.          sN
cee0: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
cef0: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20  >pSrc;.         
cf00: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43   sNC.pNext = pNC
cf10: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
cf20: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
cf30: 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  arse;.          
cf40: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
cf50: 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69  pe(&sNC, p,&zOri
cf60: 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a  gDb,&zOrigTab,&z
cf70: 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20 20 20  OrigCol); .     
cf80: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
cf90: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72  {.        /* A r
cfa0: 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 61 20 43  eal table or a C
cfb0: 54 45 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  TE table */.    
cfc0: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20      assert( !pS 
cfd0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
cfe0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
cff0: 45 54 41 44 41 54 41 0a 20 20 20 20 20 20 20 20  ETADATA.        
d000: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
d010: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
d020: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d030: 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20   iCol==XN_ROWID 
d040: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
d050: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
d060: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
d070: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
d080: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
d090: 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20  GER";.          
d0a0: 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69  zOrigCol = "rowi
d0b0: 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d";.        }els
d0c0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  e{.          zOr
d0d0: 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43  igCol = pTab->aC
d0e0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
d0f0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
d100: 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54  = sqlite3ColumnT
d110: 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  ype(&pTab->aCol[
d120: 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20  iCol],0);.      
d130: 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69    }.        zOri
d140: 67 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  gTab = pTab->zNa
d150: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
d160: 70 4e 43 2d 3e 70 50 61 72 73 65 20 26 26 20 70  pNC->pParse && p
d170: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  Tab->pSchema ){.
d180: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
d190: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
d1a0: 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50  aToIndex(pNC->pP
d1b0: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
d1c0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
d1d0: 20 20 20 20 7a 4f 72 69 67 44 62 20 3d 20 70 4e      zOrigDb = pN
d1e0: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  C->pParse->db->a
d1f0: 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
d200: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73  ;.        }.#els
d210: 65 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  e.        assert
d220: 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44  ( iCol==XN_ROWID
d230: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
d240: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
d250: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
d260: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
d270: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
d280: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 7d  EGER";.        }
d290: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d2a0: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43  zType = sqlite3C
d2b0: 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62 2d  olumnType(&pTab-
d2c0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a  >aCol[iCol],0);.
d2d0: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
d2e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
d2f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
d300: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d310: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
d320: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
d330: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
d340: 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d  ession is a sub-
d350: 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74  select. Return t
d360: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
d370: 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ype and.      **
d380: 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72   origin info for
d390: 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75   the single colu
d3a0: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
d3b0: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
d3c0: 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  CT.      ** stat
d3d0: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
d3e0: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
d3f0: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c  t sNC;.      Sel
d400: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
d410: 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >x.pSelect;.    
d420: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
d430: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
d440: 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
d450: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
d460: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
d470: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
d480: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
d490: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73  S->pSrc;.      s
d4a0: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
d4b0: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
d4c0: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
d4d0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
d4e0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
d4f0: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
d500: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
d510: 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
d520: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
d530: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
d540: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
d550: 45 54 41 44 41 54 41 20 20 0a 20 20 69 66 28 20  ETADATA  .  if( 
d560: 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20  pzOrigDb ){.    
d570: 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61  assert( pzOrigTa
d580: 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29  b && pzOrigCol )
d590: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20  ;.    *pzOrigDb 
d5a0: 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a  = zOrigDb;.    *
d5b0: 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69  pzOrigTab = zOri
d5c0: 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  gTab;.    *pzOri
d5d0: 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b  gCol = zOrigCol;
d5e0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
d5f0: 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f  turn zType;.}../
d600: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
d610: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
d620: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 64  l the VDBE the d
d630: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73  eclaration types
d640: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
d650: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
d660: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d670: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
d680: 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ypes(.  Parse *p
d690: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
d6a0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
d6b0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
d6c0: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
d6d0: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
d6e0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
d6f0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
d700: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
d710: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23  sult set */.){.#
d720: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d730: 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64  IT_DECLTYPE.  Vd
d740: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
d750: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
d760: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
d770: 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  C;.  sNC.pSrcLis
d780: 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
d790: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
d7a0: 72 73 65 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74  rse;.  sNC.pNext
d7b0: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
d7c0: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
d7d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
d7e0: 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *p = pEList->a[
d7f0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f  i].pExpr;.    co
d800: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
d810: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d820: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
d830: 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20  ADATA.    const 
d840: 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20  char *zOrigDb = 
d850: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
d860: 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b  r *zOrigTab = 0;
d870: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
d880: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20  *zOrigCol = 0;. 
d890: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
d8a0: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
d8b0: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
d8c0: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a  ab, &zOrigCol);.
d8d0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65  .    /* The vdbe
d8e0: 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20 6f   must make its o
d8f0: 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  wn copy of the c
d900: 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f  olumn-type and o
d910: 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c  ther .    ** col
d920: 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74 72  umn specific str
d930: 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68  ings, in case th
d940: 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73 65  e schema is rese
d950: 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20  t before this.  
d960: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63    ** virtual mac
d970: 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e  hine is deleted.
d980: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
d990: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d9a0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d9b0: 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44  DATABASE, zOrigD
d9c0: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
d9d0: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
d9e0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d9f0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41  v, i, COLNAME_TA
da00: 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53  BLE, zOrigTab, S
da10: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
da20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
da30: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
da40: 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e  , COLNAME_COLUMN
da50: 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49  , zOrigCol, SQLI
da60: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23  TE_TRANSIENT);.#
da70: 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65 20 3d  else.    zType =
da80: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
da90: 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23  , p, 0, 0, 0);.#
daa0: 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
dab0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
dac0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45  v, i, COLNAME_DE
dad0: 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53  CLTYPE, zType, S
dae0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
daf0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
db00: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
db10: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 29 20 2a  OMIT_DECLTYPE) *
db20: 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  /.}.../*.** Comp
db30: 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ute the column n
db40: 61 6d 65 73 20 66 6f 72 20 61 20 53 45 4c 45 43  ames for a SELEC
db50: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  T statement..**.
db60: 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 67 75 61 72  ** The only guar
db70: 61 6e 74 65 65 20 74 68 61 74 20 53 51 4c 69 74  antee that SQLit
db80: 65 20 6d 61 6b 65 73 20 61 62 6f 75 74 20 63 6f  e makes about co
db90: 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 73 20 74 68  lumn names is th
dba0: 61 74 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f 6c  at if the.** col
dbb0: 75 6d 6e 20 68 61 73 20 61 6e 20 41 53 20 63 6c  umn has an AS cl
dbc0: 61 75 73 65 20 61 73 73 69 67 6e 69 6e 67 20 69  ause assigning i
dbd0: 74 20 61 20 6e 61 6d 65 2c 20 74 68 61 74 20 77  t a name, that w
dbe0: 69 6c 6c 20 62 65 20 74 68 65 20 6e 61 6d 65 20  ill be the name 
dbf0: 75 73 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69 73  used..** That is
dc00: 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65   the only docume
dc10: 6e 74 65 64 20 67 75 61 72 61 6e 74 65 65 2e 20  nted guarantee. 
dc20: 20 48 6f 77 65 76 65 72 2c 20 63 6f 75 6e 74 6c   However, countl
dc30: 65 73 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  ess applications
dc40: 0a 2a 2a 20 64 65 76 65 6c 6f 70 65 64 20 6f 76  .** developed ov
dc50: 65 72 20 74 68 65 20 79 65 61 72 73 20 68 61 76  er the years hav
dc60: 65 20 6d 61 64 65 20 62 61 73 65 6c 65 73 73 20  e made baseless 
dc70: 61 73 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f 75  assumptions abou
dc80: 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 2a  t column names.*
dc90: 2a 20 61 6e 64 20 77 69 6c 6c 20 62 72 65 61 6b  * and will break
dca0: 20 69 66 20 74 68 6f 73 65 20 61 73 73 75 6d 70   if those assump
dcb0: 74 69 6f 6e 73 20 63 68 61 6e 67 65 73 2e 20 20  tions changes.  
dcc0: 48 65 6e 63 65 2c 20 75 73 65 20 65 78 74 72 65  Hence, use extre
dcd0: 6d 65 20 63 61 75 74 69 6f 6e 0a 2a 2a 20 77 68  me caution.** wh
dce0: 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 69  en modifying thi
dcf0: 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 61 76 6f  s routine to avo
dd00: 69 64 20 62 72 65 61 6b 69 6e 67 20 6c 65 67 61  id breaking lega
dd10: 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41 6c  cy..**.** See Al
dd20: 73 6f 3a 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  so: sqlite3Colum
dd30: 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29  nsFromExprList()
dd40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 52 41 47 4d  .**.** The PRAGM
dd50: 41 20 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e  A short_column_n
dd60: 61 6d 65 73 20 61 6e 64 20 50 52 41 47 4d 41 20  ames and PRAGMA 
dd70: 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  full_column_name
dd80: 73 20 73 65 74 74 69 6e 67 73 20 61 72 65 0a 2a  s settings are.*
dd90: 2a 20 64 65 70 72 65 63 61 74 65 64 2e 20 20 54  * deprecated.  T
dda0: 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  he default setti
ddb0: 6e 67 20 69 73 20 73 68 6f 72 74 3d 4f 4e 2c 20  ng is short=ON, 
ddc0: 66 75 6c 6c 3d 4f 46 46 2e 20 20 39 39 2e 39 25  full=OFF.  99.9%
ddd0: 20 6f 66 20 61 6c 6c 0a 2a 2a 20 61 70 70 6c 69   of all.** appli
dde0: 63 61 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20 6f  cations should o
ddf0: 70 65 72 61 74 65 20 74 68 69 73 20 77 61 79 2e  perate this way.
de00: 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
de10: 77 65 20 6e 65 65 64 20 74 6f 20 73 75 70 70 6f  we need to suppo
de20: 72 74 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20  rt the.** other 
de30: 6d 6f 64 65 73 20 66 6f 72 20 6c 65 67 61 63 79  modes for legacy
de40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74  :.**.**    short
de50: 3d 4f 46 46 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20  =OFF, full=OFF: 
de60: 20 20 20 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65       Column name
de70: 20 69 73 20 74 68 65 20 74 65 78 74 20 6f 66 20   is the text of 
de80: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68  the expression h
de90: 61 73 20 69 74 0a 2a 2a 20 20 20 20 20 20 20 20  as it.**        
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
deb0: 20 20 20 20 20 20 6f 72 69 67 69 6e 61 6c 6c 79        originally
dec0: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20   appears in the 
ded0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
dee0: 2e 20 20 49 6e 0a 2a 2a 20 20 20 20 20 20 20 20  .  In.**        
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df00: 20 20 20 20 20 20 6f 74 68 65 72 20 77 6f 72 64        other word
df10: 73 2c 20 74 68 65 20 7a 53 70 61 6e 20 6f 66 20  s, the zSpan of 
df20: 74 68 65 20 72 65 73 75 6c 74 20 65 78 70 72 65  the result expre
df30: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ssion..**.**    
df40: 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f  short=ON, full=O
df50: 46 46 3a 20 20 20 20 20 20 20 28 54 68 69 73 20  FF:       (This 
df60: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 73  is the default s
df70: 65 74 74 69 6e 67 29 2e 20 20 49 66 20 74 68 65  etting).  If the
df80: 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20   result.**      
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfa0: 20 20 20 20 20 20 20 20 72 65 66 65 72 73 20 64          refers d
dfb0: 69 72 65 63 74 6c 79 20 74 6f 20 61 20 74 61 62  irectly to a tab
dfc0: 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20  le column, then 
dfd0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 20 20 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d      result colum
e000: 6e 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 74  n name is just t
e010: 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a  he table column.
e020: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e040: 6e 61 6d 65 3a 20 43 4f 4c 55 4d 4e 2e 20 20 4f  name: COLUMN.  O
e050: 74 68 65 72 77 69 73 65 20 75 73 65 20 7a 53 70  therwise use zSp
e060: 61 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 66 75 6c  an..**.**    ful
e070: 6c 3d 4f 4e 2c 20 73 68 6f 72 74 3d 41 4e 59 3a  l=ON, short=ANY:
e080: 20 20 20 20 20 20 20 49 66 20 74 68 65 20 72 65         If the re
e090: 73 75 6c 74 20 72 65 66 65 72 73 20 64 69 72 65  sult refers dire
e0a0: 63 74 6c 79 20 74 6f 20 61 20 74 61 62 6c 65 20  ctly to a table 
e0b0: 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 20 20 20 20 20  column,.**      
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0d0: 20 20 20 20 20 20 20 20 74 68 65 6e 20 74 68 65          then the
e0e0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e   result column n
e0f0: 61 6d 65 20 77 69 74 68 20 74 68 65 20 74 61 62  ame with the tab
e100: 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 20 20 20  le name.**      
e110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e120: 20 20 20 20 20 20 20 20 70 72 65 66 69 78 2c 20          prefix, 
e130: 65 78 3a 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e  ex: TABLE.COLUMN
e140: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 75 73 65  .  Otherwise use
e150: 20 7a 53 70 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69   zSpan..*/.stati
e160: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
e170: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61  olumnNames(.  Pa
e180: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
e190: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
e1a0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
e1b0: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 2f 2a 20  *pSelect     /* 
e1c0: 47 65 6e 65 72 61 74 65 20 63 6f 6c 75 6d 6e 20  Generate column 
e1d0: 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 53  names for this S
e1e0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
e1f0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
e200: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
e210: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54 61 62 6c  .  int i;.  Tabl
e220: 65 20 2a 70 54 61 62 3b 0a 20 20 53 72 63 4c 69  e *pTab;.  SrcLi
e230: 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
e240: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
e250: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
e260: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
e270: 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 3b 20 20 20  int fullName;   
e280: 20 2f 2a 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e   /* TABLE.COLUMN
e290: 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75 73 65   if no AS clause
e2a0: 20 61 6e 64 20 69 73 20 61 20 64 69 72 65 63 74   and is a direct
e2b0: 20 74 61 62 6c 65 20 72 65 66 20 2a 2f 0a 20 20   table ref */.  
e2c0: 69 6e 74 20 73 72 63 4e 61 6d 65 3b 20 20 20 20  int srcName;    
e2d0: 20 2f 2a 20 43 4f 4c 55 4d 4e 20 6f 72 20 54 41   /* COLUMN or TA
e2e0: 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f  BLE.COLUMN if no
e2f0: 20 41 53 20 63 6c 61 75 73 65 20 61 6e 64 20 69   AS clause and i
e300: 73 20 64 69 72 65 63 74 20 2a 2f 0a 0a 23 69 66  s direct */..#if
e310: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e320: 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66  _EXPLAIN.  /* If
e330: 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c   this is an EXPL
e340: 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73  AIN, skip this s
e350: 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  tep */.  if( pPa
e360: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
e370: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
e380: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50  #endif..  if( pP
e390: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
e3a0: 74 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  t || db->mallocF
e3b0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
e3c0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
e3d0: 73 20 61 72 65 20 64 65 74 65 72 6d 69 6e 65 64  s are determined
e3e0: 20 62 79 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   by the left-mos
e3f0: 74 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70  t term of a comp
e400: 6f 75 6e 64 20 73 65 6c 65 63 74 20 2a 2f 0a 20  ound select */. 
e410: 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d   while( pSelect-
e420: 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63  >pPrior ) pSelec
e430: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  t = pSelect->pPr
e440: 69 6f 72 3b 0a 20 20 53 45 4c 45 43 54 54 52 41  ior;.  SELECTTRA
e450: 43 45 28 31 2c 70 50 61 72 73 65 2c 70 53 65 6c  CE(1,pParse,pSel
e460: 65 63 74 2c 28 22 67 65 6e 65 72 61 74 69 6e 67  ect,("generating
e470: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 5c 6e 22   column names\n"
e480: 29 29 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  ));.  pTabList =
e490: 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
e4a0: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
e4b0: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73  ct->pEList;.  as
e4c0: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
e4d0: 61 73 73 65 72 74 28 20 70 54 61 62 4c 69 73 74  assert( pTabList
e4e0: 21 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  !=0 );.  pParse-
e4f0: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31  >colNamesSet = 1
e500: 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 20 3d 20 28  ;.  fullName = (
e510: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
e520: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
e530: 21 3d 30 3b 0a 20 20 73 72 63 4e 61 6d 65 20 3d  !=0;.  srcName =
e540: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
e550: 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
e560: 65 73 29 21 3d 30 20 7c 7c 20 66 75 6c 6c 4e 61  es)!=0 || fullNa
e570: 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  me;.  sqlite3Vdb
e580: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70  eSetNumCols(v, p
e590: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
e5a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
e5b0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
e5c0: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
e5d0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
e5e0: 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  r;..    assert( 
e5f0: 70 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  p!=0 );.    asse
e600: 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 47  rt( p->op!=TK_AG
e610: 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20  G_COLUMN );  /* 
e620: 41 67 67 20 70 72 6f 63 65 73 73 69 6e 67 20 68  Agg processing h
e630: 61 73 20 6e 6f 74 20 72 75 6e 20 79 65 74 20 2a  as not run yet *
e640: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
e650: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
e660: 7c 20 70 2d 3e 70 54 61 62 21 3d 30 20 29 3b 20  | p->pTab!=0 ); 
e670: 2f 2a 20 43 6f 76 65 72 69 6e 67 20 69 64 78 20  /* Covering idx 
e680: 6e 6f 74 20 79 65 74 20 63 6f 64 65 64 20 2a 2f  not yet coded */
e690: 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d  .    if( pEList-
e6a0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20  >a[i].zName ){. 
e6b0: 20 20 20 20 20 2f 2a 20 41 6e 20 41 53 20 63 6c       /* An AS cl
e6c0: 61 75 73 65 20 61 6c 77 61 79 73 20 74 61 6b 65  ause always take
e6d0: 73 20 66 69 72 73 74 20 70 72 69 6f 72 69 74 79  s first priority
e6e0: 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
e6f0: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
e700: 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[i].zName;.    
e710: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
e720: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
e730: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
e740: 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  e, SQLITE_TRANSI
e750: 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ENT);.    }else 
e760: 69 66 28 20 73 72 63 4e 61 6d 65 20 26 26 20 70  if( srcName && p
e770: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
e780: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
e790: 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Col;.      int i
e7a0: 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e  Col = p->iColumn
e7b0: 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
e7c0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 61 73  ->pTab;.      as
e7d0: 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
e7e0: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
e7f0: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
e800: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73  >iPKey;.      as
e810: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
e820: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
e830: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
e840: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
e850: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  <0 ){.        zC
e860: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
e870: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e880: 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     zCol = pTab->
e890: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
e8a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e8b0: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 20 29 7b 0a  if( fullName ){.
e8c0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
e8d0: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
e8e0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
e8f0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
e900: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
e910: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , zCol);.       
e920: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
e930: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
e940: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
e950: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
e960: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
e970: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e980: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
e990: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
e9a0: 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  , zCol, SQLITE_T
e9b0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
e9c0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
e9d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e9e0: 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  z = pEList->a[i]
e9f0: 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20  .zSpan;.      z 
ea00: 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33  = z==0 ? sqlite3
ea10: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c  MPrintf(db, "col
ea20: 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73  umn%d", i+1) : s
ea30: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
ea40: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  b, z);.      sql
ea50: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
ea60: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
ea70: 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45  _NAME, z, SQLITE
ea80: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d  _DYNAMIC);.    }
ea90: 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43  .  }.  generateC
eaa0: 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73  olumnTypes(pPars
eab0: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
eac0: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ist);.}../*.** G
ead0: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
eae0: 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20 69  on list (which i
eaf0: 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73  s really the lis
eb00: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
eb10: 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68  .** that form th
eb20: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
eb30: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
eb40: 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72  nt) compute appr
eb50: 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d  opriate.** colum
eb60: 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61  n names for a ta
eb70: 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68  ble that would h
eb80: 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
eb90: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41  on list..**.** A
eba0: 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ll column names 
ebb0: 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a  will be unique..
ebc0: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63  **.** Only the c
ebd0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20  olumn names are 
ebe0: 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d  computed.  Colum
ebf0: 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e  n.zType, Column.
ec00: 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74  zColl,.** and ot
ec10: 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f  her fields of Co
ec20: 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e  lumn are zeroed.
ec30: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
ec40: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
ec50: 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  ss.  If a memory
ec60: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
ec70: 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f  r occurs,.** sto
ec80: 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f  re NULL in *paCo
ec90: 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f  l and 0 in *pnCo
eca0: 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  l and return SQL
ecb0: 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a  ITE_NOMEM..**.**
ecc0: 20 54 68 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e   The only guaran
ecd0: 74 65 65 20 74 68 61 74 20 53 51 4c 69 74 65 20  tee that SQLite 
ece0: 6d 61 6b 65 73 20 61 62 6f 75 74 20 63 6f 6c 75  makes about colu
ecf0: 6d 6e 20 6e 61 6d 65 73 20 69 73 20 74 68 61 74  mn names is that
ed00: 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   if the.** colum
ed10: 6e 20 68 61 73 20 61 6e 20 41 53 20 63 6c 61 75  n has an AS clau
ed20: 73 65 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20  se assigning it 
ed30: 61 20 6e 61 6d 65 2c 20 74 68 61 74 20 77 69 6c  a name, that wil
ed40: 6c 20 62 65 20 74 68 65 20 6e 61 6d 65 20 75 73  l be the name us
ed50: 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69 73 20 74  ed..** That is t
ed60: 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74  he only document
ed70: 65 64 20 67 75 61 72 61 6e 74 65 65 2e 20 20 48  ed guarantee.  H
ed80: 6f 77 65 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73  owever, countles
ed90: 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a  s applications.*
eda0: 2a 20 64 65 76 65 6c 6f 70 65 64 20 6f 76 65 72  * developed over
edb0: 20 74 68 65 20 79 65 61 72 73 20 68 61 76 65 20   the years have 
edc0: 6d 61 64 65 20 62 61 73 65 6c 65 73 73 20 61 73  made baseless as
edd0: 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20  sumptions about 
ede0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20  column names.** 
edf0: 61 6e 64 20 77 69 6c 6c 20 62 72 65 61 6b 20 69  and will break i
ee00: 66 20 74 68 6f 73 65 20 61 73 73 75 6d 70 74 69  f those assumpti
ee10: 6f 6e 73 20 63 68 61 6e 67 65 73 2e 20 20 48 65  ons changes.  He
ee20: 6e 63 65 2c 20 75 73 65 20 65 78 74 72 65 6d 65  nce, use extreme
ee30: 20 63 61 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e   caution.** when
ee40: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 69 73 20   modifying this 
ee50: 72 6f 75 74 69 6e 65 20 74 6f 20 61 76 6f 69 64  routine to avoid
ee60: 20 62 72 65 61 6b 69 6e 67 20 6c 65 67 61 63 79   breaking legacy
ee70: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f  ..**.** See Also
ee80: 3a 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  : generateColumn
ee90: 4e 61 6d 65 73 28 29 0a 2a 2f 0a 69 6e 74 20 73  Names().*/.int s
eea0: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f  qlite3ColumnsFro
eeb0: 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  mExprList(.  Par
eec0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
eed0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
eee0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
eef0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
ef00: 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73       /* Expr lis
ef10: 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  t from which to 
ef20: 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61  derive column na
ef30: 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e  mes */.  i16 *pn
ef40: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
ef50: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
ef60: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
ef70: 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  here */.  Column
ef80: 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20   **paCol        
ef90: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
efa0: 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  ew column list h
efb0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ere */.){.  sqli
efc0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
efd0: 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62  ->db;   /* Datab
efe0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
eff0: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f010: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
f020: 20 2a 2f 0a 20 20 75 33 32 20 63 6e 74 3b 20 20   */.  u32 cnt;  
f030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f040: 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65 64    /* Index added
f050: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d   to make the nam
f060: 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f  e unique */.  Co
f070: 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f  lumn *aCol, *pCo
f080: 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  l;        /* For
f090: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72 65   looping over re
f0a0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
f0b0: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
f0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f0d0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
f0e0: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
f0f0: 20 73 65 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a   set */.  char *
f100: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
f110: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
f120: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  name */.  int nN
f130: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
f140: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
f150: 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d   name in zName[]
f160: 20 2a 2f 0a 20 20 48 61 73 68 20 68 74 3b 20 20   */.  Hash ht;  
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
f190: 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
f1a0: 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 48 61 73  */..  sqlite3Has
f1b0: 68 49 6e 69 74 28 26 68 74 29 3b 0a 20 20 69 66  hInit(&ht);.  if
f1c0: 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20  ( pEList ){.    
f1d0: 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
f1e0: 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d  Expr;.    aCol =
f1f0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
f200: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
f210: 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a  aCol[0])*nCol);.
f220: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 43      testcase( aC
f230: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ol==0 );.    if(
f240: 20 6e 43 6f 6c 3e 33 32 37 36 37 20 29 20 6e 43   nCol>32767 ) nC
f250: 6f 6c 20 3d 20 33 32 37 36 37 3b 0a 20 20 7d 65  ol = 32767;.  }e
f260: 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  lse{.    nCol = 
f270: 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b  0;.    aCol = 0;
f280: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
f290: 43 6f 6c 3d 3d 28 69 31 36 29 6e 43 6f 6c 20 29  Col==(i16)nCol )
f2a0: 3b 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f  ;.  *pnCol = nCo
f2b0: 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43  l;.  *paCol = aC
f2c0: 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ol;..  for(i=0, 
f2d0: 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f  pCol=aCol; i<nCo
f2e0: 6c 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  l && !db->malloc
f2f0: 46 61 69 6c 65 64 3b 20 69 2b 2b 2c 20 70 43 6f  Failed; i++, pCo
f300: 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74  l++){.    /* Get
f310: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
f320: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c  name for the col
f330: 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  umn.    */.    i
f340: 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  f( (zName = pELi
f350: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21  st->a[i].zName)!
f360: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
f370: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e  f the column con
f380: 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61  tains an "AS <na
f390: 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65  me>" phrase, use
f3a0: 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e   <name> as the n
f3b0: 61 6d 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ame */.    }else
f3c0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43  {.      Expr *pC
f3d0: 6f 6c 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  olExpr = sqlite3
f3e0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
f3f0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
f400: 70 72 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  pr);.      while
f410: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
f420: 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20  TK_DOT ){.      
f430: 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f    pColExpr = pCo
f440: 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  lExpr->pRight;. 
f450: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
f460: 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ColExpr!=0 );.  
f470: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
f480: 72 74 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  rt( pColExpr->op
f490: 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
f4a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
f4b0: 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  lExpr->op==TK_CO
f4c0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
f4d0: 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75  /* For columns u
f4e0: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  se the column na
f4f0: 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  me name */.     
f500: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43     int iCol = pC
f510: 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b  olExpr->iColumn;
f520: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
f530: 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d  pTab = pColExpr-
f540: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61  >pTab;.        a
f550: 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
f560: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
f570: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
f580: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
f590: 20 20 20 7a 4e 61 6d 65 20 3d 20 69 43 6f 6c 3e     zName = iCol>
f5a0: 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  =0 ? pTab->aCol[
f5b0: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72  iCol].zName : "r
f5c0: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
f5d0: 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d  se if( pColExpr-
f5e0: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
f5f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
f600: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
f610: 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  ColExpr, EP_IntV
f620: 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
f630: 20 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 45 78 70   zName = pColExp
f640: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
f650: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f660: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69    /* Use the ori
f670: 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68  ginal text of th
f680: 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  e column express
f690: 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20  ion as its name 
f6a0: 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  */.        zName
f6b0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
f6c0: 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  zSpan;.      }. 
f6d0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e 61     }.    if( zNa
f6e0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d  me ){.      zNam
f6f0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
f700: 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  Dup(db, zName);.
f710: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f720: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
f730: 4d 50 72 69 6e 74 66 28 64 62 2c 22 63 6f 6c 75  MPrintf(db,"colu
f740: 6d 6e 25 64 22 2c 69 2b 31 29 3b 0a 20 20 20 20  mn%d",i+1);.    
f750: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
f760: 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ure the column n
f770: 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20  ame is unique.  
f780: 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e  If the name is n
f790: 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a  ot unique,.    *
f7a0: 2a 20 61 70 70 65 6e 64 20 61 6e 20 69 6e 74 65  * append an inte
f7b0: 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20  ger to the name 
f7c0: 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d  so that it becom
f7d0: 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a  es unique..    *
f7e0: 2f 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20  /.    cnt = 0;. 
f7f0: 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 20     while( zName 
f800: 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 46 69  && sqlite3HashFi
f810: 6e 64 28 26 68 74 2c 20 7a 4e 61 6d 65 29 21 3d  nd(&ht, zName)!=
f820: 30 20 29 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65  0 ){.      nName
f830: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
f840: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  30(zName);.     
f850: 20 69 66 28 20 6e 4e 61 6d 65 3e 30 20 29 7b 0a   if( nName>0 ){.
f860: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 6e 4e          for(j=nN
f870: 61 6d 65 2d 31 3b 20 6a 3e 30 20 26 26 20 73 71  ame-1; j>0 && sq
f880: 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e 61  lite3Isdigit(zNa
f890: 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a 20  me[j]); j--){}. 
f8a0: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
f8b0: 5b 6a 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65  [j]==':' ) nName
f8c0: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = j;.      }.  
f8d0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
f8e0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
f8f0: 25 2e 2a 7a 3a 25 75 22 2c 20 6e 4e 61 6d 65 2c  %.*z:%u", nName,
f900: 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a   zName, ++cnt);.
f910: 20 20 20 20 20 20 69 66 28 20 63 6e 74 3e 33 20        if( cnt>3 
f920: 29 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d  ) sqlite3_random
f930: 6e 65 73 73 28 73 69 7a 65 6f 66 28 63 6e 74 29  ness(sizeof(cnt)
f940: 2c 20 26 63 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  , &cnt);.    }. 
f950: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
f960: 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69   zName;.    sqli
f970: 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74  te3ColumnPropert
f980: 69 65 73 46 72 6f 6d 4e 61 6d 65 28 30 2c 20 70  iesFromName(0, p
f990: 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  Col);.    if( zN
f9a0: 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48 61  ame && sqlite3Ha
f9b0: 73 68 49 6e 73 65 72 74 28 26 68 74 2c 20 7a 4e  shInsert(&ht, zN
f9c0: 61 6d 65 2c 20 70 43 6f 6c 29 3d 3d 70 43 6f 6c  ame, pCol)==pCol
f9d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f9e0: 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
f9f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
fa00: 65 33 48 61 73 68 43 6c 65 61 72 28 26 68 74 29  e3HashClear(&ht)
fa10: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
fa20: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
fa30: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  for(j=0; j<i; j+
fa40: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
fa50: 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c  3DbFree(db, aCol
fa60: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [j].zName);.    
fa70: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
fa80: 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20  ree(db, aCol);. 
fa90: 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20     *paCol = 0;. 
faa0: 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20     *pnCol = 0;. 
fab0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fac0: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
fad0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
fae0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
faf0: 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  d type and colla
fb00: 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
fb10: 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73   to a column lis
fb20: 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20  t based on.** a 
fb30: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
fb40: 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c  ..** .** The col
fb50: 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d 61  umn list presuma
fb60: 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73 65  bly came from se
fb70: 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46  lectColumnNamesF
fb80: 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a  romExprList()..*
fb90: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
fba0: 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73  t has only names
fbb0: 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20 63  , not types or c
fbc0: 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69 73  ollations.  This
fbd0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  .** routine goes
fbe0: 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64 64   through and add
fbf0: 73 20 74 68 65 20 74 79 70 65 73 20 61 6e 64 20  s the types and 
fc00: 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  collations..**.*
fc10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
fc20: 65 71 75 69 72 65 73 20 74 68 61 74 20 61 6c 6c  equires that all
fc30: 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   identifiers in 
fc40: 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  the SELECT.** st
fc50: 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c  atement be resol
fc60: 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ved..*/.void sql
fc70: 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c  ite3SelectAddCol
fc80: 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
fc90: 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ion(.  Parse *pP
fca0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
fcb0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 73  Parsing contexts
fcc0: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
fcd0: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  b,          /* A
fce0: 64 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69  dd column type i
fcf0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
fd00: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65  is table */.  Se
fd10: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
fd20: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73      /* SELECT us
fd30: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
fd40: 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74  types and collat
fd50: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ions */.){.  sql
fd60: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
fd70: 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e  e->db;.  NameCon
fd80: 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75  text sNC;.  Colu
fd90: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c  mn *pCol;.  Coll
fda0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
fdb0: 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a  t i;.  Expr *p;.
fdc0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
fdd0: 74 5f 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73  t_item *a;..  as
fde0: 73 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30  sert( pSelect!=0
fdf0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
fe00: 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
fe10: 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21   & SF_Resolved)!
fe20: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
fe30: 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c  pTab->nCol==pSel
fe40: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
fe50: 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  pr || db->malloc
fe60: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
fe70: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
fe80: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d   ) return;.  mem
fe90: 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
fea0: 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43  eof(sNC));.  sNC
feb0: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c  .pSrcList = pSel
fec0: 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d  ect->pSrc;.  a =
fed0: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
fee0: 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ->a;.  for(i=0, 
fef0: 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
ff00: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
ff10: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
ff20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
ff30: 70 65 3b 0a 20 20 20 20 69 6e 74 20 6e 2c 20 6d  pe;.    int n, m
ff40: 3b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70  ;.    p = a[i].p
ff50: 45 78 70 72 3b 0a 20 20 20 20 7a 54 79 70 65 20  Expr;.    zType 
ff60: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
ff70: 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  C, p, 0, 0, 0);.
ff80: 20 20 20 20 2f 2a 20 70 43 6f 6c 2d 3e 73 7a 45      /* pCol->szE
ff90: 73 74 20 3d 20 2e 2e 2e 20 2f 2f 20 43 6f 6c 75  st = ... // Colu
ffa0: 6d 6e 20 73 69 7a 65 20 65 73 74 20 66 6f 72 20  mn size est for 
ffb0: 53 45 4c 45 43 54 20 74 61 62 6c 65 73 20 6e 65  SELECT tables ne
ffc0: 76 65 72 20 75 73 65 64 20 2a 2f 0a 20 20 20 20  ver used */.    
ffd0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
ffe0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
fff0: 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28  nity(p);.    if(
10000 20 7a 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20   zType ){.      
10010 6d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  m = sqlite3Strle
10020 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20  n30(zType);.    
10030 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
10040 6c 65 6e 33 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  len30(pCol->zNam
10050 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e  e);.      pCol->
10060 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
10070 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64  bReallocOrFree(d
10080 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20  b, pCol->zName, 
10090 6e 2b 6d 2b 32 29 3b 0a 20 20 20 20 20 20 69 66  n+m+2);.      if
100a0 28 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b  ( pCol->zName ){
100b0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
100c0 26 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31  &pCol->zName[n+1
100d0 5d 2c 20 7a 54 79 70 65 2c 20 6d 2b 31 29 3b 0a  ], zType, m+1);.
100e0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f          pCol->co
100f0 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
10100 47 5f 48 41 53 54 59 50 45 3b 0a 20 20 20 20 20  G_HASTYPE;.     
10110 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
10120 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
10130 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  =0 ) pCol->affin
10140 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
10150 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c  _BLOB;.    pColl
10160 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
10170 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29  llSeq(pParse, p)
10180 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
10190 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d  && pCol->zColl==
101a0 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  0 ){.      pCol-
101b0 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >zColl = sqlite3
101c0 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f  DbStrDup(db, pCo
101d0 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
101e0 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a  }.  }.  pTab->sz
101f0 54 61 62 52 6f 77 20 3d 20 31 3b 20 2f 2a 20 41  TabRow = 1; /* A
10200 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ny non-zero valu
10210 65 20 77 6f 72 6b 73 20 2a 2f 0a 7d 0a 0a 2f 2a  e works */.}../*
10220 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45  .** Given a SELE
10230 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65  CT statement, ge
10240 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73  nerate a Table s
10250 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
10260 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72  scribes.** the r
10270 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61  esult set of tha
10280 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62  t SELECT..*/.Tab
10290 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c  le *sqlite3Resul
102a0 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72  tSetOfSelect(Par
102b0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
102c0 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
102d0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73  Table *pTab;.  s
102e0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
102f0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73  rse->db;.  int s
10300 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61  avedFlags;..  sa
10310 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66  vedFlags = db->f
10320 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  lags;.  db->flag
10330 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c  s &= ~SQLITE_Ful
10340 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d  lColNames;.  db-
10350 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
10360 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a  _ShortColNames;.
10370 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
10380 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c  rep(pParse, pSel
10390 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ect, 0);.  if( p
103a0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
103b0 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28  turn 0;.  while(
103c0 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
103d0 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65   ) pSelect = pSe
103e0 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  lect->pPrior;.  
103f0 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65  db->flags = save
10400 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d  dFlags;.  pTab =
10410 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
10420 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
10430 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20  Table) );.  if( 
10440 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pTab==0 ){.    r
10450 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f  eturn 0;.  }.  /
10460 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52 65 73  * The sqlite3Res
10470 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
10480 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20   is only used n 
10490 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c  contexts where l
104a0 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73  ookaside.  ** is
104b0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61   disabled */.  a
104c0 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61  ssert( db->looka
104d0 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20 29 3b  side.bDisable );
104e0 0a 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66  .  pTab->nTabRef
104f0 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e   = 1;.  pTab->zN
10500 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d  ame = 0;.  pTab-
10510 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
10520 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
10530 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
10540 34 38 35 37 36 29 20 29 3b 0a 20 20 73 71 6c 69  48576) );.  sqli
10550 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
10560 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
10570 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20  Select->pEList, 
10580 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
10590 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c  ab->aCol);.  sql
105a0 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c  ite3SelectAddCol
105b0 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
105c0 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
105d0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54  , pSelect);.  pT
105e0 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
105f0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
10600 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
10610 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
10620 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
10630 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
10640 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
10650 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45  /*.** Get a VDBE
10660 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
10670 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20  arser context.  
10680 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
10690 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
106a0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
106b0 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c  curs, return NUL
106c0 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65  L and leave a me
106d0 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
106e0 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65  .*/.Vdbe *sqlite
106f0 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a  3GetVdbe(Parse *
10700 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70  pParse){.  if( p
10710 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a  Parse->pVdbe ){.
10720 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 72 73      return pPars
10730 65 2d 3e 70 56 64 62 65 3b 0a 20 20 7d 0a 20 20  e->pVdbe;.  }.  
10740 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54 6f 70  if( pParse->pTop
10750 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 26 26 20 4f  level==0.   && O
10760 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
10770 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 53 51  ed(pParse->db,SQ
10780 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f  LITE_FactorOutCo
10790 6e 73 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 50  nst).  ){.    pP
107a0 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63  arse->okConstFac
107b0 74 6f 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  tor = 1;.  }.  r
107c0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
107d0 65 43 72 65 61 74 65 28 70 50 61 72 73 65 29 3b  eCreate(pParse);
107e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
107f0 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
10800 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
10810 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
10820 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70  ased on the.** p
10830 4c 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e  Limit expression
10840 73 2e 20 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  s.  pLimit->pLef
10850 74 20 61 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52  t and pLimit->pR
10860 69 67 68 74 20 68 6f 6c 64 20 74 68 65 20 65 78  ight hold the ex
10870 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
10880 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
10890 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
108a0 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65  tement after the
108b0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
108c0 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20  T.** keywords.  
108d0 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65  Or NULL if those
108e0 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d   keywords are om
108f0 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e  itted. iLimit an
10900 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72  d iOffset .** ar
10910 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65  e the integer me
10920 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75  mory register nu
10930 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65  mbers for counte
10940 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  rs used to compu
10950 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74  te .** the limit
10960 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66   and offset.  If
10970 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d   there is no lim
10980 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74  it and/or offset
10990 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69  , then .** iLimi
109a0 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72  t and iOffset ar
109b0 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a  e negative..**.*
109c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
109d0 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65  hanges the value
109e0 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20  s of iLimit and 
109f0 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a  iOffset only if.
10a00 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66  ** a limit or of
10a10 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20  fset is defined 
10a20 62 79 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74  by pLimit->pLeft
10a30 20 61 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69   and pLimit->pRi
10a40 67 68 74 2e 20 20 69 4c 69 6d 69 74 0a 2a 2a 20  ght.  iLimit.** 
10a50 61 6e 64 20 69 4f 66 66 73 65 74 20 73 68 6f 75  and iOffset shou
10a60 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
10a70 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
10a80 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
10a90 73 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f  s (zero).** prio
10aa0 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
10ab0 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
10ac0 20 54 68 65 20 69 4f 66 66 73 65 74 20 72 65 67   The iOffset reg
10ad0 69 73 74 65 72 20 28 69 66 20 69 74 20 65 78 69  ister (if it exi
10ae0 73 74 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69  sts) is initiali
10af0 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  zed to the value
10b00 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45  .** of the OFFSE
10b10 54 2e 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72  T.  The iLimit r
10b20 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69  egister is initi
10b30 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e  alized to LIMIT.
10b40 20 20 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f    Register.** iO
10b50 66 66 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69  ffset+1 is initi
10b60 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b  alized to LIMIT+
10b70 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  OFFSET..**.** On
10b80 6c 79 20 69 66 20 70 4c 69 6d 69 74 2d 3e 70 4c  ly if pLimit->pL
10b90 65 66 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69  eft!=0 do the li
10ba0 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65  mit registers ge
10bb0 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20  t.** redefined. 
10bc0 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
10bd0 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69  perator uses thi
10be0 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f  s property to fo
10bf0 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65  rce.** the reuse
10c00 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d   of the same lim
10c10 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65  it and offset re
10c20 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d  gisters across m
10c30 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43  ultiple.** SELEC
10c40 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  T statements..*/
10c50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d  .static void com
10c60 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
10c70 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
10c80 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
10c90 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65   iBreak){.  Vdbe
10ca0 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *v = 0;.  int i
10cb0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74  Limit = 0;.  int
10cc0 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20   iOffset;.  int 
10cd0 6e 3b 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  n;.  Expr *pLimi
10ce0 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 0a  t = p->pLimit;..
10cf0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
10d00 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
10d10 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22  .  ** "LIMIT -1"
10d20 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c   always shows al
10d30 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69  l rows.  There i
10d40 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74  s some.  ** cont
10d50 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77 68  roversy about wh
10d60 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  at the correct b
10d70 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62  ehavior should b
10d80 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72  e..  ** The curr
10d90 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
10da0 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c  on interprets "L
10db0 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a  IMIT 0" to mean.
10dc0 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20    ** no rows..  
10dd0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
10de0 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
10df0 65 29 3b 0a 20 20 69 66 28 20 70 4c 69 6d 69 74  e);.  if( pLimit
10e00 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
10e10 70 4c 69 6d 69 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c  pLimit->op==TK_L
10e20 49 4d 49 54 20 29 3b 0a 20 20 20 20 61 73 73 65  IMIT );.    asse
10e30 72 74 28 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  rt( pLimit->pLef
10e40 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69  t!=0 );.    p->i
10e50 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d  Limit = iLimit =
10e60 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
10e70 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
10e80 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
10e90 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d  .    assert( v!=
10ea0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 );.    if( sql
10eb0 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
10ec0 72 28 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c  r(pLimit->pLeft,
10ed0 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71   &n) ){.      sq
10ee0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10ef0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e  v, OP_Integer, n
10f00 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
10f10 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
10f20 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22   "LIMIT counter"
10f30 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d  ));.      if( n=
10f40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
10f50 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
10f60 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
10f70 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26  }else if( n>=0 &
10f80 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  & p->nSelectRow>
10f90 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75  sqlite3LogEst((u
10fa0 36 34 29 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  64)n) ){.       
10fb0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
10fc0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28   sqlite3LogEst((
10fd0 75 36 34 29 6e 29 3b 0a 20 20 20 20 20 20 20 20  u64)n);.        
10fe0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
10ff0 46 5f 46 69 78 65 64 4c 69 6d 69 74 3b 0a 20 20  F_FixedLimit;.  
11000 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
11010 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
11020 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
11030 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 69 4c  Limit->pLeft, iL
11040 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  imit);.      sql
11050 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
11060 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
11070 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76  iLimit); VdbeCov
11080 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
11090 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
110a0 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29  "LIMIT counter")
110b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
110c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
110d0 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20  _IfNot, iLimit, 
110e0 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
110f0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
11100 20 20 20 20 69 66 28 20 70 4c 69 6d 69 74 2d 3e      if( pLimit->
11110 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
11120 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66  p->iOffset = iOf
11130 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  fset = ++pParse-
11140 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61  >nMem;.      pPa
11150 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f  rse->nMem++;   /
11160 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78  * Allocate an ex
11170 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72  tra register for
11180 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f   limit+offset */
11190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
111a0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
111b0 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 2c 20 69  Limit->pRight, i
111c0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
111d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
111e0 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
111f0 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65  , iOffset); Vdbe
11200 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
11210 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
11220 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74  v, "OFFSET count
11230 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  er"));.      sql
11240 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
11250 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74  , OP_OffsetLimit
11260 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65  , iLimit, iOffse
11270 74 2b 31 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  t+1, iOffset);. 
11280 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
11290 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53  ((v, "LIMIT+OFFS
112a0 45 54 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ET"));.    }.  }
112b0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
112c0 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
112d0 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65  _SELECT./*.** Re
112e0 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
112f0 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  iate collating s
11300 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
11310 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
11320 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  f.** the result 
11330 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  set for the comp
11340 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74  ound-select stat
11350 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75  ement "p".  Retu
11360 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68  rn NULL if.** th
11370 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20  e column has no 
11380 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
11390 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
113a0 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
113b0 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
113c0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
113d0 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74   is taken from t
113e0 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
113f0 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65  term of the sele
11400 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  ct that has a co
11410 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
11420 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c  ..*/.static Coll
11430 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  Seq *multiSelect
11440 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
11450 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
11460 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43  , int iCol){.  C
11470 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20  ollSeq *pRet;.  
11480 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
11490 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74  .    pRet = mult
114a0 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
114b0 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72  Parse, p->pPrior
114c0 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65  , iCol);.  }else
114d0 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  {.    pRet = 0;.
114e0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43    }.  assert( iC
114f0 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43  ol>=0 );.  /* iC
11500 6f 6c 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20  ol must be less 
11510 74 68 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  than p->pEList->
11520 6e 45 78 70 72 2e 20 20 4f 74 68 65 72 77 69 73  nExpr.  Otherwis
11530 65 20 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64  e an error would
11540 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
11550 74 68 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61  thrown during na
11560 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e  me resolution an
11570 64 20 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68  d we would not h
11580 61 76 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20  ave gotten.  ** 
11590 74 68 69 73 20 66 61 72 20 2a 2f 0a 20 20 69 66  this far */.  if
115a0 28 20 70 52 65 74 3d 3d 30 20 26 26 20 41 4c 57  ( pRet==0 && ALW
115b0 41 59 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69  AYS(iCol<p->pELi
115c0 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
115d0 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
115e0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
115f0 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  se, p->pEList->a
11600 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20  [iCol].pExpr);. 
11610 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
11620 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
11630 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
11640 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
11650 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
11660 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
11670 45 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f  ECT.** with an O
11680 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
11690 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
116a0 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75  locates and retu
116b0 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a  rns a KeyInfo.**
116c0 20 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61   structure suita
116d0 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e  ble for implemen
116e0 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
116f0 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  Y..**.** Space t
11700 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e  o hold the KeyIn
11710 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
11720 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
11730 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e  lloc. The callin
11740 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  g.** function is
11750 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
11760 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74   ensuring that t
11770 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
11780 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
11790 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  reed..*/.static 
117a0 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65  KeyInfo *multiSe
117b0 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
117c0 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
117d0 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
117e0 20 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72   nExtra){.  Expr
117f0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
11800 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
11810 69 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  int nOrderBy = p
11820 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
11830 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r;.  sqlite3 *db
11840 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
11850 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d   KeyInfo *pRet =
11860 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
11870 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42  lloc(db, nOrderB
11880 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20  y+nExtra, 1);.  
11890 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
118a0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
118b0 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
118c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
118d0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
118e0 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65   *pItem = &pOrde
118f0 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  rBy->a[i];.     
11900 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70   Expr *pTerm = p
11910 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
11920 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
11930 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54  l;..      if( pT
11940 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  erm->flags & EP_
11950 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
11960 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
11970 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
11980 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20  arse, pTerm);.  
11990 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
119a0 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69     pColl = multi
119b0 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
119c0 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e  arse, p, pItem->
119d0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d  u.x.iOrderByCol-
119e0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
119f0 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c  pColl==0 ) pColl
11a00 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
11a10 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
11a20 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  By->a[i].pExpr =
11a30 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11a40 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
11a50 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70  String(pParse, p
11a60 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  Term, pColl->zNa
11a70 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
11a80 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
11a90 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
11aa0 61 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20  able(pRet) );.  
11ab0 20 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b      pRet->aColl[
11ac0 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
11ad0 20 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64    pRet->aSortOrd
11ae0 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79  er[i] = pOrderBy
11af0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
11b00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
11b10 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23  eturn pRet;.}..#
11b20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11b30 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69  IT_CTE./*.** Thi
11b40 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
11b50 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f  tes VDBE code to
11b60 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e   compute the con
11b70 74 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52  tent of a WITH R
11b80 45 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72  ECURSIVE.** quer
11b90 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  y of the form:.*
11ba0 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76  *.**   <recursiv
11bb0 65 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65  e-table> AS (<se
11bc0 74 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e  tup-query> UNION
11bd0 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76   [ALL] <recursiv
11be0 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20  e-query>).**    
11bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c00 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
11c10 5f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  _/             \
11c20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
11c30 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
11c50 3e 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20  >pPrior         
11c60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a               p.*
11c70 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  *.**.** There is
11c80 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66   exactly one ref
11c90 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65  erence to the re
11ca0 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e  cursive-table in
11cb0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
11cc0 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65  .** of recursive
11cd0 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77  -query, marked w
11ce0 69 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d  ith the SrcList-
11cf0 3e 61 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72 73  >a[].fg.isRecurs
11d00 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20  ive flag..**.** 
11d10 54 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20  The setup-query 
11d20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e  runs once to gen
11d30 65 72 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c  erate an initial
11d40 20 73 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61   set of rows tha
11d50 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51  t go.** into a Q
11d60 75 65 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77  ueue table.  Row
11d70 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20  s are extracted 
11d80 66 72 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74  from the Queue t
11d90 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f  able one by.** o
11da0 6e 65 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78  ne.  Each row ex
11db0 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65  tracted from Que
11dc0 75 65 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20  ue is output to 
11dd0 70 44 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65  pDest.  Then the
11de0 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61   single.** extra
11df0 63 74 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e  cted row (now in
11e00 20 74 68 65 20 69 43 75 72 72 65 6e 74 20 74 61   the iCurrent ta
11e10 62 6c 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65  ble) becomes the
11e20 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a   content of the.
11e30 2a 2a 20 72 65 63 75 72 73 69 76 65 2d 74 61 62  ** recursive-tab
11e40 6c 65 20 66 6f 72 20 61 20 72 65 63 75 72 73 69  le for a recursi
11e50 76 65 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54  ve-query run.  T
11e60 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
11e70 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79   recursive-query
11e80 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 62 61 63  .** is added bac
11e90 6b 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65  k into the Queue
11ea0 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e   table.  Then an
11eb0 6f 74 68 65 72 20 72 6f 77 20 69 73 20 65 78 74  other row is ext
11ec0 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75  racted from Queu
11ed0 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65  e.** and the ite
11ee0 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ration continues
11ef0 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65   until the Queue
11f00 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
11f10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
11f20 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65  mpound query ope
11f30 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74  rator is UNION t
11f40 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65  hen no duplicate
11f50 20 72 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a   rows are ever.*
11f60 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  * inserted into 
11f70 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e  the Queue table.
11f80 20 20 54 68 65 20 69 44 69 73 74 69 6e 63 74 20    The iDistinct 
11f90 74 61 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f  table keeps a co
11fa0 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a  py of all rows.*
11fb0 2a 20 74 68 61 74 20 68 61 76 65 20 65 76 65 72  * that have ever
11fc0 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69   been inserted i
11fd0 6e 74 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61  nto Queue and ca
11fe0 75 73 65 73 20 64 75 70 6c 69 63 61 74 65 73 20  uses duplicates 
11ff0 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64  to be.** discard
12000 65 64 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72  ed.  If the oper
12010 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c  ator is UNION AL
12020 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74  L, then duplicat
12030 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  es are allowed..
12040 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75  ** .** If the qu
12050 65 72 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52  ery has an ORDER
12060 20 42 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65   BY, then entrie
12070 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 74  s in the Queue t
12080 61 62 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e  able are kept in
12090 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64  .** ORDER BY ord
120a0 65 72 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  er and the first
120b0 20 65 6e 74 72 79 20 69 73 20 65 78 74 72 61 63   entry is extrac
120c0 74 65 64 20 66 6f 72 20 65 61 63 68 20 63 79 63  ted for each cyc
120d0 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20  le.  Without.** 
120e0 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65  an ORDER BY, the
120f0 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20   Queue table is 
12100 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a  just a FIFO..**.
12110 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c  ** If a LIMIT cl
12120 61 75 73 65 20 69 73 20 70 72 6f 76 69 64 65 64  ause is provided
12130 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61  , then the itera
12140 74 69 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72  tion stops after
12150 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68   LIMIT rows.** h
12160 61 76 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20  ave been output 
12170 74 6f 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d  to pDest.  A LIM
12180 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73  IT of zero means
12190 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f   to output no ro
121a0 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61  ws and a.** nega
121b0 74 69 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73  tive LIMIT means
121c0 20 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72   to output all r
121d0 6f 77 73 2e 20 20 49 66 20 74 68 65 72 65 20 69  ows.  If there i
121e0 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54  s also an OFFSET
121f0 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20   clause.** with 
12200 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  a positive value
12210 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
12220 20 4f 46 46 53 45 54 20 6f 75 74 70 75 74 73 20   OFFSET outputs 
12230 61 72 65 20 64 69 73 63 61 72 64 65 64 20 72 61  are discarded ra
12240 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69  ther.** than bei
12250 6e 67 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74  ng sent to pDest
12260 2e 20 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75  .  The LIMIT cou
12270 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  nt does not begi
12280 6e 20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46  n until after OF
12290 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76  FSET.** rows hav
122a0 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a  e been skipped..
122b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
122c0 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72  enerateWithRecur
122d0 73 69 76 65 51 75 65 72 79 28 0a 20 20 50 61 72  siveQuery(.  Par
122e0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
122f0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
12300 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
12310 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
12320 20 2f 2a 20 54 68 65 20 72 65 63 75 72 73 69 76   /* The recursiv
12330 65 20 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63  e SELECT to be c
12340 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
12350 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
12360 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
12370 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
12380 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
12390 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
123a0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
123b0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
123c0 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79   recursive query
123d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d   */.  int nCol =
123e0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
123f0 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  r;  /* Number of
12400 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
12410 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 20  recursive table 
12420 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
12430 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
12440 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
12450 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64  ed statement und
12460 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
12470 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
12480 74 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  tup = p->pPrior;
12490 20 20 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20     /* The setup 
124a0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61  query */.  int a
124b0 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20  ddrTop;         
124c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
124d0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  of the loop */. 
124e0 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61   int addrCont, a
124f0 64 64 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f  ddrBreak;      /
12500 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42  * CONTINUE and B
12510 52 45 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a  REAK addresses *
12520 2f 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74  /.  int iCurrent
12530 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
12540 20 20 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74    /* The Current
12550 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
12560 72 65 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20  regCurrent;     
12570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
12580 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75  ister holding Cu
12590 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20  rrent table */. 
125a0 20 69 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20   int iQueue;    
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
125c0 2a 20 54 68 65 20 51 75 65 75 65 20 74 61 62 6c  * The Queue tabl
125d0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74  e */.  int iDist
125e0 69 6e 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20  inct = 0;       
125f0 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72       /* To ensur
12600 65 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73  e unique results
12610 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69   if UNION */.  i
12620 6e 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46  nt eDest = SRT_F
12630 69 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ifo;         /* 
12640 48 6f 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20  How to write to 
12650 51 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63  Queue */.  Selec
12660 74 44 65 73 74 20 64 65 73 74 51 75 65 75 65 3b  tDest destQueue;
12670 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
12680 63 74 44 65 73 74 20 74 61 72 67 65 74 74 69 6e  ctDest targettin
12690 67 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  g the Queue tabl
126a0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126c0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
126d0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
126e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
126f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
12700 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72  t code */.  Expr
12710 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
12720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12730 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
12740 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d   */.  Expr *pLim
12750 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
12760 20 20 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d      /* Saved LIM
12770 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f  IT and OFFSET */
12780 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c  .  int regLimit,
12790 20 72 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20   regOffset;     
127a0 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 75 73   /* Registers us
127b0 65 64 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20  ed by LIMIT and 
127c0 4f 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20  OFFSET */..  /* 
127d0 4f 62 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61  Obtain authoriza
127e0 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63  tion to do a rec
127f0 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a  ursive query */.
12800 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
12810 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
12820 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c  QLITE_RECURSIVE,
12830 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75   0, 0, 0) ) retu
12840 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73  rn;..  /* Proces
12850 73 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  s the LIMIT and 
12860 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20  OFFSET clauses, 
12870 69 66 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f  if they exist */
12880 0a 20 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73  .  addrBreak = s
12890 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
128a0 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65  bel(v);.  p->nSe
128b0 6c 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20  lectRow = 320;  
128c0 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77  /* 4 billion row
128d0 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69  s */.  computeLi
128e0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
128f0 72 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61  rse, p, addrBrea
12900 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70  k);.  pLimit = p
12910 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4c  ->pLimit;.  regL
12920 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
12930 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20 3d 20  ;.  regOffset = 
12940 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d  p->iOffset;.  p-
12950 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >pLimit = 0;.  p
12960 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f  ->iLimit = p->iO
12970 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72  ffset = 0;.  pOr
12980 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
12990 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  rBy;..  /* Locat
129a0 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  e the cursor num
129b0 62 65 72 20 6f 66 20 74 68 65 20 43 75 72 72 65  ber of the Curre
129c0 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f  nt table */.  fo
129d0 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c  r(i=0; ALWAYS(i<
129e0 70 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b  pSrc->nSrc); i++
129f0 29 7b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  ){.    if( pSrc-
12a00 3e 61 5b 69 5d 2e 66 67 2e 69 73 52 65 63 75 72  >a[i].fg.isRecur
12a10 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43  sive ){.      iC
12a20 75 72 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61  urrent = pSrc->a
12a30 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20  [i].iCursor;.   
12a40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
12a50 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
12a60 74 65 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65  te cursors numbe
12a70 72 73 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64  rs for Queue and
12a80 20 44 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20   Distinct.  The 
12a90 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
12aa0 72 0a 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69  r.  ** the Disti
12ab0 6e 63 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62  nct table must b
12ac0 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72  e exactly one gr
12ad0 65 61 74 65 72 20 74 68 61 6e 20 51 75 65 75 65  eater than Queue
12ae0 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66   in order.  ** f
12af0 6f 72 20 74 68 65 20 53 52 54 5f 44 69 73 74 46  or the SRT_DistF
12b00 69 66 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74  ifo and SRT_Dist
12b10 51 75 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f  Queue destinatio
12b20 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20  ns to work. */. 
12b30 20 69 51 75 65 75 65 20 3d 20 70 50 61 72 73 65   iQueue = pParse
12b40 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20  ->nTab++;.  if( 
12b50 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
12b60 29 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70  ){.    eDest = p
12b70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69  OrderBy ? SRT_Di
12b80 73 74 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69  stQueue : SRT_Di
12b90 73 74 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73  stFifo;.    iDis
12ba0 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
12bb0 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  nTab++;.  }else{
12bc0 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72  .    eDest = pOr
12bd0 64 65 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75  derBy ? SRT_Queu
12be0 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20  e : SRT_Fifo;.  
12bf0 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  }.  sqlite3Selec
12c00 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 51  tDestInit(&destQ
12c10 75 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75  ueue, eDest, iQu
12c20 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  eue);..  /* Allo
12c30 63 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72  cate cursors for
12c40 20 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c   Current, Queue,
12c50 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a   and Distinct. *
12c60 2f 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d  /.  regCurrent =
12c70 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
12c80 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12c90 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
12ca0 73 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c  seudo, iCurrent,
12cb0 20 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f   regCurrent, nCo
12cc0 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72  l);.  if( pOrder
12cd0 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  By ){.    KeyInf
12ce0 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75  o *pKeyInfo = mu
12cf0 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
12d00 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
12d10 70 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, 1);.    sqlit
12d20 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
12d30 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
12d40 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72  , iQueue, pOrder
12d50 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a  By->nExpr+2, 0,.
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d70 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
12d80 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
12d90 4f 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75  O);.    destQueu
12da0 65 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  e.pOrderBy = pOr
12db0 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a  derBy;.  }else{.
12dc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12dd0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
12de0 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75  Ephemeral, iQueu
12df0 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20  e, nCol);.  }.  
12e00 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
12e10 22 51 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b  "Queue table"));
12e20 0a 20 20 69 66 28 20 69 44 69 73 74 69 6e 63 74  .  if( iDistinct
12e30 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f   ){.    p->addrO
12e40 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c  penEphm[0] = sql
12e50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12e60 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
12e70 61 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30  al, iDistinct, 0
12e80 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  );.    p->selFla
12e90 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68  gs |= SF_UsesEph
12ea0 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f  emeral;.  }..  /
12eb0 2a 20 44 65 74 61 63 68 20 74 68 65 20 4f 52 44  * Detach the ORD
12ec0 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f  ER BY clause fro
12ed0 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53  m the compound S
12ee0 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f  ELECT */.  p->pO
12ef0 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f  rderBy = 0;..  /
12f00 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
12f10 6c 74 73 20 6f 66 20 74 68 65 20 73 65 74 75 70  lts of the setup
12f20 2d 71 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e  -query in Queue.
12f30 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e   */.  pSetup->pN
12f40 65 78 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  ext = 0;.  rc = 
12f50 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
12f60 61 72 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64  arse, pSetup, &d
12f70 65 73 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65  estQueue);.  pSe
12f80 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  tup->pNext = p;.
12f90 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
12fa0 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65  end_of_recursive
12fb0 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69  _query;..  /* Fi
12fc0 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  nd the next row 
12fd0 69 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e 64  in the Queue and
12fe0 20 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f 77   output that row
12ff0 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20   */.  addrTop = 
13000 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13010 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
13020 69 51 75 65 75 65 2c 20 61 64 64 72 42 72 65 61  iQueue, addrBrea
13030 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
13040 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73  (v);..  /* Trans
13050 66 65 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77  fer the next row
13060 20 69 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74   in Queue over t
13070 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73  o Current */.  s
13080 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
13090 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
130a0 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f  iCurrent); /* To
130b0 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61   reset column ca
130c0 63 68 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  che */.  if( pOr
130d0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
130e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
130f0 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75  , OP_Column, iQu
13100 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  eue, pOrderBy->n
13110 45 78 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65  Expr+1, regCurre
13120 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nt);.  }else{.  
13130 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13140 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74  Op2(v, OP_RowDat
13150 61 2c 20 69 51 75 65 75 65 2c 20 72 65 67 43 75  a, iQueue, regCu
13160 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71  rrent);.  }.  sq
13170 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
13180 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51  v, OP_Delete, iQ
13190 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74  ueue);..  /* Out
131a0 70 75 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72  put the single r
131b0 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f  ow in Current */
131c0 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71  .  addrCont = sq
131d0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
131e0 65 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66  el(v);.  codeOff
131f0 73 65 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74  set(v, regOffset
13200 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73  , addrCont);.  s
13210 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
13220 50 61 72 73 65 2c 20 70 2c 20 69 43 75 72 72 65  Parse, p, iCurre
13230 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20  nt,.      0, 0, 
13240 70 44 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c  pDest, addrCont,
13250 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69   addrBreak);.  i
13260 66 28 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20  f( regLimit ){. 
13270 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13280 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a  dOp2(v, OP_DecrJ
13290 75 6d 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69  umpZero, regLimi
132a0 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  t, addrBreak);. 
132b0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
132c0 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  v);.  }.  sqlite
132d0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
132e0 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a  l(v, addrCont);.
132f0 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68  .  /* Execute th
13300 65 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45  e recursive SELE
13310 43 54 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69  CT taking the si
13320 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72  ngle row in Curr
13330 65 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ent as.  ** the 
13340 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65  value for the re
13350 63 75 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53  cursive-table. S
13360 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
13370 20 69 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20   in the Queue.. 
13380 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
13390 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
133a0 67 61 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  gate ){.    sqli
133b0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
133c0 73 65 2c 20 22 72 65 63 75 72 73 69 76 65 20 61  se, "recursive a
133d0 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
133e0 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 29   not supported")
133f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
13400 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
13410 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
13420 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
13430 51 75 65 75 65 29 3b 0a 20 20 20 20 61 73 73 65  Queue);.    asse
13440 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  rt( p->pPrior==0
13450 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f   );.    p->pPrio
13460 72 20 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a  r = pSetup;.  }.
13470 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69  .  /* Keep runni
13480 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69  ng the loop unti
13490 6c 20 74 68 65 20 51 75 65 75 65 20 69 73 20 65  l the Queue is e
134a0 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mpty */.  sqlite
134b0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
134c0 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  rTop);.  sqlite3
134d0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
134e0 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  (v, addrBreak);.
134f0 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76  .end_of_recursiv
13500 65 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74  e_query:.  sqlit
13510 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
13520 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
13530 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e  pOrderBy);.  p->
13540 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
13550 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  rBy;.  p->pLimit
13560 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 72 65 74   = pLimit;.  ret
13570 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  urn;.}.#endif /*
13580 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
13590 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20   */../* Forward 
135a0 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74  references */.st
135b0 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
135c0 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50  lectOrderBy(.  P
135d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
135e0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
135f0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
13600 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
13610 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
13620 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
13630 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
13640 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
13650 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
13660 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
13670 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f  results */.);../
13680 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20 74 68 65 20  *.** Handle the 
13690 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20  special case of 
136a0 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  a compound-selec
136b0 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65  t that originate
136c0 73 20 66 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55  s from a.** VALU
136d0 45 53 20 63 6c 61 75 73 65 2e 20 20 42 79 20 68  ES clause.  By h
136e0 61 6e 64 6c 69 6e 67 20 74 68 69 73 20 61 73 20  andling this as 
136f0 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 2c 20  a special case, 
13700 77 65 20 61 76 6f 69 64 20 64 65 65 70 0a 2a 2a  we avoid deep.**
13710 20 72 65 63 75 72 73 69 6f 6e 2c 20 61 6e 64 20   recursion, and 
13720 74 68 75 73 20 64 6f 20 6e 6f 74 20 6e 65 65 64  thus do not need
13730 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 65 20   to enforce the 
13740 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d  SQLITE_LIMIT_COM
13750 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a 20  POUND_SELECT.** 
13760 6f 6e 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75  on a VALUES clau
13770 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73  se..**.** Becaus
13780 65 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a  e the Select obj
13790 65 63 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66  ect originates f
137a0 72 6f 6d 20 61 20 56 41 4c 55 45 53 20 63 6c 61  rom a VALUES cla
137b0 75 73 65 3a 0a 2a 2a 20 20 20 28 31 29 20 54 68  use:.**   (1) Th
137c0 65 72 65 20 69 73 20 6e 6f 20 4c 49 4d 49 54 20  ere is no LIMIT 
137d0 6f 72 20 4f 46 46 53 45 54 20 6f 72 20 65 6c 73  or OFFSET or els
137e0 65 20 74 68 65 72 65 20 69 73 20 61 20 4c 49 4d  e there is a LIM
137f0 49 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31 0a  IT of exactly 1.
13800 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65 72  **   (2) All ter
13810 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c  ms are UNION ALL
13820 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65 20  .**   (3) There 
13830 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  is no ORDER BY c
13840 6c 61 75 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lause.**.** The 
13850 22 4c 49 4d 49 54 20 6f 66 20 65 78 61 63 74 6c  "LIMIT of exactl
13860 79 20 31 22 20 63 61 73 65 20 6f 66 20 63 6f 6e  y 1" case of con
13870 64 69 74 69 6f 6e 20 28 31 29 20 63 6f 6d 65 73  dition (1) comes
13880 20 61 62 6f 75 74 20 77 68 65 6e 20 61 20 56 41   about when a VA
13890 4c 55 45 53 0a 2a 2a 20 63 6c 61 75 73 65 20 6f  LUES.** clause o
138a0 63 63 75 72 73 20 77 69 74 68 69 6e 20 73 63 61  ccurs within sca
138b0 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 28  lar expression (
138c0 65 78 3a 20 22 53 45 4c 45 43 54 20 28 56 41 4c  ex: "SELECT (VAL
138d0 55 45 53 28 31 29 2c 28 32 29 2c 28 33 29 29 22  UES(1),(2),(3))"
138e0 29 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  )..** The sqlite
138f0 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 20 77  3CodeSubselect w
13900 69 6c 6c 20 68 61 76 65 20 61 64 64 65 64 20 74  ill have added t
13910 68 65 20 4c 49 4d 49 54 20 31 20 63 6c 61 75 73  he LIMIT 1 claus
13920 65 20 69 6e 20 74 68 74 20 63 61 73 65 2e 0a 2a  e in tht case..*
13930 2a 20 53 69 6e 63 65 20 74 68 65 20 6c 69 6d 69  * Since the limi
13940 74 20 69 73 20 65 78 61 63 74 6c 79 20 31 2c 20  t is exactly 1, 
13950 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20  we only need to 
13960 65 76 61 6c 75 74 65 73 20 74 68 65 20 6c 65 66  evalutes the lef
13970 74 2d 6d 6f 73 74 20 56 41 4c 55 45 53 2e 0a 2a  t-most VALUES..*
13980 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
13990 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 0a  tiSelectValues(.
139a0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
139b0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
139c0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
139d0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
139e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
139f0 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
13a00 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
13a10 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
13a20 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
13a30 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
13a40 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
13a50 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
13a60 72 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 52 69  r;.  Select *pRi
13a70 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 69  ghtmost = p;.  i
13a80 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69  nt nRow = 1;.  i
13a90 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 61 73 73  nt rc = 0;.  ass
13aa0 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
13ab0 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65   & SF_MultiValue
13ac0 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73   );.  do{.    as
13ad0 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
13ae0 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b  s & SF_Values );
13af0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
13b00 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70  op==TK_ALL || (p
13b10 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
13b20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29  && p->pPrior==0)
13b30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13b40 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  p->pNext==0 || p
13b50 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  ->pEList->nExpr=
13b60 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73  =p->pNext->pELis
13b70 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
13b80 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  if( p->pPrior==0
13b90 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73   ) break;.    as
13ba0 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d  sert( p->pPrior-
13bb0 3e 70 4e 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20  >pNext==p );.   
13bc0 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a   p = p->pPrior;.
13bd0 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 7d 77      nRow++;.  }w
13be0 68 69 6c 65 28 31 29 3b 0a 20 20 77 68 69 6c 65  hile(1);.  while
13bf0 28 20 70 20 29 7b 0a 20 20 20 20 70 50 72 69 6f  ( p ){.    pPrio
13c00 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
13c10 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
13c20 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
13c30 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
13c40 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20   p, pDest);.    
13c50 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
13c60 6f 72 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c  or;.    if( rc |
13c70 7c 20 70 52 69 67 68 74 6d 6f 73 74 2d 3e 70 4c  | pRightmost->pL
13c80 69 6d 69 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  imit ) break;.  
13c90 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
13ca0 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20  = nRow;.    p = 
13cb0 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
13cc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13cd0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13ce0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
13cf0 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ocess a compound
13d00 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d   query form from
13d10 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  .** two or more 
13d20 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73  separate queries
13d30 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e   using UNION, UN
13d40 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c  ION ALL, EXCEPT,
13d50 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54   or.** INTERSECT
13d60 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74  .**.** "p" point
13d70 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
13d80 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71  ost of the two q
13d90 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65  ueries.  the que
13da0 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66  ry on the.** lef
13db0 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20  t is p->pPrior. 
13dc0 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20   The left query 
13dd0 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20  could also be a 
13de0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a  compound query.*
13df0 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  * in which case 
13e00 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
13e10 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75  l be called recu
13e20 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20  rsively. .**.** 
13e30 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  The results of t
13e40 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61  he total query a
13e50 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  re to be written
13e60 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74   into a destinat
13e70 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65  ion.** of type e
13e80 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65  Dest with parame
13e90 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ter iParm..**.**
13ea0 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e   Example 1:  Con
13eb0 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61  sider a three-wa
13ec0 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73  y compound SQL s
13ed0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
13ee0 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
13ef0 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t1 UNION SELEC
13f00 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T b FROM t2 UNIO
13f10 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20  N SELECT c FROM 
13f20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74  t3.**.** This st
13f30 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
13f40 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d up as follows:
13f50 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
13f60 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20  T c FROM t3.**  
13f70 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d      |.**      `-
13f80 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20  ---->  SELECT b 
13f90 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20  FROM t2.**      
13fa0 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20            |.**  
13fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d                `-
13fc0 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61  ----->  SELECT a
13fd0 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54   FROM t1.**.** T
13fe0 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65  he arrows in the
13ff0 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72   diagram above r
14000 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c  epresent the Sel
14010 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74  ect.pPrior point
14020 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69  er..** So if thi
14030 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
14040 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c  led with p equal
14050 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79   to the t3 query
14060 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72  , then.** pPrior
14070 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20   will be the t2 
14080 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69  query.  p->op wi
14090 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69  ll be TK_UNION i
140a0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
140b0 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62  ** Notice that b
140c0 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
140d0 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20  y SQLite parses 
140e0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  compound SELECTs
140f0 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  , the.** individ
14100 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61  ual selects alwa
14110 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65  ys group from le
14120 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a  ft to right..*/.
14130 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
14140 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
14150 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
14160 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
14170 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
14180 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
14190 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
141a0 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
141b0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
141c0 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
141d0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
141e0 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
141f0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ts */.){.  int r
14200 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
14210 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65   /* Success code
14220 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69   from a subrouti
14230 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ne */.  Select *
14240 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
14250 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
14260 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
14270 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
14280 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
14290 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
142a0 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
142b0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
142c0 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41   dest;      /* A
142d0 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20  lternative data 
142e0 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
142f0 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65   Select *pDelete
14300 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20   = 0;  /* Chain 
14310 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  of simple select
14320 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  s to delete */. 
14330 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
14340 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
14350 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
14360 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14370 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
14380 6e 74 20 69 53 75 62 31 20 3d 20 30 3b 20 20 20  nt iSub1 = 0;   
14390 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
143a0 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72  f left-hand quer
143b0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  y */.  int iSub2
143c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
143d0 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d  EQP id of right-
143e0 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65  hand query */.#e
143f0 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ndif..  /* Make 
14400 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
14410 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
14420 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69  IT clause on pri
14430 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c  or SELECTs.  Onl
14440 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20  y.  ** the last 
14450 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c  (right-most) SEL
14460 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65  ECT in the serie
14470 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52  s may have an OR
14480 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e  DER BY or LIMIT.
14490 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
144a0 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29  p && p->pPrior )
144b0 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75  ;  /* Calling fu
144c0 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65  nction guarantee
144d0 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20  s this much */. 
144e0 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
144f0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
14500 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f  sive)==0 || p->o
14510 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e  p==TK_ALL || p->
14520 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
14530 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
14540 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d  b;.  pPrior = p-
14550 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20  >pPrior;.  dest 
14560 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20  = *pDest;.  if( 
14570 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
14580 20 7c 7c 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d   || pPrior->pLim
14590 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
145a0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
145b0 2c 22 25 73 20 63 6c 61 75 73 65 20 73 68 6f 75  ,"%s clause shou
145c0 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
145d0 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
145e0 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64      pPrior->pOrd
145f0 65 72 42 79 21 3d 30 20 3f 20 22 4f 52 44 45 52  erBy!=0 ? "ORDER
14600 20 42 59 22 20 3a 20 22 4c 49 4d 49 54 22 2c 20   BY" : "LIMIT", 
14610 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
14620 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
14630 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
14640 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
14650 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
14660 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
14670 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
14680 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61  ;  /* The VDBE a
14690 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62  lready created b
146a0 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  y calling functi
146b0 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61  on */..  /* Crea
146c0 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  te the destinati
146d0 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  on temporary tab
146e0 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a  le if necessary.
146f0 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e    */.  if( dest.
14700 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
14710 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
14720 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
14730 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14740 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
14750 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e  Ephemeral, dest.
14760 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69  iSDParm, p->pELi
14770 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
14780 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
14790 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _Table;.  }..  /
147a0 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69  * Special handli
147b0 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  ng for a compoun
147c0 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72  d-select that or
147d0 69 67 69 6e 61 74 65 73 20 61 73 20 61 20 56 41  iginates as a VA
147e0 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a  LUES clause..  *
147f0 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
14800 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61  ags & SF_MultiVa
14810 6c 75 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lue ){.    rc = 
14820 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65  multiSelectValue
14830 73 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  s(pParse, p, &de
14840 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  st);.    goto mu
14850 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
14860 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
14870 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
14880 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
14890 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
148a0 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
148b0 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
148c0 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
148d0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
148e0 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
148f0 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 61 73 73  >pEList );.  ass
14900 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ert( p->pEList->
14910 6e 45 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e 70  nExpr==pPrior->p
14920 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
14930 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14940 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20 70  OMIT_CTE.  if( p
14950 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
14960 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
14970 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63   generateWithRec
14980 75 72 73 69 76 65 51 75 65 72 79 28 70 50 61 72  ursiveQuery(pPar
14990 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20  se, p, &dest);. 
149a0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
149b0 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c   /* Compound SEL
149c0 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20 61  ECTs that have a
149d0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
149e0 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  e are handled se
149f0 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  parately..  */. 
14a00 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
14a10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d   ){.    return m
14a20 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
14a30 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  y(pParse, p, pDe
14a40 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  st);.  }else..  
14a50 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
14a60 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e   for the left an
14a70 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73  d right SELECT s
14a80 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
14a90 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
14aa0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
14ab0 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
14ac0 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  addr = 0;.      
14ad0 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20  int nLimit;.    
14ae0 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
14af0 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20  r->pLimit );.   
14b00 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69     pPrior->iLimi
14b10 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
14b20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66       pPrior->iOf
14b30 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
14b40 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
14b50 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  >pLimit = p->pLi
14b60 6d 69 74 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  mit;.      expla
14b70 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
14b80 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
14b90 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
14ba0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
14bb0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
14bc0 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ior, &dest);.   
14bd0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
14be0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
14bf0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
14c00 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
14c10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
14c20 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
14c30 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
14c40 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
14c50 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
14c60 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
14c70 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  et;.      if( p-
14c80 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
14c90 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
14ca0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
14cb0 50 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d  P_IfNot, p->iLim
14cc0 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
14cd0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64  e(v);.        Vd
14ce0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a  beComment((v, "J
14cf0 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d  ump ahead if LIM
14d00 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20  IT reached"));. 
14d10 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4f         if( p->iO
14d20 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20  ffset ){.       
14d30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14d40 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65  dOp3(v, OP_Offse
14d50 74 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  tLimit,.        
14d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d70 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70      p->iLimit, p
14d80 2d 3e 69 4f 66 66 73 65 74 2b 31 2c 20 70 2d 3e  ->iOffset+1, p->
14d90 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  iOffset);.      
14da0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14db0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
14dc0 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
14dd0 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
14de0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
14df0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
14e00 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20  se, p, &dest);. 
14e10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
14e20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
14e30 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
14e40 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
14e50 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
14e60 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  ior;.      p->nS
14e70 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
14e80 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e  e3LogEstAdd(p->n
14e90 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f  SelectRow, pPrio
14ea0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  r->nSelectRow);.
14eb0 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72        if( pPrior
14ec0 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20  ->pLimit.       
14ed0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
14ee0 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e  Integer(pPrior->
14ef0 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26  pLimit->pLeft, &
14f00 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26  nLimit).       &
14f10 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d  & nLimit>0 && p-
14f20 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 73 71  >nSelectRow > sq
14f30 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
14f40 29 6e 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20  )nLimit) .      
14f50 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  ){.        p->nS
14f60 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
14f70 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c  e3LogEst((u64)nL
14f80 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  imit);.      }. 
14f90 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b       if( addr ){
14fa0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14fb0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14fc0 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  addr);.      }. 
14fd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14fe0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  }.    case TK_EX
14ff0 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54  CEPT:.    case T
15000 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
15010 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20   int unionTab;  
15020 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
15030 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  er of the tempor
15040 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e  ary table holdin
15050 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  g result */.    
15060 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20    u8 op = 0;    
15070 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
15080 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
15090 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
150a0 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70  f */.      int p
150b0 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54  riorOp;     /* T
150c0 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
150d0 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72  n to apply to pr
150e0 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20  ior selects */. 
150f0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
15100 74 3b 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76  t;    /* Saved v
15110 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d  alues of p->nLim
15120 69 74 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  it  */.      int
15130 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
15140 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73  ectDest uniondes
15150 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61  t;..      testca
15160 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  se( p->op==TK_EX
15170 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20 74 65  CEPT );.      te
15180 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
15190 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20  K_UNION );.     
151a0 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55   priorOp = SRT_U
151b0 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  nion;.      if( 
151c0 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f  dest.eDest==prio
151d0 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  rOp ){.        /
151e0 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61  * We can reuse a
151f0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15200 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20   generated by a 
15210 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20  SELECT to our.  
15220 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a        ** right..
15230 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
15240 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c     assert( p->pL
15250 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  imit==0 );      
15260 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  /* Not allowed o
15270 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65  n leftward eleme
15280 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  nts */.        u
15290 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69  nionTab = dest.i
152a0 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65  SDParm;.      }e
152b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
152c0 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  We will need to 
152d0 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74  create our own t
152e0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74  emporary table t
152f0 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20  o hold the.     
15300 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61     ** intermedia
15310 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20  te results..    
15320 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75      */.        u
15330 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65  nionTab = pParse
15340 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
15350 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
15360 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
15370 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
15380 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15390 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
153a0 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
153b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
153c0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
153d0 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
153e0 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
153f0 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
15400 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74         findRight
15410 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67  most(p)->selFlag
15420 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
15430 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61  meral;.        a
15440 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
15450 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
15460 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
15470 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
15480 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20   to our left.   
15490 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
154a0 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72  rt( !pPrior->pOr
154b0 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73  derBy );.      s
154c0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
154d0 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c  Init(&uniondest,
154e0 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54   priorOp, unionT
154f0 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  ab);.      expla
15500 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
15510 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
15520 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
15530 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
15540 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
15550 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  ior, &uniondest)
15560 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
15570 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
15580 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
15590 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
155a0 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
155b0 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ent SELECT state
155c0 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ment.      */.  
155d0 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
155e0 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20  K_EXCEPT ){.    
155f0 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63      op = SRT_Exc
15600 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ept;.      }else
15610 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
15620 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
15630 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20  N );.        op 
15640 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  = SRT_Union;.   
15650 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
15660 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
15670 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
15680 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
15690 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75  mit = 0;.      u
156a0 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d  niondest.eDest =
156b0 20 6f 70 3b 0a 20 20 20 20 20 20 65 78 70 6c 61   op;.      expla
156c0 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
156d0 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
156e0 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
156f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
15700 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
15710 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
15720 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
15730 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
15740 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61      /* Query fla
15750 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74  ttening in sqlit
15760 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74  e3Select() might
15770 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65   refill p->pOrde
15780 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65  rBy..      ** Be
15790 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20   sure to delete 
157a0 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65  p->pOrderBy, the
157b0 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64  refore, to avoid
157c0 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20   a memory leak. 
157d0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
157e0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
157f0 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
15800 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
15810 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
15820 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
15830 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
15840 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
15850 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
15860 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20  _UNION ){.      
15870 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
15880 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
15890 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  dd(p->nSelectRow
158a0 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  , pPrior->nSelec
158b0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tRow);.      }. 
158c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
158d0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
158e0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
158f0 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
15900 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  .      p->iLimit
15910 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
15920 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20  Offset = 0;..   
15930 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68     /* Convert th
15940 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65  e data in the te
15950 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e  mporary table in
15960 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d  to whatever form
15970 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20  .      ** it is 
15980 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c  that we currentl
15990 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  y need..      */
159a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75  .      assert( u
159b0 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53  nionTab==dest.iS
159c0 44 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44  DParm || dest.eD
159d0 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a  est!=priorOp );.
159e0 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
159f0 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b  Dest!=priorOp ){
15a00 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
15a10 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61  nt, iBreak, iSta
15a20 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
15a30 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
15a40 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20  .        iBreak 
15a50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
15a60 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
15a70 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
15a80 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
15a90 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70  v);.        comp
15aa0 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
15ab0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
15ac0 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
15ad0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15ae0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e  v, OP_Rewind, un
15af0 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b  ionTab, iBreak);
15b00 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
15b10 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
15b20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
15b30 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
15b40 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
15b50 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
15b60 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20   unionTab,.     
15b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b80 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20     0, 0, &dest, 
15b90 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
15ba0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15bb0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15bc0 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
15bd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15be0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
15bf0 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
15c00 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
15c10 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
15c20 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
15c30 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
15c40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15c50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15c60 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62  _Close, unionTab
15c70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
15c80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15c90 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73  .    default: as
15ca0 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
15cb0 49 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20  INTERSECT ); {. 
15cc0 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74       int tab1, t
15cd0 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab2;.      int i
15ce0 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
15cf0 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72  tart;.      Expr
15d00 20 2a 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20   *pLimit;.      
15d10 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
15d20 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72  SelectDest inter
15d30 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20  sectdest;.      
15d40 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f  int r1;..      /
15d50 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64  * INTERSECT is d
15d60 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
15d70 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69  e others since i
15d80 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  t requires.     
15d90 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72   ** two temporar
15da0 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65  y tables.  Hence
15db0 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20   it has its own 
15dc0 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20  case.  Begin.   
15dd0 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74     ** by allocat
15de0 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77  ing the tables w
15df0 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20  e will need..   
15e00 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31     */.      tab1
15e10 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
15e20 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20  +;.      tab2 = 
15e30 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
15e40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
15e50 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
15e60 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
15e70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15e80 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
15e90 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ral, tab1, 0);. 
15ea0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
15eb0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
15ec0 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
15ed0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
15ee0 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
15ef0 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
15f00 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
15f10 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
15f20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
15f30 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20  >pEList );..    
15f40 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
15f50 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66  LECTs to our lef
15f60 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  t into temporary
15f70 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20   table "tab1".. 
15f80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
15f90 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
15fa0 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64 65  nit(&intersectde
15fb0 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74  st, SRT_Union, t
15fc0 61 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  ab1);.      expl
15fd0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
15fe0 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
15ff0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
16000 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
16010 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
16020 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74  rior, &intersect
16030 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  dest);.      if(
16040 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
16050 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
16060 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
16070 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
16080 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
16090 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
160a0 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20  able "tab2".    
160b0 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20    */.      addr 
160c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
160d0 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
160e0 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30  hemeral, tab2, 0
160f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16100 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
16110 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [1] == -1 );.   
16120 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
16130 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[1] = addr;.  
16140 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
16150 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
16160 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
16170 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
16180 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65 63  ;.      intersec
16190 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20  tdest.iSDParm = 
161a0 74 61 62 32 3b 0a 20 20 20 20 20 20 65 78 70 6c  tab2;.      expl
161b0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
161c0 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
161d0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
161e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
161f0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
16200 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29   &intersectdest)
16210 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16220 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16230 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
16240 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
16250 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
16260 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66  pPrior;.      if
16270 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  ( p->nSelectRow>
16280 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
16290 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow ) p->nSelectR
162a0 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
162b0 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73  lectRow;.      s
162c0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
162d0 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
162e0 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
162f0 20 3d 20 70 4c 69 6d 69 74 3b 0a 0a 20 20 20 20   = pLimit;..    
16300 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
16310 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69  de to take the i
16320 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74  ntersection of t
16330 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  he two temporary
16340 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73  .      ** tables
16350 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
16360 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
16370 73 74 20 29 3b 0a 20 20 20 20 20 20 69 42 72 65  st );.      iBre
16380 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
16390 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
163a0 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
163b0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
163c0 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75  (v);.      compu
163d0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
163e0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
163f0 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
16400 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16410 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c  OP_Rewind, tab1,
16420 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
16430 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
16440 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
16450 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
16460 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20  .      iStart = 
16470 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16480 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
16490 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20   tab1, r1);.    
164a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
164b0 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74  Op4Int(v, OP_Not
164c0 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f  Found, tab2, iCo
164d0 6e 74 2c 20 72 31 2c 20 30 29 3b 20 56 64 62 65  nt, r1, 0); Vdbe
164e0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
164f0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
16500 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
16510 20 72 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65   r1);.      sele
16520 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
16530 73 65 2c 20 70 2c 20 74 61 62 31 2c 0a 20 20 20  se, p, tab1,.   
16540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16550 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20     0, 0, &dest, 
16560 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
16570 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16580 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
16590 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73   iCont);.      s
165a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
165b0 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62  (v, OP_Next, tab
165c0 31 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65  1, iStart); Vdbe
165d0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
165e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
165f0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
16600 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
16610 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16620 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
16630 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
16640 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16650 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
16660 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
16670 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65  ;.    }.  }..  e
16680 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
16690 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69  pParse, p->op, i
166a0 53 75 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e  Sub1, iSub2, p->
166b0 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20  op!=TK_ALL);..  
166c0 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
166d0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
166e0 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d  sed by .  ** tem
166f0 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
16700 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
16710 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
16720 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
16730 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
16740 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
16750 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
16760 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
16770 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20   section is run 
16780 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  by the right-mos
16790 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
167a0 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45  nt only..  ** SE
167b0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
167c0 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61  to the left alwa
167d0 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  ys skip this par
167e0 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  t.  The right-mo
167f0 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d  st.  ** SELECT m
16800 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74  ight also skip t
16810 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68  his part if it h
16820 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  as no ORDER BY c
16830 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e  lause and.  ** n
16840 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72  o temp tables ar
16850 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  e required..  */
16860 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
16870 67 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65  gs & SF_UsesEphe
16880 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  meral ){.    int
16890 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
168a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
168b0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
168c0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
168d0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
168e0 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
168f0 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65  uence for the re
16900 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20  sult set */.    
16910 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20  Select *pLoop;  
16920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16930 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
16940 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74  ough SELECT stat
16950 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f  ements */.    Co
16960 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
16970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
16980 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
16990 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
169a0 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ll[] */.    int 
169b0 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
169c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
169d0 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
169e0 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  n result set */.
169f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
16a00 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pNext==0 );.    
16a10 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
16a20 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65  ->nExpr;.    pKe
16a30 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
16a40 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
16a50 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66  nCol, 1);.    if
16a60 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  ( !pKeyInfo ){. 
16a70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
16a80 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
16a90 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
16aa0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
16ab0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43      for(i=0, apC
16ac0 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  oll=pKeyInfo->aC
16ad0 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  oll; i<nCol; i++
16ae0 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20  , apColl++){.   
16af0 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c     *apColl = mul
16b00 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
16b10 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
16b20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43       if( 0==*apC
16b30 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  oll ){.        *
16b40 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66  apColl = db->pDf
16b50 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
16b60 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
16b70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
16b80 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
16b90 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
16ba0 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
16bb0 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
16bc0 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
16bd0 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
16be0 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
16bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
16c00 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
16c10 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
16c20 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
16c30 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
16c40 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
16c50 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
16c60 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
16c70 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
16c80 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
16c90 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
16ca0 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
16cb0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16cc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16cd0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
16ce0 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
16cf0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
16d00 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
16d10 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
16d20 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
16d30 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20  ef(pKeyInfo),.  
16d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d50 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59            P4_KEY
16d60 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70  INFO);.        p
16d70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
16d80 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[i] = -1;.    
16d90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
16da0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
16db0 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d  f(pKeyInfo);.  }
16dc0 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  ..multi_select_e
16dd0 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64  nd:.  pDest->iSd
16de0 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b  st = dest.iSdst;
16df0 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
16e00 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20  = dest.nSdst;.  
16e10 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
16e20 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29  ete(db, pDelete)
16e30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16e40 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
16e50 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
16e60 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SELECT */../*.**
16e70 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   Error message f
16e80 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d  or when two or m
16e90 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 61 20 63  ore terms of a c
16ea0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 68  ompound select h
16eb0 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ave different.**
16ec0 20 73 69 7a 65 20 72 65 73 75 6c 74 20 73 65 74   size result set
16ed0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
16ee0 65 33 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d  e3SelectWrongNum
16ef0 54 65 72 6d 73 45 72 72 6f 72 28 50 61 72 73 65  TermsError(Parse
16f00 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
16f10 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73   *p){.  if( p->s
16f20 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c  elFlags & SF_Val
16f30 75 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ues ){.    sqlit
16f40 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
16f50 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d  e, "all VALUES m
16f60 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ust have the sam
16f70 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  e number of term
16f80 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s");.  }else{.  
16f90 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16fa0 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43  g(pParse, "SELEC
16fb0 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  Ts to the left a
16fc0 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a  nd right of %s".
16fd0 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68        " do not h
16fe0 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
16ff0 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
17000 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70  lumns", selectOp
17010 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
17020 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  }.}../*.** Code 
17030 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  an output subrou
17040 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75  tine for a corou
17050 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tine implementat
17060 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45  ion of a.** SELE
17070 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a  CT statment..**.
17080 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62  ** The data to b
17090 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74  e output is cont
170a0 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53  ained in pIn->iS
170b0 64 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a  dst.  There are.
170c0 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f  ** pIn->nSdst co
170d0 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70  lumns to be outp
170e0 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68  ut.  pDest is wh
170f0 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73  ere the output s
17100 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74  hould.** be sent
17110 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72  ..**.** regRetur
17120 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
17130 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  of the register 
17140 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72  holding the subr
17150 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
17160 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
17170 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
17180 6e 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73  n it is the firs
17190 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20  t register in a 
171a0 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72  vector that.** r
171b0 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69  ecords the previ
171c0 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d  ous output.  mem
171d0 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66  [regPrev] is a f
171e0 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73  lag that is fals
171f0 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61  e.** if there ha
17200 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f  s been no previo
17210 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72  us output.  If r
17220 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f  egPrev>0 then co
17230 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74  de is.** generat
17240 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64  ed to suppress d
17250 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79  uplicates.  pKey
17260 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72  Info is used for
17270 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65   comparing.** ke
17280 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ys..**.** If the
17290 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20   LIMIT found in 
172a0 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61  p->iLimit is rea
172b0 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  ched, jump immed
172c0 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72  iately to.** iBr
172d0 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eak..*/.static i
172e0 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75  nt generateOutpu
172f0 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50  tSubroutine(.  P
17300 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
17310 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
17320 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
17330 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
17340 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
17350 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
17360 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
17370 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  pIn,        /* C
17380 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69  oroutine supplyi
17390 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  ng data */.  Sel
173a0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
173b0 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
173c0 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a   send the data *
173d0 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72  /.  int regRetur
173e0 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n,          /* T
173f0 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  he return addres
17400 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
17410 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20  int regPrev,    
17420 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
17430 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73  ous result regis
17440 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e  ter.  No uniquen
17450 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65  ess if 0 */.  Ke
17460 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
17470 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d        /* For com
17480 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76  paring with prev
17490 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ious entry */.  
174a0 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
174b0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
174c0 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74  here if we hit t
174d0 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20  he LIMIT */.){. 
174e0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
174f0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
17500 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74  iContinue;.  int
17510 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d   addr;..  addr =
17520 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
17530 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43  entAddr(v);.  iC
17540 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
17550 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
17560 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  );..  /* Suppres
17570 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72  s duplicates for
17580 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
17590 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20  and INTERSECT . 
175a0 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65   */.  if( regPre
175b0 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  v ){.    int add
175c0 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61  r1, addr2;.    a
175d0 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
175e0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
175f0 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20  fNot, regPrev); 
17600 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
17610 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
17620 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
17630 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49  , OP_Compare, pI
17640 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65  n->iSdst, regPre
17650 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c  v+1, pIn->nSdst,
17660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
17680 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
17690 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
176a0 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
176b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
176c0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
176d0 2c 20 61 64 64 72 32 2b 32 2c 20 69 43 6f 6e 74  , addr2+2, iCont
176e0 69 6e 75 65 2c 20 61 64 64 72 32 2b 32 29 3b 20  inue, addr2+2); 
176f0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
17700 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
17710 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
17720 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
17730 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
17740 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74  Copy, pIn->iSdst
17750 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
17760 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20  ->nSdst-1);.    
17770 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17780 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
17790 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   1, regPrev);.  
177a0 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
177b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
177c0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
177d0 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20  /* Suppress the 
177e0 66 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74  first OFFSET ent
177f0 72 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73  ries if there is
17800 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73   an OFFSET claus
17810 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66  e.  */.  codeOff
17820 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
17830 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a  t, iContinue);..
17840 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
17850 3e 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73  >eDest!=SRT_Exis
17860 74 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ts );.  assert( 
17870 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
17880 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 73 77 69  T_Table );.  swi
17890 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73  tch( pDest->eDes
178a0 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72  t ){.    /* Stor
178b0 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
178c0 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
178d0 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
178e0 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
178f0 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69  emTab: {.      i
17900 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
17910 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
17920 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20  );.      int r2 
17930 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
17940 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
17950 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17960 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
17970 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73  ecord, pIn->iSds
17980 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72  t, pIn->nSdst, r
17990 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
179a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
179b0 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73  P_NewRowid, pDes
179c0 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b  t->iSDParm, r2);
179d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
179e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
179f0 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53  nsert, pDest->iS
17a00 44 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a  DParm, r1, r2);.
17a10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17a20 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
17a30 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
17a40 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
17a50 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
17a60 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
17a70 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
17a80 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
17a90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17aa0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
17ab0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
17ac0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
17ad0 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
17ae0 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
17af0 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 20  (SELECT ...)".. 
17b00 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
17b10 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
17b20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 74 65  int r1;.      te
17b30 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64  stcase( pIn->nSd
17b40 73 74 3e 31 20 29 3b 0a 20 20 20 20 20 20 72 31  st>1 );.      r1
17b50 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
17b60 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
17b70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17b80 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
17b90 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64  Record, pIn->iSd
17ba0 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20  st, pIn->nSdst, 
17bb0 0a 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 70  .          r1, p
17bc0 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20  Dest->zAffSdst, 
17bd0 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
17be0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
17bf0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
17c00 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
17c10 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
17c20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17c30 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
17c40 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
17c50 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
17c60 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
17c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
17c80 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
17c90 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
17ca0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
17cb0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
17cc0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17cd0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
17ce0 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
17cf0 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
17d00 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
17d10 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
17d20 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
17d30 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
17d40 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
17d50 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
17d60 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
17d70 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
17d80 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
17d90 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
17da0 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20  ( pIn->nSdst==1 
17db0 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
17dc0 30 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  0 );  testcase( 
17dd0 70 49 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b  pIn->nSdst!=1 );
17de0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
17df0 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
17e00 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  e, pIn->iSdst, p
17e10 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31  Dest->iSDParm, 1
17e20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
17e30 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
17e40 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
17e50 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
17e60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17e70 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    }.#endif /* #i
17e80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17e90 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
17ea0 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
17eb0 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
17ec0 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
17ed0 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73  gisters.    ** s
17ee0 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73 74  tarting at pDest
17ef0 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74  ->iSdst.  Then t
17f00 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69  he co-routine yi
17f10 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elds..    */.   
17f20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
17f30 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ine: {.      if(
17f40 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30   pDest->iSdst==0
17f50 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73   ){.        pDes
17f60 74 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74  t->iSdst = sqlit
17f70 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
17f80 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73  Parse, pIn->nSds
17f90 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73  t);.        pDes
17fa0 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e  t->nSdst = pIn->
17fb0 6e 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  nSdst;.      }. 
17fc0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17fd0 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
17fe0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65   pIn->iSdst, pDe
17ff0 73 74 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  st->iSdst, pIn->
18000 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
18010 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
18020 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
18030 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
18040 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18050 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65  ..    /* If none
18060 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74   of the above, t
18070 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64  hen the result d
18080 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20  estination must 
18090 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75  be.    ** SRT_Ou
180a0 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74  tput.  This rout
180b0 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
180c0 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68  led with any oth
180d0 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e  er.    ** destin
180e0 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ation other than
180f0 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65   the ones handle
18100 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f  d above or SRT_O
18110 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  utput..    **.  
18120 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74    ** For SRT_Out
18130 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65  put, results are
18140 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
18150 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
18160 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65  rs.  .    ** The
18170 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52  n the OP_ResultR
18180 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65  ow opcode is use
18190 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74  d to cause sqlit
181a0 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20  e3_step() to.   
181b0 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e   ** return the n
181c0 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  ext row of resul
181d0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  t..    */.    de
181e0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
181f0 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
18200 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
18210 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18220 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18230 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d  _ResultRow, pIn-
18240 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
18250 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
18260 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
18270 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
18280 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
18290 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
182a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
182b0 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
182c0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
182d0 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
182e0 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a   is reached..  *
182f0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  /.  if( p->iLimi
18300 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
18310 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18320 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70  _DecrJumpZero, p
18330 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
18340 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
18350 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  v);.  }..  /* Ge
18360 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f  nerate the subro
18370 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a  utine return.  *
18380 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
18390 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
183a0 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c  Continue);.  sql
183b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
183c0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
183d0 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75  Return);..  retu
183e0 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
183f0 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  * Alternative co
18400 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f  mpound select co
18410 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72  de generator for
18420 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72   cases when ther
18430 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52  e.** is an ORDER
18440 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a   BY clause..**.*
18450 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75  * We assume a qu
18460 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ery of the follo
18470 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  wing form:.**.**
18480 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20        <selectA> 
18490 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65   <operator>  <se
184a0 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59  lectB>  ORDER BY
184b0 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a   <orderbylist>.*
184c0 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20  *.** <operator> 
184d0 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20  is one of UNION 
184e0 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45  ALL, UNION, EXCE
184f0 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
18500 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69  .  The idea.** i
18510 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c  s to code both <
18520 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65  selectA> and <se
18530 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20  lectB> with the 
18540 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
18550 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65  as.** co-routine
18560 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65  s.  Then run the
18570 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20   co-routines in 
18580 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72  parallel and mer
18590 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  ge the results.*
185a0 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  * into the outpu
185b0 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  t.  In addition 
185c0 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  to the two corou
185d0 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65  tines (called se
185e0 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c  lectA and.** sel
185f0 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20  ectB) there are 
18600 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a  7 subroutines:.*
18610 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20  *.**    outA:   
18620 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
18630 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20   of the selectA 
18640 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
18650 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
18660 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
18670 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a  compound query..
18680 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20  **.**    outB:  
18690 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
186a0 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42  t of the selectB
186b0 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
186c0 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
186d0 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
186e0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
186f0 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65    (Only generate
18700 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a  d for UNION and.
18710 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
18720 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50  NION ALL.  EXCEP
18730 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54  T and INSERTSECT
18740 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20   never output a 
18750 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  row that.**     
18760 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20          appears 
18770 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a  only in B.).**.*
18780 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61  *    AltB:    Ca
18790 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
187a0 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
187b0 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
187c0 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41   A<B..**.**    A
187d0 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  eqB:    Called w
187e0 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
187f0 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
18800 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e  utines and A==B.
18810 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  .**.**    AgtB: 
18820 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
18830 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
18840 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
18850 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a  s and A>B..**.**
18860 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c      EofA:    Cal
18870 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
18880 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
18890 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20  selectA..**.**  
188a0 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65    EofB:    Calle
188b0 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
188c0 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
188d0 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lectB..**.** The
188e0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
188f0 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69  of the latter fi
18900 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64  ve subroutines d
18910 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a  epend on which .
18920 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
18930 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20   used:.**.**.** 
18940 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
18950 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e  N ALL         UN
18960 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45  ION            E
18970 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49  XCEPT          I
18980 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20  NTERSECT.**     
18990 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
189a0 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
189b0 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
189c0 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
189d0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c  --------.**   Al
189e0 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  tB:   outA, next
189f0 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
18a00 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
18a10 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
18a20 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a  tA.**.**   AeqB:
18a30 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
18a40 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
18a50 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
18a60 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
18a70 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a  tA.**.**   AgtB:
18a80 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
18a90 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
18aa0 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20           nextB  
18ab0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a            nextB.
18ac0 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20  **.**   EofA:   
18ad0 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
18ae0 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
18af0 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20        halt      
18b00 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
18b10 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41  *   EofB:   outA
18b20 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
18b30 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
18b40 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
18b50 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e     halt.**.** In
18b60 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c   the AltB, AeqB,
18b70 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75   and AgtB subrou
18b80 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e  tines, an EOF on
18b90 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   A following nex
18ba0 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20  tA.** causes an 
18bb0 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
18bc0 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f  o EofA and an EO
18bd0 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67  F on B following
18be0 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a   nextB causes.**
18bf0 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
18c00 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74  mp to EofB.  Wit
18c10 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  hin EofA and Eof
18c20 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e  B, and EOF on en
18c30 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  try or.** follow
18c40 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73  ing nextX causes
18c50 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65   a jump to the e
18c60 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  nd of the select
18c70 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
18c80 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d  ** Duplicate rem
18c90 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f  oval in the UNIO
18ca0 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
18cb0 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69  NTERSECT cases i
18cc0 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74  s handled.** wit
18cd0 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73  hin the output s
18ce0 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
18cf0 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72  regPrev register
18d00 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70   set holds the p
18d10 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74  reviously.** out
18d20 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f  put value.  A co
18d30 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65  mparison is made
18d40 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61   against this va
18d50 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70  lue and the outp
18d60 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64  ut.** is skipped
18d70 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73   if the next res
18d80 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68  ults would be th
18d90 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72  e same as the pr
18da0 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  evious..**.** Th
18db0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
18dc0 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c   plan is to impl
18dd0 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f  ement the two co
18de0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76  routines and sev
18df0 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  en.** subroutine
18e00 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75  s first, then pu
18e10 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f  t the control lo
18e20 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f  gic at the botto
18e30 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  m.  Like this:.*
18e40 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f  *.**          go
18e50 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63  to Init.**     c
18e60 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oA: coroutine fo
18e70 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29  r left query (A)
18e80 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72  .**     coB: cor
18e90 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
18ea0 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20   query (B).**   
18eb0 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e   outA: output on
18ec0 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20  e row of A.**   
18ed0 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e   outB: output on
18ee0 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f  e row of B (UNIO
18ef0 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20  N and UNION ALL 
18f00 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41  only).**    EofA
18f10 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42  : ....**    EofB
18f20 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42  : ....**    AltB
18f30 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42  : ....**    AeqB
18f40 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42  : ....**    AgtB
18f50 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74  : ....**    Init
18f60 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72  : initialize cor
18f70 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
18f80 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
18f90 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20  ld coA.**       
18fa0 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74     if eof(A) got
18fb0 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20  o EofA.**       
18fc0 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20     yield coB.** 
18fd0 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
18fe0 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20  B) goto EofB.** 
18ff0 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65     Cmpr: Compare
19000 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20   A, B.**        
19010 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71    Jump AltB, Aeq
19020 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45  B, AgtB.**     E
19030 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65  nd: ....**.** We
19040 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42   call AltB, AeqB
19050 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e  , AgtB, EofA, an
19060 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69  d EofB "subrouti
19070 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72  nes" but they ar
19080 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c  e not.** actuall
19090 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47  y called using G
190a0 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f  osub and they do
190b0 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f   not Return.  Eo
190c0 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70  fA and EofB loop
190d0 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61  .** until all da
190e0 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
190f0 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65  then jump to the
19100 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c   "end" labe.  Al
19110 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64  tB, AeqB,.** and
19120 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69   AgtB jump to ei
19130 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e  ther L2 or to on
19140 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66  e of EofA or Eof
19150 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  B..*/.#ifndef SQ
19160 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
19170 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63  ND_SELECT.static
19180 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
19190 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
191a0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
191b0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
191c0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
191d0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
191e0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
191f0 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
19200 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
19210 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
19220 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
19230 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
19240 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
19250 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
19260 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
19270 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  rs */.  Select *
19280 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
19290 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
192a0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
192b0 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
192c0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
192d0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
192e0 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
192f0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
19300 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44   destA;     /* D
19310 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
19320 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20  oroutine A */.  
19330 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42  SelectDest destB
19340 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
19350 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
19360 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ne B */.  int re
19370 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20  gAddrA;         
19380 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
19390 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
193a0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
193b0 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20  int regAddrB;   
193c0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
193d0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
193e0 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
193f0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
19400 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41  lectA;      /* A
19410 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
19420 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65  lect-A coroutine
19430 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
19440 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41  lectB;      /* A
19450 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
19460 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
19470 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
19480 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  A;          /* A
19490 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
194a0 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41  for the output-A
194b0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
194c0 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20   int regOutB;   
194d0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
194e0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
194f0 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
19500 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
19510 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20  addrOutA;       
19520 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
19530 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
19540 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
19550 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20   addrOutB = 0;  
19560 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
19570 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75   the output-B su
19580 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
19590 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20  t addrEofA;     
195a0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
195b0 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65  f the select-A-e
195c0 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
195d0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
195e0 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f  rEofA_noB;     /
195f0 2a 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72  * Alternate addr
19600 45 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e 69  EofA if B is uni
19610 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
19620 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20  int addrEofB;   
19630 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
19640 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
19650 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
19660 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
19670 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20  ddrAltB;        
19680 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
19690 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e  he A<B subroutin
196a0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
196b0 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eqB;         /* 
196c0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
196d0 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ==B subroutine *
196e0 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42  /.  int addrAgtB
196f0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
19700 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20  ress of the A>B 
19710 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
19720 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20  int regLimitA;  
19730 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
19740 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
19750 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
19760 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20  gLimitB;        
19770 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
19780 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
19790 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b  /.  int regPrev;
197a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72            /* A r
197b0 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
197c0 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f  s to hold previo
197d0 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  us output */.  i
197e0 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20  nt savedLimit;  
197f0 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
19800 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74  lue of p->iLimit
19810 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f   */.  int savedO
19820 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  ffset;      /* S
19830 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
19840 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e  >iOffset */.  in
19850 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20  t labelCmpr;    
19860 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
19870 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
19880 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  e merge algorith
19890 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  m */.  int label
198a0 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  End;         /* 
198b0 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e  Label for the en
198c0 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c  d of the overall
198d0 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a   SELECT stmt */.
198e0 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
198f0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
19900 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61  instructions tha
19910 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65  t get retargette
19920 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  d */.  int op;  
19930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19940 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54  One of TK_ALL, T
19950 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
19960 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  PT, TK_INTERSECT
19970 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
19980 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43  KeyDup = 0; /* C
19990 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
199a0 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
199b0 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20  ate removal */. 
199c0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65   KeyInfo *pKeyMe
199d0 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72  rge;   /* Compar
199e0 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
199f0 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77   for merging row
19a00 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
19a10 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
19a20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
19a30 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ion */.  ExprLis
19a40 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f  t *pOrderBy;   /
19a50 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
19a60 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
19a70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
19a80 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
19a90 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
19aa0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
19ab0 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20  int *aPermute;  
19ac0 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67        /* Mapping
19ad0 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74   from ORDER BY t
19ae0 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73  erms to result s
19af0 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69  et columns */.#i
19b00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19b10 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
19b20 69 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20  iSub1;          
19b30 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
19b40 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
19b50 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20  /.  int iSub2;  
19b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
19b70 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
19b80 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
19b90 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  f..  assert( p->
19ba0 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20  pOrderBy!=0 );. 
19bb0 20 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70   assert( pKeyDup
19bc0 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67  ==0 ); /* "Manag
19bd0 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74  ed" code needs t
19be0 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33  his.  Ticket #33
19bf0 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  82. */.  db = pP
19c00 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20  arse->db;.  v = 
19c10 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
19c20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
19c30 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64         /* Alread
19c40 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72  y thrown the err
19c50 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63  or if VDBE alloc
19c60 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62   failed */.  lab
19c70 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  elEnd = sqlite3V
19c80 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
19c90 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73  .  labelCmpr = s
19ca0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
19cb0 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50  bel(v);...  /* P
19cc0 61 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45  atch up the ORDE
19cd0 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f  R BY clause.  */
19ce0 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20  .  op = p->op;  
19cf0 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
19d00 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
19d10 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
19d20 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72  y==0 );.  pOrder
19d30 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
19d40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ;.  assert( pOrd
19d50 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72  erBy );.  nOrder
19d60 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
19d70 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  Expr;..  /* For 
19d80 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20  operators other 
19d90 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77  than UNION ALL w
19da0 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73  e have to make s
19db0 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ure that.  ** th
19dc0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
19dd0 65 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74  e covers every t
19de0 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c  erm of the resul
19df0 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a  t set.  Add.  **
19e00 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52   terms to the OR
19e10 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
19e20 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
19e30 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c  .  if( op!=TK_AL
19e40 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  L ){.    for(i=1
19e50 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ; db->mallocFail
19e60 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70  ed==0 && i<=p->p
19e70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
19e80 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
19e90 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
19ea0 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72  pItem;.      for
19eb0 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (j=0, pItem=pOrd
19ec0 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65  erBy->a; j<nOrde
19ed0 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; j++, pItem+
19ee0 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
19ef0 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
19f00 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
19f10 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
19f20 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
19f30 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20  ol==i ) break;. 
19f40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19f50 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a   j==nOrderBy ){.
19f60 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
19f70 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
19f80 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  (db, TK_INTEGER,
19f90 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
19fa0 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
19fb0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
19fc0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  KPT;.        pNe
19fd0 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  w->flags |= EP_I
19fe0 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  ntValue;.       
19ff0 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20   pNew->u.iValue 
1a000 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = i;.        p->
1a010 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
1a020 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
1a030 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
1a040 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e  se, pOrderBy, pN
1a050 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
1a060 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64   pOrderBy ) pOrd
1a070 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79  erBy->a[nOrderBy
1a080 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  ++].u.x.iOrderBy
1a090 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  Col = (u16)i;.  
1a0a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1a0b0 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
1a0c0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72  e comparison per
1a0d0 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79  mutation and key
1a0e0 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65  info that is use
1a0f0 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
1a100 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64  permutation used
1a110 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
1a120 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72   the next.  ** r
1a130 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f  ow of results co
1a140 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  mes from selectA
1a150 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c   or selectB.  Al
1a160 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a  so add explicit.
1a170 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20    ** collations 
1a180 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
1a190 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20  clause terms so 
1a1a0 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75  that when the su
1a1b0 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f  bqueries.  ** to
1a1c0 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74   the right and t
1a1d0 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c  he left are eval
1a1e0 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20  uated, they use 
1a1f0 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a  the correct.  **
1a200 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f   collation..  */
1a210 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71  .  aPermute = sq
1a220 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1a230 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e  NN(db, sizeof(in
1a240 74 29 2a 28 6e 4f 72 64 65 72 42 79 20 2b 20 31  t)*(nOrderBy + 1
1a250 29 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75  ));.  if( aPermu
1a260 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  te ){.    struct
1a270 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1a280 70 49 74 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d  pItem;.    aPerm
1a290 75 74 65 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42  ute[0] = nOrderB
1a2a0 79 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20  y;.    for(i=1, 
1a2b0 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
1a2c0 61 3b 20 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20  a; i<=nOrderBy; 
1a2d0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
1a2e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
1a2f0 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
1a300 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  Col>0 );.      a
1a310 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
1a320 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70  x.iOrderByCol<=p
1a330 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
1a340 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74  );.      aPermut
1a350 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e  e[i] = pItem->u.
1a360 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20  x.iOrderByCol - 
1a370 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  1;.    }.    pKe
1a380 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65  yMerge = multiSe
1a390 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
1a3a0 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
1a3b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1a3c0 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20  KeyMerge = 0;.  
1a3d0 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68  }..  /* Reattach
1a3e0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1a3f0 61 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72  ause to the quer
1a400 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  y..  */.  p->pOr
1a410 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1a420 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  ;.  pPrior->pOrd
1a430 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
1a440 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  prListDup(pParse
1a450 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20  ->db, pOrderBy, 
1a460 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  0);..  /* Alloca
1a470 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65  te a range of te
1a480 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
1a490 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66  s and the KeyInf
1a4a0 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f  o needed.  ** fo
1a4b0 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  r the logic that
1a4c0 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61   removes duplica
1a4d0 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77  te result rows w
1a4e0 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  hen the.  ** ope
1a4f0 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20  rator is UNION, 
1a500 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
1a510 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e  SECT (but not UN
1a520 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20  ION ALL)..  */. 
1a530 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1a540 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  ){.    regPrev =
1a550 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1a560 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e   int nExpr = p->
1a570 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
1a580 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65     assert( nOrde
1a590 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62  rBy>=nExpr || db
1a5a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1a5b0 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  ;.    regPrev = 
1a5c0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
1a5d0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
1a5e0 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20   += nExpr+1;.   
1a5f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a600 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1a610 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 0, regPrev);. 
1a620 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c     pKeyDup = sql
1a630 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
1a640 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a  (db, nExpr, 1);.
1a650 20 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20      if( pKeyDup 
1a660 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1a670 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
1a680 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44  sWriteable(pKeyD
1a690 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  up) );.      for
1a6a0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
1a6b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  ++){.        pKe
1a6c0 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  yDup->aColl[i] =
1a6d0 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
1a6e0 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
1a6f0 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  );.        pKeyD
1a700 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  up->aSortOrder[i
1a710 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
1a720 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20     }.  }. .  /* 
1a730 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66  Separate the lef
1a740 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20  t and the right 
1a750 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61  query from one a
1a760 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d  nother.  */.  p-
1a770 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
1a780 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30  Prior->pNext = 0
1a790 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
1a7a0 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
1a7b0 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
1a7c0 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b  derBy, "ORDER");
1a7d0 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
1a7e0 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
1a7f0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
1a800 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
1a810 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f  e, pPrior, pPrio
1a820 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  r->pOrderBy, "OR
1a830 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  DER");.  }..  /*
1a840 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d   Compute the lim
1a850 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  it registers */.
1a860 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
1a870 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
1a880 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
1a890 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26  if( p->iLimit &&
1a8a0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
1a8b0 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b     regLimitA = +
1a8c0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1a8d0 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b     regLimitB = +
1a8e0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1a8f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a900 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
1a910 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d   p->iOffset ? p-
1a920 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e  >iOffset+1 : p->
1a930 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  iLimit,.        
1a940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a950 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d            regLim
1a960 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  itA);.    sqlite
1a970 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a980 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74  P_Copy, regLimit
1a990 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20  A, regLimitB);. 
1a9a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c   }else{.    regL
1a9b0 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74  imitA = regLimit
1a9c0 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  B = 0;.  }.  sql
1a9d0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1a9e0 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
1a9f0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
1aa00 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b  .  regAddrA = ++
1aa10 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1aa20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61  regAddrB = ++pPa
1aa30 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
1aa40 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  OutA = ++pParse-
1aa50 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42  >nMem;.  regOutB
1aa60 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1aa70 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  m;.  sqlite3Sele
1aa80 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
1aa90 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  A, SRT_Coroutine
1aaa0 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73  , regAddrA);.  s
1aab0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
1aac0 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54  Init(&destB, SRT
1aad0 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
1aae0 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  ddrB);..  /* Gen
1aaf0 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
1ab00 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
1ab10 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1ab20 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c  nt to the.  ** l
1ab30 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  eft of the compo
1ab40 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74  und operator - t
1ab50 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20  he "A" select.. 
1ab60 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
1ab70 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  A = sqlite3VdbeC
1ab80 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
1ab90 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  1;.  addr1 = sql
1aba0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1abb0 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
1abc0 6e 65 2c 20 72 65 67 41 64 64 72 41 2c 20 30 2c  ne, regAddrA, 0,
1abd0 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20   addrSelectA);. 
1abe0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1abf0 20 22 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29   "left SELECT"))
1ac00 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  ;.  pPrior->iLim
1ac10 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a  it = regLimitA;.
1ac20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
1ac30 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
1ac40 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
1ac50 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
1ac60 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
1ac70 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71  r, &destA);.  sq
1ac80 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f  lite3VdbeEndCoro
1ac90 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72  utine(v, regAddr
1aca0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
1acb0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
1acc0 72 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  r1);..  /* Gener
1acd0 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
1ace0 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
1acf0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1ad00 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69   on .  ** the ri
1ad10 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65  ght - the "B" se
1ad20 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72  lect.  */.  addr
1ad30 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65  SelectB = sqlite
1ad40 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1ad50 28 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31  (v) + 1;.  addr1
1ad60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1ad70 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
1ad80 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
1ad90 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63  rB, 0, addrSelec
1ada0 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  tB);.  VdbeComme
1adb0 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20 53 45  nt((v, "right SE
1adc0 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64  LECT"));.  saved
1add0 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
1ade0 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74  t;.  savedOffset
1adf0 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
1ae00 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67   p->iLimit = reg
1ae10 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66  LimitB;.  p->iOf
1ae20 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 65 78  fset = 0;  .  ex
1ae30 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
1ae40 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
1ae50 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
1ae60 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
1ae70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42  Parse, p, &destB
1ae80 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  );.  p->iLimit =
1ae90 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70   savedLimit;.  p
1aea0 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65  ->iOffset = save
1aeb0 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74  dOffset;.  sqlit
1aec0 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69  e3VdbeEndCorouti
1aed0 6e 65 28 76 2c 20 72 65 67 41 64 64 72 42 29 3b  ne(v, regAddrB);
1aee0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1aef0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
1af00 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
1af10 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
1af20 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   A.  ** select a
1af30 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
1af40 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
1af50 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
1af60 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
1af70 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74  ment((v, "Output
1af80 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29   routine for A")
1af90 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20  );.  addrOutA = 
1afa0 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
1afb0 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c  broutine(pParse,
1afc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1afd0 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65    p, &destA, pDe
1afe0 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20  st, regOutA,.   
1aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1b000 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20  gPrev, pKeyDup, 
1b010 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20  labelEnd);.  .  
1b020 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
1b030 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
1b040 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e  tputs the curren
1b050 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20  t row of the B. 
1b060 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68   ** select as th
1b070 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f  e next output ro
1b080 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  w of the compoun
1b090 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  d select..  */. 
1b0a0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1b0b0 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  || op==TK_UNION 
1b0c0 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  ){.    VdbeNoopC
1b0d0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
1b0e0 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42  ut routine for B
1b0f0 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74  "));.    addrOut
1b100 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70  B = generateOutp
1b110 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61  utSubroutine(pPa
1b120 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
1b130 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c        p, &destB,
1b140 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c   pDest, regOutB,
1b150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b160 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44    regPrev, pKeyD
1b170 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  up, labelEnd);. 
1b180 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49   }.  sqlite3KeyI
1b190 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70  nfoUnref(pKeyDup
1b1a0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1b1b0 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
1b1c0 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
1b1d0 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
1b1e0 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct A.  ** are ex
1b1f0 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
1b200 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
1b210 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  B remains..  */.
1b220 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43    if( op==TK_EXC
1b230 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e  EPT || op==TK_IN
1b240 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
1b250 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64  ddrEofA_noB = ad
1b260 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e  drEofA = labelEn
1b270 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20  d;.  }else{  .  
1b280 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1b290 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62  t((v, "eof-A sub
1b2a0 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
1b2b0 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74  addrEofA = sqlit
1b2c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b2d0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
1b2e0 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
1b2f0 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d    addrEofA_noB =
1b300 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b310 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1b320 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45  regAddrB, labelE
1b330 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nd);.           
1b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b350 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
1b360 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
1b370 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1b380 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20  , addrEofA);.   
1b390 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
1b3a0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
1b3b0 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c  d(p->nSelectRow,
1b3c0 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
1b3d0 52 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Row);.  }..  /* 
1b3e0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1b3f0 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
1b400 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
1b410 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a  om select B.  **
1b420 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
1b430 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
1b440 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73  select A remains
1b450 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
1b460 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
1b470 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20  .    addrEofB = 
1b480 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66  addrEofA;.    if
1b490 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ( p->nSelectRow 
1b4a0 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  > pPrior->nSelec
1b4b0 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63  tRow ) p->nSelec
1b4c0 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e  tRow = pPrior->n
1b4d0 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c  SelectRow;.  }el
1b4e0 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f  se{  .    VdbeNo
1b4f0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  opComment((v, "e
1b500 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  of-B subroutine"
1b510 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42  ));.    addrEofB
1b520 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1b530 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1b540 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
1b550 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  utA);.    sqlite
1b560 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b570 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1b580 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64  A, labelEnd); Vd
1b590 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1b5a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
1b5b0 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 42 29 3b  to(v, addrEofB);
1b5c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
1b5d0 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
1b5e0 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
1b5f0 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  <B.  */.  VdbeNo
1b600 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
1b610 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -lt-B subroutine
1b620 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20  "));.  addrAltB 
1b630 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1b640 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1b650 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75   regOutA, addrOu
1b660 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tA);.  sqlite3Vd
1b670 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1b680 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1b690 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43  addrEofA); VdbeC
1b6a0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
1b6b0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1b6c0 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20   labelCmpr);..  
1b6d0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1b6e0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
1b6f0 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f  ase of A==B.  */
1b700 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
1b710 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  L ){.    addrAeq
1b720 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
1b730 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
1b740 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
1b750 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64    addrAeqB = add
1b760 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41  rAltB;.    addrA
1b770 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ltB++;.  }else{.
1b780 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
1b790 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20  ent((v, "A-eq-B 
1b7a0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1b7b0 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20     addrAeqB =.  
1b7c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b7d0 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1b7e0 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45   regAddrA, addrE
1b7f0 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofA); VdbeCovera
1b800 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
1b810 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61  e3VdbeGoto(v, la
1b820 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20  belCmpr);.  }.. 
1b830 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1b840 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
1b850 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f  case of A>B.  */
1b860 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
1b870 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73  nt((v, "A-gt-B s
1b880 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1b890 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74  addrAgtB = sqlit
1b8a0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1b8b0 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  r(v);.  if( op==
1b8c0 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b  TK_ALL || op==TK
1b8d0 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71  _UNION ){.    sq
1b8e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b8f0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
1b900 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b  OutB, addrOutB);
1b910 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
1b920 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1b930 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20  ield, regAddrB, 
1b940 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43  addrEofB); VdbeC
1b950 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
1b960 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1b970 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20   labelCmpr);..  
1b980 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e  /* This code run
1b990 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61  s once to initia
1b9a0 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e  lize everything.
1b9b0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
1b9c0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
1b9d0 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddr1);.  sqlite3
1b9e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b9f0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1ba00 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b  , addrEofA_noB);
1ba10 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1ba20 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1ba30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1ba40 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64  d, regAddrB, add
1ba50 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65  rEofB); VdbeCove
1ba60 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49  rage(v);..  /* I
1ba70 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69  mplement the mai
1ba80 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a  n merge loop.  *
1ba90 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
1baa0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
1bab0 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c  abelCmpr);.  sql
1bac0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1bad0 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e  , OP_Permutation
1bae0 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  , 0, 0, 0, (char
1baf0 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49  *)aPermute, P4_I
1bb00 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69  NTARRAY);.  sqli
1bb10 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1bb20 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73   OP_Compare, des
1bb30 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e  tA.iSdst, destB.
1bb40 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c  iSdst, nOrderBy,
1bb50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bb60 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
1bb70 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b  )pKeyMerge, P4_K
1bb80 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74  EYINFO);.  sqlit
1bb90 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1bba0 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45  , OPFLAG_PERMUTE
1bbb0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1bbc0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
1bbd0 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64  p, addrAltB, add
1bbe0 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29  rAeqB, addrAgtB)
1bbf0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1bc00 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  );..  /* Jump to
1bc10 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20   the this point 
1bc20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d  in order to term
1bc30 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e  inate the query.
1bc40 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
1bc50 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1bc60 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20  v, labelEnd);.. 
1bc70 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74   /* Reassembly t
1bc80 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
1bc90 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  y so that it wil
1bca0 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72 72 65  l be freed corre
1bcb0 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65  ctly.  ** by the
1bcc0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
1bcd0 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50  n */.  if( p->pP
1bce0 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rior ){.    sqli
1bcf0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
1bd00 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a  db, p->pPrior);.
1bd10 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20    }.  p->pPrior 
1bd20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69  = pPrior;.  pPri
1bd30 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a  or->pNext = p;..
1bd40 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73    /*** TBD:  Ins
1bd50 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63  ert subroutine c
1bd60 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75  alls to close cu
1bd70 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c  rsors on incompl
1bd80 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75  ete.  **** subqu
1bd90 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78  eries ****/.  ex
1bda0 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70  plainComposite(p
1bdb0 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53  Parse, p->op, iS
1bdc0 75 62 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a  ub1, iSub2, 0);.
1bdd0 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
1bde0 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64  >nErr!=0;.}.#end
1bdf0 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
1be00 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1be10 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1be20 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1be30 49 45 57 29 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74  IEW)../* An inst
1be40 61 6e 63 65 20 6f 66 20 74 68 65 20 53 75 62 73  ance of the Subs
1be50 74 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20  tContext object 
1be60 64 65 73 63 72 69 62 65 73 20 61 6e 20 73 75 62  describes an sub
1be70 73 74 69 74 75 74 69 6f 6e 20 65 64 69 74 0a 2a  stitution edit.*
1be80 2a 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65  * to be performe
1be90 64 20 6f 6e 20 61 20 70 61 72 73 65 20 74 72 65  d on a parse tre
1bea0 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66  e..**.** All ref
1beb0 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
1bec0 6e 73 20 69 6e 20 74 61 62 6c 65 20 69 54 61 62  ns in table iTab
1bed0 6c 65 20 61 72 65 20 74 6f 20 62 65 20 72 65 70  le are to be rep
1bee0 6c 61 63 65 64 20 62 79 20 63 6f 72 72 65 73 70  laced by corresp
1bef0 6f 6e 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73  onding.** expres
1bf00 73 69 6f 6e 73 20 69 6e 20 70 45 4c 69 73 74 2e  sions in pEList.
1bf10 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1bf20 63 74 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20  ct SubstContext 
1bf30 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
1bf40 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1bf50 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
1bf60 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54  text */.  int iT
1bf70 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
1bf80 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 72      /* Replace r
1bf90 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69  eferences to thi
1bfa0 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  s table */.  int
1bfb0 20 69 4e 65 77 54 61 62 6c 65 3b 20 20 20 20 20   iNewTable;     
1bfc0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 61         /* New ta
1bfd0 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
1bfe0 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 20  int isLeftJoin; 
1bff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1c000 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20   TK_IF_NULL_ROW 
1c010 6f 70 63 6f 64 65 73 20 6f 6e 20 65 61 63 68 20  opcodes on each 
1c020 72 65 70 6c 61 63 65 6d 65 6e 74 20 2a 2f 0a 20  replacement */. 
1c030 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1c040 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  t;         /* Re
1c050 70 6c 61 63 65 6d 65 6e 74 20 65 78 70 72 65 73  placement expres
1c060 73 69 6f 6e 73 20 2a 2f 0a 7d 20 53 75 62 73 74  sions */.} Subst
1c070 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72  Context;../* For
1c080 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e  ward Declaration
1c090 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s */.static void
1c0a0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 53   substExprList(S
1c0b0 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 45 78  ubstContext*, Ex
1c0c0 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63  prList*);.static
1c0d0 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
1c0e0 74 28 53 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c  t(SubstContext*,
1c0f0 20 53 65 6c 65 63 74 2a 2c 20 69 6e 74 29 3b 0a   Select*, int);.
1c100 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f  ./*.** Scan thro
1c110 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69  ugh the expressi
1c120 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61  on pExpr.  Repla
1c130 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  ce every referen
1c140 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d  ce to.** a colum
1c150 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65  n in table numbe
1c160 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20  r iTable with a 
1c170 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c  copy of the iCol
1c180 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20  umn-th.** entry 
1c190 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74  in pEList.  (But
1c1a0 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65   leave reference
1c1b0 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63  s to the ROWID c
1c1c0 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  olumn .** unchan
1c1d0 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ged.).**.** This
1c1e0 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74   routine is part
1c1f0 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69   of the flatteni
1c200 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41  ng procedure.  A
1c210 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f   subquery.** who
1c220 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  se result set is
1c230 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69   defined by pELi
1c240 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e  st appears as en
1c250 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52  try in the.** FR
1c260 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
1c270 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20  ELECT such that 
1c280 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  the VDBE cursor 
1c290 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74  assigned to that
1c2a0 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20  .** FORM clause 
1c2b0 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e  entry is iTable.
1c2c0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
1c2d0 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
1c2e0 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ry .** changes t
1c2f0 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20  o pExpr so that 
1c300 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74  it refers direct
1c310 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65  ly to the source
1c320 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65   table.** of the
1c330 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72   subquery rather
1c340 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
1c350 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
1c360 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
1c370 2a 73 75 62 73 74 45 78 70 72 28 0a 20 20 53 75  *substExpr(.  Su
1c380 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62  bstContext *pSub
1c390 73 74 2c 20 20 2f 2a 20 44 65 73 63 72 69 70 74  st,  /* Descript
1c3a0 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74  ion of the subst
1c3b0 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  itution */.  Exp
1c3c0 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
1c3d0 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77      /* Expr in w
1c3e0 68 69 63 68 20 73 75 62 73 74 69 74 75 74 69 6f  hich substitutio
1c3f0 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20  n occurs */.){. 
1c400 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
1c410 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1c420 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1c430 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
1c440 69 6e 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d  in).   && pExpr-
1c450 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
1c460 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65  ==pSubst->iTable
1c470 0a 20 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d  .  ){.    pExpr-
1c480 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
1c490 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54   = pSubst->iNewT
1c4a0 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
1c4b0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
1c4c0 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
1c4d0 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69  Table==pSubst->i
1c4e0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28  Table ){.    if(
1c4f0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
1c500 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
1c510 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
1c520 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c530 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20   Expr *pNew;.   
1c540 20 20 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d     Expr *pCopy =
1c550 20 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d   pSubst->pEList-
1c560 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  >a[pExpr->iColum
1c570 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  n].pExpr;.      
1c580 45 78 70 72 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a  Expr ifNullRow;.
1c590 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
1c5a0 75 62 73 74 2d 3e 70 45 4c 69 73 74 21 3d 30 20  ubst->pEList!=0 
1c5b0 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
1c5c0 6e 3c 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74  n<pSubst->pEList
1c5d0 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
1c5e0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1c5f0 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70  pLeft==0 && pExp
1c600 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
1c610 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1c620 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 43  3ExprIsVector(pC
1c630 6f 70 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  opy) ){.        
1c640 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72  sqlite3VectorErr
1c650 6f 72 4d 73 67 28 70 53 75 62 73 74 2d 3e 70 50  orMsg(pSubst->pP
1c660 61 72 73 65 2c 20 70 43 6f 70 79 29 3b 0a 20 20  arse, pCopy);.  
1c670 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c680 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1c690 20 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2d   pSubst->pParse-
1c6a0 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28  >db;.        if(
1c6b0 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a   pSubst->isLeftJ
1c6c0 6f 69 6e 20 26 26 20 70 43 6f 70 79 2d 3e 6f 70  oin && pCopy->op
1c6d0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  !=TK_COLUMN ){. 
1c6e0 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
1c6f0 26 69 66 4e 75 6c 6c 52 6f 77 2c 20 30 2c 20 73  &ifNullRow, 0, s
1c700 69 7a 65 6f 66 28 69 66 4e 75 6c 6c 52 6f 77 29  izeof(ifNullRow)
1c710 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e  );.          ifN
1c720 75 6c 6c 52 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49  ullRow.op = TK_I
1c730 46 5f 4e 55 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20  F_NULL_ROW;.    
1c740 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e        ifNullRow.
1c750 70 4c 65 66 74 20 3d 20 70 43 6f 70 79 3b 0a 20  pLeft = pCopy;. 
1c760 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52           ifNullR
1c770 6f 77 2e 69 54 61 62 6c 65 20 3d 20 70 53 75 62  ow.iTable = pSub
1c780 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20  st->iNewTable;. 
1c790 20 20 20 20 20 20 20 20 20 70 43 6f 70 79 20 3d           pCopy =
1c7a0 20 26 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20   &ifNullRow;.   
1c7b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1c7c0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
1c7d0 72 44 75 70 28 64 62 2c 20 70 43 6f 70 79 2c 20  rDup(db, pCopy, 
1c7e0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
1c7f0 70 4e 65 77 20 26 26 20 70 53 75 62 73 74 2d 3e  pNew && pSubst->
1c800 69 73 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  isLeftJoin ){.  
1c810 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50          ExprSetP
1c820 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
1c830 5f 43 61 6e 42 65 4e 75 6c 6c 29 3b 0a 20 20 20  _CanBeNull);.   
1c840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1c850 66 28 20 70 4e 65 77 20 26 26 20 45 78 70 72 48  f( pNew && ExprH
1c860 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1c870 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b  ,EP_FromJoin) ){
1c880 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
1c890 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
1c8a0 20 3d 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74   = pExpr->iRight
1c8b0 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20 20  JoinTable;.     
1c8c0 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70       ExprSetProp
1c8d0 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 46 72  erty(pNew, EP_Fr
1c8e0 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 20  omJoin);.       
1c8f0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
1c900 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1c910 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
1c920 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
1c930 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1c940 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 45  else{.    if( pE
1c950 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e  xpr->op==TK_IF_N
1c960 55 4c 4c 5f 52 4f 57 20 26 26 20 70 45 78 70 72  ULL_ROW && pExpr
1c970 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74  ->iTable==pSubst
1c980 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ->iTable ){.    
1c990 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
1c9a0 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61  = pSubst->iNewTa
1c9b0 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ble;.    }.    p
1c9c0 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75  Expr->pLeft = su
1c9d0 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20  bstExpr(pSubst, 
1c9e0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1c9f0 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
1ca00 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75   = substExpr(pSu
1ca10 62 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  bst, pExpr->pRig
1ca20 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70  ht);.    if( Exp
1ca30 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1ca40 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1ca50 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ) ){.      subst
1ca60 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70  Select(pSubst, p
1ca70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  Expr->x.pSelect,
1ca80 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   1);.    }else{.
1ca90 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
1caa0 69 73 74 28 70 53 75 62 73 74 2c 20 70 45 78 70  ist(pSubst, pExp
1cab0 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
1cac0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1cad0 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20  pExpr;.}.static 
1cae0 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
1caf0 73 74 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65  st(.  SubstConte
1cb00 78 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44  xt *pSubst, /* D
1cb10 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1cb20 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a  e substitution *
1cb30 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
1cb40 69 73 74 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  ist       /* Lis
1cb50 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e  t to scan and in
1cb60 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73   which to make s
1cb70 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 29 7b  ubstitutes */.){
1cb80 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1cb90 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1cba0 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
1cbb0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1cbc0 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  +){.    pList->a
1cbd0 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73  [i].pExpr = subs
1cbe0 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 4c  tExpr(pSubst, pL
1cbf0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
1cc00 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
1cc10 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
1cc20 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20  .  SubstContext 
1cc30 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63  *pSubst, /* Desc
1cc40 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ription of the s
1cc50 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20  ubstitution */. 
1cc60 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
1cc70 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
1cc80 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68   statement in wh
1cc90 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73  ich to make subs
1cca0 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  titutions */.  i
1ccb0 6e 74 20 64 6f 50 72 69 6f 72 20 20 20 20 20 20  nt doPrior      
1ccc0 20 20 20 20 20 2f 2a 20 44 6f 20 73 75 62 73 74       /* Do subst
1ccd0 69 74 75 74 65 73 20 6f 6e 20 70 2d 3e 70 50 72  itutes on p->pPr
1cce0 69 6f 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20  ior too */.){.  
1ccf0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
1cd00 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1cd10 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
1cd20 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29  nt i;.  if( !p )
1cd30 20 72 65 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20   return;.  do{. 
1cd40 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1cd50 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 45 4c 69  (pSubst, p->pELi
1cd60 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
1cd70 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70  prList(pSubst, p
1cd80 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
1cd90 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
1cda0 53 75 62 73 74 2c 20 70 2d 3e 70 4f 72 64 65 72  Subst, p->pOrder
1cdb0 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76  By);.    p->pHav
1cdc0 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28  ing = substExpr(
1cdd0 70 53 75 62 73 74 2c 20 70 2d 3e 70 48 61 76 69  pSubst, p->pHavi
1cde0 6e 67 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  ng);.    p->pWhe
1cdf0 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  re = substExpr(p
1ce00 53 75 62 73 74 2c 20 70 2d 3e 70 57 68 65 72 65  Subst, p->pWhere
1ce10 29 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 2d  );.    pSrc = p-
1ce20 3e 70 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72  >pSrc;.    asser
1ce30 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  t( pSrc!=0 );.  
1ce40 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
1ce50 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e  rc, pItem=pSrc->
1ce60 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
1ce70 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62  em++){.      sub
1ce80 73 74 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c  stSelect(pSubst,
1ce90 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c   pItem->pSelect,
1cea0 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   1);.      if( p
1ceb0 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
1cec0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 75  nc ){.        su
1ced0 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62  bstExprList(pSub
1cee0 73 74 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46  st, pItem->u1.pF
1cef0 75 6e 63 41 72 67 29 3b 0a 20 20 20 20 20 20 7d  uncArg);.      }
1cf00 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
1cf10 20 64 6f 50 72 69 6f 72 20 26 26 20 28 70 20 3d   doPrior && (p =
1cf20 20 70 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20 29   p->pPrior)!=0 )
1cf30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
1cf40 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1cf50 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1cf60 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1cf70 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23  OMIT_VIEW) */..#
1cf80 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
1cf90 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1cfa0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1cfb0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
1cfc0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1cfd0 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
1cfe0 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
1cff0 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e  s as a performan
1d000 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  ce optimization.
1d010 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d020 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74   returns 1 if it
1d030 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61   makes changes a
1d040 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74  nd 0 if no flatt
1d050 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a  ening occurs..**
1d060 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e  .** To understan
1d070 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66  d the concept of
1d080 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e   flattening, con
1d090 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
1d0a0 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a  ing.** query:.**
1d0b0 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
1d0c0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b   FROM (SELECT x+
1d0d0 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
1d0e0 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52  HERE z<100) WHER
1d0f0 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E a>5.**.** The 
1d100 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69  default way of i
1d110 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73  mplementing this
1d120 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65   query is to exe
1d130 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71  cute the.** subq
1d140 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73  uery first and s
1d150 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1d160 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
1d170 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72  table, then.** r
1d180 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  un the outer que
1d190 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f  ry on that tempo
1d1a0 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69  rary table.  Thi
1d1b0 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a  s requires two.*
1d1c0 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68  * passes over th
1d1d0 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72  e data.  Further
1d1e0 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68  more, because th
1d1f0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
1d200 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69  e.** has no indi
1d210 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63  ces, the WHERE c
1d220 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74  lause on the out
1d230 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  er query cannot 
1d240 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e  be.** optimized.
1d250 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1d260 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
1d270 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20  rewrite queries 
1d280 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76  such as the abov
1d290 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  e into.** a sing
1d2a0 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20  le flat select, 
1d2b0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1d2c0 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20       SELECT x+y 
1d2d0 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
1d2e0 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35  RE z<100 AND a>5
1d2f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
1d300 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
1d310 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f  is simplificatio
1d320 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  n gives the same
1d330 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f   result.** but o
1d340 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20  nly has to scan 
1d350 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20  the data once.  
1d360 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69  And because indi
1d370 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78  ces might .** ex
1d380 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ist on the table
1d390 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20   t1, a complete 
1d3a0 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61  scan of the data
1d3b0 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f   might be.** avo
1d3c0 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74  ided..**.** Flat
1d3d0 74 65 6e 69 6e 67 20 69 73 20 73 75 62 6a 65 63  tening is subjec
1d3e0 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t to the followi
1d3f0 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a 0a  ng constraints:.
1d400 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20  **.**  (**)  We 
1d410 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70  no longer attemp
1d420 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67  t to flatten agg
1d430 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65  regate subquerie
1d440 73 2e 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20  s. Was:.**      
1d450 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1d460 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
1d470 72 79 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62  ry cannot both b
1d480 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  e aggregates..**
1d490 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f  .**  (**)  We no
1d4a0 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20   longer attempt 
1d4b0 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65  to flatten aggre
1d4c0 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2e  gate subqueries.
1d4d0 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20   Was:.**        
1d4e0 28 32 29 20 49 66 20 74 68 65 20 73 75 62 71 75  (2) If the subqu
1d4f0 65 72 79 20 69 73 20 61 6e 20 61 67 67 72 65 67  ery is an aggreg
1d500 61 74 65 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20  ate then.**     
1d510 20 20 20 28 32 61 29 20 74 68 65 20 6f 75 74 65     (2a) the oute
1d520 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74  r query must not
1d530 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a   be a join and.*
1d540 2a 20 20 20 20 20 20 20 20 28 32 62 29 20 74 68  *        (2b) th
1d550 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 75  e outer query mu
1d560 73 74 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75  st not use subqu
1d570 65 72 69 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  eries.**        
1d580 20 20 20 20 20 6f 74 68 65 72 20 74 68 61 6e 20       other than 
1d590 74 68 65 20 6f 6e 65 20 46 52 4f 4d 2d 63 6c 61  the one FROM-cla
1d5a0 75 73 65 20 73 75 62 71 75 65 72 79 20 74 68 61  use subquery tha
1d5b0 74 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  t is a candidate
1d5c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1d5d0 66 6f 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20  for flattening. 
1d5e0 20 28 54 68 69 73 20 69 73 20 64 75 65 20 74 6f   (This is due to
1d5f0 20 74 69 63 6b 65 74 20 5b 32 66 37 31 37 30 64   ticket [2f7170d
1d600 37 33 62 66 39 61 62 66 38 30 5d 0a 2a 2a 20 20  73bf9abf80].**  
1d610 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20             from 
1d620 32 30 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a  2015-02-09.).**.
1d630 2a 2a 20 20 20 28 33 29 20 20 49 66 20 74 68 65  **   (3)  If the
1d640 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
1d650 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
1d660 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68  f a LEFT JOIN th
1d670 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 61  en.**        (3a
1d680 29 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6d  ) the subquery m
1d690 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e  ay not be a join
1d6a0 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28   and.**        (
1d6b0 33 62 29 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  3b) the FROM cla
1d6c0 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
1d6d0 65 72 79 20 6d 61 79 20 6e 6f 74 20 63 6f 6e 74  ery may not cont
1d6e0 61 69 6e 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a  ain a virtual.**
1d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62               tab
1d700 6c 65 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  le and.**       
1d710 20 28 33 63 29 20 74 68 65 20 6f 75 74 65 72 20   (3c) the outer 
1d720 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
1d730 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 2a   an aggregate..*
1d740 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20  *.**   (4)  The 
1d750 73 75 62 71 75 65 72 79 20 63 61 6e 20 6e 6f 74  subquery can not
1d760 20 62 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a   be DISTINCT..**
1d770 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e  .**  (**)  At on
1d780 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74  e point restrict
1d790 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29  ions (4) and (5)
1d7a0 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73 65   defined a subse
1d7b0 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a  t of DISTINCT.**
1d7c0 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65 72          sub-quer
1d7d0 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65 78  ies that were ex
1d7e0 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73  cluded from this
1d7f0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52   optimization. R
1d800 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20  estriction .**  
1d810 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73 69        (4) has si
1d820 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65  nce been expande
1d830 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c  d to exclude all
1d840 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75 65   DISTINCT subque
1d850 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  ries..**.**  (**
1d860 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  )  We no longer 
1d870 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74  attempt to flatt
1d880 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  en aggregate sub
1d890 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a  queries.  Was:.*
1d8a0 2a 20 20 20 20 20 20 20 20 49 66 20 74 68 65 20  *        If the 
1d8b0 73 75 62 71 75 65 72 79 20 69 73 20 61 67 67 72  subquery is aggr
1d8c0 65 67 61 74 65 2c 20 74 68 65 20 6f 75 74 65 72  egate, the outer
1d8d0 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62   query may not b
1d8e0 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a  e DISTINCT..**.*
1d8f0 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62  *   (7)  The sub
1d900 71 75 65 72 79 20 6d 75 73 74 20 68 61 76 65 20  query must have 
1d910 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  a FROM clause.  
1d920 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75  TODO:  For subqu
1d930 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a  eries without.**
1d940 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63          A FROM c
1d950 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20  lause, consider 
1d960 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c  adding a FROM cl
1d970 61 75 73 65 20 77 69 74 68 20 74 68 65 20 73 70  ause with the sp
1d980 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ecial.**        
1d990 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63  table sqlite_onc
1d9a0 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  e that consists 
1d9b0 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  of a single row 
1d9c0 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20  containing a.** 
1d9d0 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55         single NU
1d9e0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20  LL..**.**   (8) 
1d9f0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1da00 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e   uses LIMIT then
1da10 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1da20 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f   may not be a jo
1da30 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20  in..**.**   (9) 
1da40 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1da50 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e   uses LIMIT then
1da60 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1da70 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 67 67 72   may not be aggr
1da80 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  egate..**.**  (*
1da90 2a 29 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20  *)  Restriction 
1daa0 28 31 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64  (10) was removed
1dab0 20 66 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f   from the code o
1dac0 6e 20 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74  n 2005-02-05 but
1dad0 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63   we.**        ac
1dae0 63 69 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64  cidently carried
1daf0 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72   the comment for
1db00 77 61 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d  ward until 2014-
1db10 30 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c  09-15.  Original
1db20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .**        const
1db30 72 61 69 6e 74 3a 20 22 49 66 20 74 68 65 20 73  raint: "If the s
1db40 75 62 71 75 65 72 79 20 69 73 20 61 67 67 72 65  ubquery is aggre
1db50 67 61 74 65 20 74 68 65 6e 20 74 68 65 20 6f 75  gate then the ou
1db60 74 65 72 20 71 75 65 72 79 20 0a 2a 2a 20 20 20  ter query .**   
1db70 20 20 20 20 20 6d 61 79 20 6e 6f 74 20 75 73 65       may not use
1db80 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20   LIMIT.".**.**  
1db90 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (11)  The subque
1dba0 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
1dbb0 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62   query may not b
1dbc0 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42  oth have ORDER B
1dbd0 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  Y clauses..**.**
1dbe0 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c    (**)  Not impl
1dbf0 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d  emented.  Subsum
1dc00 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74  ed into restrict
1dc10 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72  ion (3).  Was pr
1dc20 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20  eviously.**     
1dc30 20 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65     a separate re
1dc40 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69  striction derivi
1dc50 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23  ng from ticket #
1dc60 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29  350..**.**  (13)
1dc70 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1dc80 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  nd outer query m
1dc90 61 79 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  ay not both use 
1dca0 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  LIMIT..**.**  (1
1dcb0 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
1dcc0 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4f 46 46   may not use OFF
1dcd0 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29  SET..**.**  (15)
1dce0 20 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71    If the outer q
1dcf0 75 65 72 79 20 69 73 20 70 61 72 74 20 6f 66 20  uery is part of 
1dd00 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
1dd10 74 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20  t, then the.**  
1dd20 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20 6d        subquery m
1dd30 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  ay not use LIMIT
1dd40 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65  ..**        (See
1dd50 20 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e   ticket #2339 an
1dd60 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38  d ticket [02a8e8
1dd70 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  1d44])..**.**  (
1dd80 31 36 29 20 20 49 66 20 74 68 65 20 6f 75 74 65  16)  If the oute
1dd90 72 20 71 75 65 72 79 20 69 73 20 61 67 67 72 65  r query is aggre
1dda0 67 61 74 65 2c 20 74 68 65 6e 20 74 68 65 20 73  gate, then the s
1ddb0 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a  ubquery may not.
1ddc0 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4f 52  **        use OR
1ddd0 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74  DER BY.  (Ticket
1dde0 20 23 32 39 34 32 29 20 20 54 68 69 73 20 75 73   #2942)  This us
1ddf0 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72  ed to not matter
1de00 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c  .**        until
1de10 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74   we introduced t
1de20 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  he group_concat(
1de30 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a  ) function.  .**
1de40 0a 2a 2a 20 20 28 31 37 29 20 20 49 66 20 74 68  .**  (17)  If th
1de50 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20  e subquery is a 
1de60 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1de70 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20   then.**        
1de80 28 31 37 61 29 20 61 6c 6c 20 63 6f 6d 70 6f 75  (17a) all compou
1de90 6e 64 20 6f 70 65 72 61 74 6f 72 73 20 6d 75 73  nd operators mus
1dea0 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t be a UNION ALL
1deb0 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  , and.**        
1dec0 28 31 37 62 29 20 6e 6f 20 74 65 72 6d 73 20 77  (17b) no terms w
1ded0 69 74 68 69 6e 20 74 68 65 20 73 75 62 71 75 65  ithin the subque
1dee0 72 79 20 63 6f 6d 70 6f 75 6e 64 20 6d 61 79 20  ry compound may 
1def0 62 65 20 61 67 67 72 65 67 61 74 65 0a 2a 2a 20  be aggregate.** 
1df00 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 20               or 
1df10 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 0a 2a 2a  DISTINCT, and.**
1df20 20 20 20 20 20 20 20 20 28 31 37 63 29 20 65 76          (17c) ev
1df30 65 72 79 20 74 65 72 6d 20 77 69 74 68 69 6e 20  ery term within 
1df40 74 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d  the subquery com
1df50 70 6f 75 6e 64 20 6d 75 73 74 20 68 61 76 65 20  pound must have 
1df60 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a  a FROM clause.**
1df70 20 20 20 20 20 20 20 20 28 31 37 64 29 20 74 68          (17d) th
1df80 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61  e outer query ma
1df90 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20  y not be.**     
1dfa0 20 20 20 20 20 20 20 20 20 28 31 37 64 31 29 20           (17d1) 
1dfb0 61 67 67 72 65 67 61 74 65 2c 20 6f 72 0a 2a 2a  aggregate, or.**
1dfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 31                (1
1dfd0 37 64 32 29 20 44 49 53 54 49 4e 43 54 2c 20 6f  7d2) DISTINCT, o
1dfe0 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
1dff0 20 20 28 31 37 64 33 29 20 61 20 6a 6f 69 6e 2e    (17d3) a join.
1e000 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  .**.**        Th
1e010 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62  e parent and sub
1e020 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61  -query may conta
1e030 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  in WHERE clauses
1e040 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20  . Subject to.** 
1e050 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31         rules (11
1e060 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29  ), (13) and (14)
1e070 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20  , they may also 
1e080 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59  contain ORDER BY
1e090 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49  ,.**        LIMI
1e0a0 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
1e0b0 75 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75  uses.  The subqu
1e0c0 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61  ery cannot use a
1e0d0 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  ny compound.**  
1e0e0 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f        operator o
1e0f0 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20  ther than UNION 
1e100 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20  ALL because all 
1e110 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75  the other compou
1e120 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65  nd.**        ope
1e130 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69  rators have an i
1e140 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20  mplied DISTINCT 
1e150 77 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f  which is disallo
1e160 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20  wed by.**       
1e170 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   restriction (4)
1e180 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41  ..**.**        A
1e190 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e  lso, each compon
1e1a0 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71  ent of the sub-q
1e1b0 75 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e  uery must return
1e1c0 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
1e1d0 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65  .**        of re
1e1e0 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68  sult columns. Th
1e1f0 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  is is actually a
1e200 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72   requirement for
1e210 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
1e220 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73          SELECT s
1e230 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c  tatement, but al
1e240 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20  l the code here 
1e250 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72  does is make sur
1e260 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20  e that no.**    
1e270 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61      such (illega
1e280 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  l) sub-query is 
1e290 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63  flattened. The c
1e2a0 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63  aller will detec
1e2b0 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  t the.**        
1e2c0 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64  syntax error and
1e2d0 20 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c   return a detail
1e2e0 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  ed message..**.*
1e2f0 2a 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20  *  (18)  If the 
1e300 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1e310 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1e320 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  then all terms o
1e330 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  f the.**        
1e340 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1e350 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75  of the parent mu
1e360 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66  st be simple ref
1e370 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20  erences to .**  
1e380 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66        columns of
1e390 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a   the sub-query..
1e3a0 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 49 66 20  **.**  (19)  If 
1e3b0 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1e3c0 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65  s LIMIT then the
1e3d0 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1e3e0 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68   not.**        h
1e3f0 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ave a WHERE clau
1e400 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20  se..**.**  (20) 
1e410 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
1e420 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
1e430 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20  select, then it 
1e440 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  must not use.** 
1e450 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20         an ORDER 
1e460 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b  BY clause.  Tick
1e470 65 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f  et #3773.  We co
1e480 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63  uld relax this c
1e490 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20  onstraint.**    
1e4a0 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20      somewhat by 
1e4b0 73 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20  saying that the 
1e4c0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
1e4d0 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73  ER BY clause mus
1e4e0 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65  t.**        appe
1e4f0 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64  ar as unmodified
1e500 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
1e510 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
1e520 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20  ry.  But we.**  
1e530 20 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72        have other
1e540 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69   optimizations i
1e550 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77  n mind to deal w
1e560 69 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a  ith that case..*
1e570 2a 0a 2a 2a 20 20 28 32 31 29 20 20 49 66 20 74  *.**  (21)  If t
1e580 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1e590 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20   LIMIT then the 
1e5a0 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20  outer query may 
1e5b0 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  not be.**       
1e5c0 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65   DISTINCT.  (See
1e5d0 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34   ticket [752e164
1e5e0 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32  6fc])..**.**  (2
1e5f0 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
1e600 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 72 65   may not be a re
1e610 63 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a  cursive CTE..**.
1e620 2a 2a 20 20 28 2a 2a 29 20 20 53 75 62 73 75 6d  **  (**)  Subsum
1e630 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74  ed into restrict
1e640 69 6f 6e 20 28 31 37 64 33 29 2e 20 20 57 61 73  ion (17d3).  Was
1e650 3a 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71  : If the outer q
1e660 75 65 72 79 20 69 73 0a 2a 2a 20 20 20 20 20 20  uery is.**      
1e670 20 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54    a recursive CT
1e680 45 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 2d  E, then the sub-
1e690 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
1e6a0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
1e6b0 79 2e 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 69  y..**        Thi
1e6c0 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 69 73  s restriction is
1e6d0 20 62 65 63 61 75 73 65 20 74 72 61 6e 73 66 6f   because transfo
1e6e0 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20  rming the.**    
1e6f0 20 20 20 20 70 61 72 65 6e 74 20 74 6f 20 61 20      parent to a 
1e700 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 63  compound query c
1e710 6f 6e 66 75 73 65 73 20 74 68 65 20 63 6f 64 65  onfuses the code
1e720 20 74 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a   that handles.**
1e730 20 20 20 20 20 20 20 20 72 65 63 75 72 73 69 76          recursiv
1e740 65 20 71 75 65 72 69 65 73 20 69 6e 20 6d 75 6c  e queries in mul
1e750 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a  tiSelect()..**.*
1e760 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c  *  (**)  We no l
1e770 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f  onger attempt to
1e780 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61   flatten aggrega
1e790 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 20  te subqueries.  
1e7a0 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54  Was:.**        T
1e7b0 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20  he subquery may 
1e7c0 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67  not be an aggreg
1e7d0 61 74 65 20 74 68 61 74 20 75 73 65 73 20 74 68  ate that uses th
1e7e0 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29  e built-in min()
1e7f0 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f   or .**        o
1e800 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e  r max() function
1e810 73 2e 20 20 28 57 69 74 68 6f 75 74 20 74 68 69  s.  (Without thi
1e820 73 20 72 65 73 74 72 69 63 74 69 6f 6e 2c 20 61  s restriction, a
1e830 20 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20   query like:.** 
1e840 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 78         "SELECT x
1e850 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d 61   FROM (SELECT ma
1e860 78 28 79 29 2c 20 78 20 46 52 4f 4d 20 74 31 29  x(y), x FROM t1)
1e870 22 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63 65  " would not nece
1e880 73 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20 20  ssarily.**      
1e890 20 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c    return the val
1e8a0 75 65 20 58 20 66 6f 72 20 77 68 69 63 68 20 59  ue X for which Y
1e8b0 20 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a   was maximal.).*
1e8c0 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  *.**.** In this 
1e8d0 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22  routine, the "p"
1e8e0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
1e8f0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f  pointer to the o
1e900 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54  uter query..** T
1e910 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
1e920 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  ->pSrc->a[iFrom]
1e930 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65  .  isAgg is true
1e940 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
1e950 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72  ery.** uses aggr
1e960 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  egates..**.** If
1e970 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e   flattening is n
1e980 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68  ot attempted, th
1e990 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1e9a0 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e  no-op and return
1e9b0 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74  s 0..** If flatt
1e9c0 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74  ening is attempt
1e9d0 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
1e9e0 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a  returns 1..**.**
1e9f0 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72   All of the expr
1ea00 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20  ession analysis 
1ea10 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f  must occur on bo
1ea20 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  th the outer que
1ea30 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75  ry and.** the su
1ea40 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68  bquery before th
1ea50 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e  is routine runs.
1ea60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1ea70 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a  lattenSubquery(.
1ea80 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1ea90 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1eaa0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
1eab0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1eac0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
1ead0 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43  t or outer SELEC
1eae0 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
1eaf0 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20   int iFrom,     
1eb00 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
1eb10 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f  n p->pSrc->a[] o
1eb20 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71  f the inner subq
1eb30 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
1eb40 41 67 67 20 20 20 20 20 20 20 20 20 20 20 20 2f  Agg            /
1eb50 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20  * True if outer 
1eb60 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72  SELECT uses aggr
1eb70 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
1eb80 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
1eb90 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
1eba0 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
1ebb0 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
1ebc0 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b  Select *pParent;
1ebd0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 55      /* Current U
1ebe0 4e 49 4f 4e 20 41 4c 4c 20 74 65 72 6d 20 6f 66  NION ALL term of
1ebf0 20 74 68 65 20 6f 74 68 65 72 20 71 75 65 72 79   the other query
1ec00 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
1ec10 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ub;       /* The
1ec20 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20   inner query or 
1ec30 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20  "subquery" */.  
1ec40 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20  Select *pSub1;  
1ec50 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1ec60 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20  o the rightmost 
1ec70 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75  select in sub-qu
1ec80 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
1ec90 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20   *pSrc;      /* 
1eca0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
1ecb0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1ecc0 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
1ecd0 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54  *pSubSrc;   /* T
1ece0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1ecf0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  f the subquery *
1ed00 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
1ed10 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
1ed20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
1ed30 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74   the pSub result
1ed40 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20   set temp table 
1ed50 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 50 61 72  */.  int iNewPar
1ed60 65 6e 74 20 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c  ent = -1;/* Repl
1ed70 61 63 65 6d 65 6e 74 20 74 61 62 6c 65 20 66 6f  acement table fo
1ed80 72 20 69 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69  r iParent */.  i
1ed90 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20  nt isLeftJoin = 
1eda0 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 70 53  0; /* True if pS
1edb0 75 62 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ub is the right 
1edc0 73 69 64 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  side of a LEFT J
1edd0 4f 49 4e 20 2a 2f 20 20 20 20 0a 20 20 69 6e 74  OIN */    .  int
1ede0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1edf0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1ee00 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
1ee10 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
1ee20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
1ee30 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1ee40 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1ee50 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20  tem *pSubitem;  
1ee60 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
1ee70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1ee80 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1ee90 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
1eea0 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67  ee if flattening
1eeb0 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20   is permitted.  
1eec0 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e  Return 0 if not.
1eed0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1eee0 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
1eef0 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
1ef00 3b 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  ;.  if( Optimiza
1ef10 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
1ef20 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61   SQLITE_QueryFla
1ef30 74 74 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e  ttener) ) return
1ef40 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
1ef50 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
1ef60 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30  pSrc && iFrom>=0
1ef70 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e   && iFrom<pSrc->
1ef80 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74  nSrc );.  pSubit
1ef90 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46  em = &pSrc->a[iF
1efa0 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20  rom];.  iParent 
1efb0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72  = pSubitem->iCur
1efc0 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53  sor;.  pSub = pS
1efd0 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
1efe0 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21  .  assert( pSub!
1eff0 3d 30 20 29 3b 0a 0a 20 20 70 53 75 62 53 72 63  =0 );..  pSubSrc
1f000 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20   = pSub->pSrc;. 
1f010 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63   assert( pSubSrc
1f020 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74   );.  /* Prior t
1f030 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c  o version 3.1.2,
1f040 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
1f050 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65  OFFSET had to be
1f060 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74   simple constant
1f070 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69  s,.  ** not arbi
1f080 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  trary expression
1f090 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f  s, we allowed so
1f0a0 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20  me combining of 
1f0b0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
1f0c0 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68  .  ** because th
1f0d0 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70  ey could be comp
1f0e0 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  uted at compile-
1f0f0 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20  time.  But when 
1f100 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
1f110 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62  .  ** became arb
1f120 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  itrary expressio
1f130 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63  ns, we were forc
1f140 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69  ed to add restri
1f150 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a  ctions (13).  **
1f160 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20   and (14). */.  
1f170 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1f180 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20   && p->pLimit ) 
1f190 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1f1a0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1f1b0 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20  ction (13) */.  
1f1c0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1f1d0 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74   && pSub->pLimit
1f1e0 2d 3e 70 52 69 67 68 74 20 29 20 72 65 74 75 72  ->pRight ) retur
1f1f0 6e 20 30 3b 20 20 20 2f 2a 20 52 65 73 74 72 69  n 0;   /* Restri
1f200 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20  ction (14) */.  
1f210 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
1f220 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29 21   & SF_Compound)!
1f230 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d  =0 && pSub->pLim
1f240 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  it ){.    return
1f250 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1f260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f280 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1f290 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  5) */.  }.  if( 
1f2a0 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  pSubSrc->nSrc==0
1f2b0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1f2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2d0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1f2e0 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (7)  */.  if( 
1f2f0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
1f300 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72   SF_Distinct ) r
1f310 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1f320 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1f330 6e 20 28 34 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (4)  */.  if( 
1f340 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1f350 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c  (pSrc->nSrc>1 ||
1f360 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20   isAgg) ){.     
1f370 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1f380 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1f390 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a  s (8)(9) */.  }.
1f3a0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1f3b0 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  y && pSub->pOrde
1f3c0 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75  rBy ){.     retu
1f3d0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1f3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f400 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1f410 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  11) */.  }.  if(
1f420 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e   isAgg && pSub->
1f430 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72  pOrderBy ) retur
1f440 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1f450 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1f460 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28  on (16) */.  if(
1f470 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1f480 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
1f490 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1f4a0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1f4b0 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28  on (19) */.  if(
1f4c0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1f4d0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1f4e0 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
1f4f0 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
1f500 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
1f510 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f  triction (21) */
1f520 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d  .  }.  if( pSub-
1f530 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1f540 52 65 63 75 72 73 69 76 65 29 20 29 7b 0a 20 20  Recursive) ){.  
1f550 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52    return 0; /* R
1f560 65 73 74 72 69 63 74 69 6f 6e 73 20 28 32 32 29  estrictions (22)
1f570 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20   */.  }..  /*.  
1f580 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65  ** If the subque
1f590 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
1f5a0 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46  operand of a LEF
1f5b0 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68 65  T JOIN, then the
1f5c0 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 6d  .  ** subquery m
1f5d0 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e  ay not be a join
1f5e0 20 69 74 73 65 6c 66 20 28 33 61 29 2e 20 45 78   itself (3a). Ex
1f5f0 61 6d 70 6c 65 20 6f 66 20 77 68 79 20 74 68 69  ample of why thi
1f600 73 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 6c  s is not.  ** al
1f610 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
1f620 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
1f630 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20   OUTER JOIN (t2 
1f640 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20  JOIN t3).  **.  
1f650 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
1f660 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
1f670 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
1f680 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
1f690 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
1f6a0 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a  2) JOIN t3.  **.
1f6b0 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f    ** which is no
1f6c0 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d  t at all the sam
1f6d0 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20  e thing..  **.  
1f6e0 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65  ** If the subque
1f6f0 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
1f700 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46  operand of a LEF
1f710 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68 65  T JOIN, then the
1f720 20 6f 75 74 65 72 0a 20 20 2a 2a 20 71 75 65 72   outer.  ** quer
1f730 79 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 61  y cannot be an a
1f740 67 67 72 65 67 61 74 65 2e 20 28 33 63 29 20 20  ggregate. (3c)  
1f750 54 68 69 73 20 69 73 20 61 6e 20 61 72 74 69 66  This is an artif
1f760 61 63 74 20 6f 66 20 74 68 65 20 77 61 79 0a 20  act of the way. 
1f770 20 2a 2a 20 61 67 67 72 65 67 61 74 65 73 20 61   ** aggregates a
1f780 72 65 20 70 72 6f 63 65 73 73 65 64 20 2d 20 74  re processed - t
1f790 68 65 72 65 20 69 73 20 6e 6f 20 6d 65 63 68 61  here is no mecha
1f7a0 6e 69 73 6d 20 74 6f 20 64 65 74 65 72 6d 69 6e  nism to determin
1f7b0 65 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 4c 45  e if.  ** the LE
1f7c0 46 54 20 4a 4f 49 4e 20 74 61 62 6c 65 20 73 68  FT JOIN table sh
1f7d0 6f 75 6c 64 20 62 65 20 61 6c 6c 2d 4e 55 4c 4c  ould be all-NULL
1f7e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20  ..  **.  ** See 
1f7f0 61 6c 73 6f 20 74 69 63 6b 65 74 73 20 23 33 30  also tickets #30
1f800 36 2c 20 23 33 35 30 2c 20 61 6e 64 20 23 33 33  6, #350, and #33
1f810 30 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  00..  */.  if( (
1f820 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69  pSubitem->fg.joi
1f830 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
1f840 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 73 4c 65  )!=0 ){.    isLe
1f850 66 74 4a 6f 69 6e 20 3d 20 31 3b 0a 20 20 20 20  ftJoin = 1;.    
1f860 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
1f870 63 3e 31 20 7c 7c 20 69 73 41 67 67 20 7c 7c 20  c>1 || isAgg || 
1f880 49 73 56 69 72 74 75 61 6c 28 70 53 75 62 53 72  IsVirtual(pSubSr
1f890 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29 7b  c->a[0].pTab) ){
1f8a0 0a 20 20 20 20 20 20 2f 2a 20 20 28 33 61 29 20  .      /*  (3a) 
1f8b0 20 20 20 20 20 20 20 20 20 20 20 20 28 33 63 29              (3c)
1f8c0 20 20 20 20 20 28 33 62 29 20 2a 2f 0a 20 20 20       (3b) */.   
1f8d0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1f8e0 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
1f8f0 4c 49 54 45 5f 45 58 54 52 41 5f 49 46 4e 55 4c  LITE_EXTRA_IFNUL
1f900 4c 52 4f 57 0a 20 20 65 6c 73 65 20 69 66 28 20  LROW.  else if( 
1f910 69 46 72 6f 6d 3e 30 20 26 26 20 21 69 73 41 67  iFrom>0 && !isAg
1f920 67 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74 74  g ){.    /* Sett
1f930 69 6e 67 20 69 73 4c 65 66 74 4a 6f 69 6e 20 74  ing isLeftJoin t
1f940 6f 20 2d 31 20 63 61 75 73 65 73 20 4f 50 5f 49  o -1 causes OP_I
1f950 66 4e 75 6c 6c 52 6f 77 20 6f 70 63 6f 64 65 73  fNullRow opcodes
1f960 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64   to be generated
1f970 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72   for.    ** ever
1f980 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  y reference to a
1f990 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ny result column
1f9a0 20 66 72 6f 6d 20 73 75 62 71 75 65 72 79 20 69   from subquery i
1f9b0 6e 20 61 20 6a 6f 69 6e 2c 20 65 76 65 6e 0a 20  n a join, even. 
1f9c0 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 74 68 65     ** though the
1f9d0 79 20 61 72 65 20 6e 6f 74 20 6e 65 63 65 73 73  y are not necess
1f9e0 61 72 79 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ary.  This will 
1f9f0 73 74 72 65 73 73 2d 74 65 73 74 20 74 68 65 20  stress-test the 
1fa00 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20 0a 20 20  OP_IfNullRow .  
1fa10 20 20 2a 2a 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a    ** opcode. */.
1fa20 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d      isLeftJoin =
1fa30 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   -1;.  }.#endif.
1fa40 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  .  /* Restrictio
1fa50 6e 20 28 31 37 29 3a 20 49 66 20 74 68 65 20 73  n (17): If the s
1fa60 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1fa70 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74  mpound SELECT, t
1fa80 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a  hen it must.  **
1fa90 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e   use only the UN
1faa0 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
1fab0 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68  . And none of th
1fac0 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20  e simple select 
1fad0 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61  queries.  ** tha
1fae0 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f  t make up the co
1faf0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72  mpound SELECT ar
1fb00 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  e allowed to be 
1fb10 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69 73  aggregate or dis
1fb20 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69  tinct.  ** queri
1fb30 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  es..  */.  if( p
1fb40 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  Sub->pPrior ){. 
1fb50 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
1fb60 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72  derBy ){.      r
1fb70 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73  eturn 0;  /* Res
1fb80 74 72 69 63 74 69 6f 6e 20 28 32 30 29 20 2a 2f  triction (20) */
1fb90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
1fba0 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46  sAgg || (p->selF
1fbb0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1fbc0 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e  ct)!=0 || pSrc->
1fbd0 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  nSrc!=1 ){.     
1fbe0 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 28 31   return 0; /* (1
1fbf0 37 64 31 29 2c 20 28 31 37 64 32 29 2c 20 6f 72  7d1), (17d2), or
1fc00 20 28 31 37 64 33 29 20 2a 2f 0a 20 20 20 20 7d   (17d3) */.    }
1fc10 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70  .    for(pSub1=p
1fc20 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62  Sub; pSub1; pSub
1fc30 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29  1=pSub1->pPrior)
1fc40 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1fc50 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
1fc60 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
1fc70 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
1fc80 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  ==SF_Distinct );
1fc90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fca0 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
1fcb0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
1fcc0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
1fcd0 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b  =SF_Aggregate );
1fce0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1fcf0 53 75 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a  Sub->pSrc!=0 );.
1fd00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
1fd10 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ub->pEList->nExp
1fd20 72 3d 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74  r==pSub1->pEList
1fd30 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
1fd40 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c   if( (pSub1->sel
1fd50 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
1fd60 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
1fd70 65 29 29 21 3d 30 20 20 20 20 2f 2a 20 28 31 37  e))!=0    /* (17
1fd80 62 29 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c 20  b) */.       || 
1fd90 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26  (pSub1->pPrior &
1fda0 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f  & pSub1->op!=TK_
1fdb0 41 4c 4c 29 20 20 20 20 20 20 20 20 20 20 20 20  ALL)            
1fdc0 20 20 20 20 20 2f 2a 20 28 31 37 61 29 20 2a 2f       /* (17a) */
1fdd0 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31  .       || pSub1
1fde0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 20 20  ->pSrc->nSrc<1  
1fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe10 2f 2a 20 28 31 37 63 29 20 2a 2f 0a 20 20 20 20  /* (17c) */.    
1fe20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74    ){.        ret
1fe30 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
1fe40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1fe50 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  Sub1->pSrc->nSrc
1fe60 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  >1 );.    }..   
1fe70 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1fe80 28 31 38 29 2e 20 2a 2f 0a 20 20 20 20 69 66 28  (18). */.    if(
1fe90 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
1fea0 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
1feb0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
1fec0 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  <p->pOrderBy->nE
1fed0 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  xpr; ii++){.    
1fee0 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
1fef0 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69  rBy->a[ii].u.x.i
1ff00 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20  OrderByCol==0 ) 
1ff10 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1ff20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1ff30 2a 20 45 78 2d 72 65 73 74 72 69 63 74 69 6f 6e  * Ex-restriction
1ff40 20 28 32 33 29 3a 0a 20 20 2a 2a 20 54 68 65 20   (23):.  ** The 
1ff50 6f 6e 6c 79 20 77 61 79 20 74 68 61 74 20 74 68  only way that th
1ff60 65 20 72 65 63 75 72 73 69 76 65 20 70 61 72 74  e recursive part
1ff70 20 6f 66 20 61 20 43 54 45 20 63 61 6e 20 63 6f   of a CTE can co
1ff80 6e 74 61 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  ntain a compound
1ff90 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69  .  ** subquery i
1ffa0 73 20 66 6f 72 20 74 68 65 20 73 75 62 71 75 65  s for the subque
1ffb0 72 79 20 74 6f 20 62 65 20 6f 6e 65 20 74 65 72  ry to be one ter
1ffc0 6d 20 6f 66 20 61 20 6a 6f 69 6e 2e 20 20 42 75  m of a join.  Bu
1ffd0 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 73 75  t if the.  ** su
1ffe0 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e  bquery is a join
1fff0 2c 20 74 68 65 6e 20 74 68 65 20 66 6c 61 74 74  , then the flatt
20000 65 6e 69 6e 67 20 68 61 73 20 61 6c 72 65 61 64  ening has alread
20010 79 20 62 65 65 6e 20 73 74 6f 70 70 65 64 20 62  y been stopped b
20020 79 0a 20 20 2a 2a 20 72 65 73 74 72 69 63 74 69  y.  ** restricti
20030 6f 6e 20 28 31 37 64 33 29 0a 20 20 2a 2f 0a 20  on (17d3).  */. 
20040 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
20050 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
20060 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 53 75 62  sive)==0 || pSub
20070 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 0a  ->pPrior==0 );..
20080 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72    /***** If we r
20090 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
200a0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
200b0 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f  ermitted. *****/
200c0 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31  .  SELECTTRACE(1
200d0 2c 70 50 61 72 73 65 2c 70 2c 28 22 66 6c 61 74  ,pParse,p,("flat
200e0 74 65 6e 20 25 73 2e 25 70 20 66 72 6f 6d 20 74  ten %s.%p from t
200f0 65 72 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  erm %d\n",.     
20100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
20110 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 53  ub->zSelName, pS
20120 75 62 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20  ub, iFrom));..  
20130 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65  /* Authorize the
20140 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70   subquery */.  p
20150 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
20160 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ext = pSubitem->
20170 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c  zName;.  TESTONL
20180 59 28 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75  Y(i =) sqlite3Au
20190 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
201a0 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
201b0 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63  , 0, 0);.  testc
201c0 61 73 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44  ase( i==SQLITE_D
201d0 45 4e 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  ENY );.  pParse-
201e0 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
201f0 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
20200 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  t;..  /* If the 
20210 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
20220 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
20230 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28  tatement, then (
20240 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a  by restrictions.
20250 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61    ** 17 and 18 a
20260 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62 65  bove) it must be
20270 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64   a UNION ALL and
20280 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
20290 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20  y must .  ** be 
202a0 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a  of the form:.  *
202b0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
202c0 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52  T <expr-list> FR
202d0 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29  OM (<sub-query>)
202e0 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20   <where-clause> 
202f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  .  **.  ** follo
20300 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52  wed by any ORDER
20310 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f   BY, LIMIT and/o
20320 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  r OFFSET clauses
20330 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a  . This block.  *
20340 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f  * creates N-1 co
20350 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 65  pies of the pare
20360 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f 75 74  nt query without
20370 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c   any ORDER BY, L
20380 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46  IMIT or .  ** OF
20390 46 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64  FSET clauses and
203a0 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74   joins them to t
203b0 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64  he left-hand-sid
203c0 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
203d0 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49  l.  ** using UNI
203e0 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73  ON ALL operators
203f0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e  . In this case N
20400 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
20410 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65  f simple.  ** se
20420 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20  lect statements 
20430 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  in the compound 
20440 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a  sub-query..  **.
20450 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
20460 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
20470 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20  CT a+1 FROM (.  
20480 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
20490 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a   x FROM tab.  **
204a0 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
204b0 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  L.  **        SE
204c0 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a  LECT y FROM tab.
204d0 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
204e0 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
204f0 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32    SELECT abs(z*2
20500 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a  ) FROM tab2.  **
20510 20 20 20 20 20 29 20 57 48 45 52 45 20 61 21 3d       ) WHERE a!=
20520 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a  5 ORDER BY 1.  *
20530 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d  *.  ** Transform
20540 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20  ed into:.  **.  
20550 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
20560 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45  1 FROM tab WHERE
20570 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20   x+1!=5.  **    
20580 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
20590 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46      SELECT y+1 F
205a0 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b  ROM tab WHERE y+
205b0 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e  1!=5.  **     UN
205c0 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
205d0 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29   SELECT abs(z*2)
205e0 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45  +1 FROM tab2 WHE
205f0 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35  RE abs(z*2)+1!=5
20600 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20  .  **     ORDER 
20610 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  BY 1.  **.  ** W
20620 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20  e call this the 
20630 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65  "compound-subque
20640 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a  ry flattening"..
20650 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d    */.  for(pSub=
20660 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53  pSub->pPrior; pS
20670 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70  ub; pSub=pSub->p
20680 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65  Prior){.    Sele
20690 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78  ct *pNew;.    Ex
206a0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
206b0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
206c0 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
206d0 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
206e0 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
206f0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
20700 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
20710 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  0;.    p->pSrc =
20720 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f   0;.    p->pPrio
20730 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c  r = 0;.    p->pL
20740 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  imit = 0;.    pN
20750 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ew = sqlite3Sele
20760 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b  ctDup(db, p, 0);
20770 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
20780 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20  ctSetName(pNew, 
20790 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b  pSub->zSelName);
207a0 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
207b0 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e   pLimit;.    p->
207c0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
207d0 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  rBy;.    p->pSrc
207e0 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e   = pSrc;.    p->
207f0 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20  op = TK_ALL;.   
20800 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
20810 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
20820 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65  = pPrior;.    }e
20830 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
20840 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
20850 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
20860 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65  or ) pPrior->pNe
20870 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  xt = pNew;.     
20880 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
20890 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
208a0 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  r = pNew;.      
208b0 53 45 4c 45 43 54 54 52 41 43 45 28 32 2c 70 50  SELECTTRACE(2,pP
208c0 61 72 73 65 2c 70 2c 0a 20 20 20 20 20 20 20 20  arse,p,.        
208d0 20 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   ("compound-subq
208e0 75 65 72 79 20 66 6c 61 74 74 65 6e 65 72 20 63  uery flattener c
208f0 72 65 61 74 65 73 20 25 73 2e 25 70 20 61 73 20  reates %s.%p as 
20900 70 65 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20  peer\n",.       
20910 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65    pNew->zSelName
20920 2c 20 70 4e 65 77 29 29 3b 0a 20 20 20 20 7d 0a  , pNew));.    }.
20930 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
20940 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
20950 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  n 1;.  }..  /* B
20960 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20  egin flattening 
20970 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74  the iFrom-th ent
20980 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
20990 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74  lause .  ** in t
209a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
209b0 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53    */.  pSub = pS
209c0 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ub1 = pSubitem->
209d0 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44  pSelect;..  /* D
209e0 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69  elete the transi
209f0 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
20a00 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ure associated w
20a10 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
20a20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
20a30 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
20a40 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
20a50 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  se);.  sqlite3Db
20a60 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
20a70 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  m->zName);.  sql
20a80 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
20a90 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  Subitem->zAlias)
20aa0 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  ;.  pSubitem->zD
20ab0 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70  atabase = 0;.  p
20ac0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  Subitem->zName =
20ad0 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
20ae0 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53  zAlias = 0;.  pS
20af0 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ubitem->pSelect 
20b00 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72  = 0;..  /* Defer
20b10 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61   deleting the Ta
20b20 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ble object assoc
20b30 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
20b40 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74   ** subquery unt
20b50 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  il code generati
20b60 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c  on is.  ** compl
20b70 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ete, since there
20b80 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74   may still exist
20b90 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69   Expr.pTab entri
20ba0 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66  es that.  ** ref
20bb0 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  er to the subque
20bc0 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c  ry even after fl
20bd0 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65  attening.  Ticke
20be0 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20  t #3346..  **.  
20bf0 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  ** pSubitem->pTa
20c00 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d  b is always non-
20c10 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73  NULL by test res
20c20 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65  trictions and te
20c30 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a  sts above..  */.
20c40 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75    if( ALWAYS(pSu
20c50 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20  bitem->pTab!=0) 
20c60 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
20c70 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74  abToDel = pSubit
20c80 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
20c90 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61  ( pTabToDel->nTa
20ca0 62 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20  bRef==1 ){.     
20cb0 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
20cc0 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
20cd0 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
20ce0 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65  ;.      pTabToDe
20cf0 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d  l->pNextZombie =
20d00 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d   pToplevel->pZom
20d10 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54  bieTab;.      pT
20d20 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
20d30 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b  Tab = pTabToDel;
20d40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20d50 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61    pTabToDel->nTa
20d60 62 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  bRef--;.    }.  
20d70 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62    pSubitem->pTab
20d80 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
20d90 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f  The following lo
20da0 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  op runs once for
20db0 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20   each term in a 
20dc0 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
20dd0 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e  y.  ** flattenin
20de0 67 20 28 61 73 20 64 65 73 63 72 69 62 65 64 20  g (as described 
20df0 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61  above).  If we a
20e00 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65  re doing a diffe
20e10 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f  rent kind.  ** o
20e20 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61  f flattening - a
20e30 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65   flattening othe
20e40 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e  r than a compoun
20e50 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
20e60 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65  ening -.  ** the
20e70 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79  n this loop only
20e80 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a   runs once..  **
20e90 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
20ea0 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65  moves all of the
20eb0 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f   FROM elements o
20ec0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
20ed0 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  nto the.  ** the
20ee0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
20ef0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
20f00 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74    Before doing t
20f10 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20  his, remember.  
20f20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  ** the cursor nu
20f30 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69  mber for the ori
20f40 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72  ginal outer quer
20f50 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69  y FROM element i
20f60 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20  n.  ** iParent. 
20f70 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72   The iParent cur
20f80 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  sor will never b
20f90 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75  e used.  Subsequ
20fa0 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69  ent code.  ** wi
20fb0 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69  ll scan expressi
20fc0 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ons looking for 
20fd0 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63  iParent referenc
20fe0 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20  es and replace. 
20ff0 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65   ** those refere
21000 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73  nces with expres
21010 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c  sions that resol
21020 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  ve to the subque
21030 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65  ry FROM.  ** ele
21040 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77  ments we are now
21050 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a   copying in..  *
21060 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d  /.  for(pParent=
21070 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72  p; pParent; pPar
21080 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72  ent=pParent->pPr
21090 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e  ior, pSub=pSub->
210a0 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74  pPrior){.    int
210b0 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38   nSubSrc;.    u8
210c0 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
210d0 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75     pSubSrc = pSu
210e0 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  b->pSrc;     /* 
210f0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 73  FROM clause of s
21100 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e  ubquery */.    n
21110 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63  SubSrc = pSubSrc
21120 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62  ->nSrc;  /* Numb
21130 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73  er of terms in s
21140 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61  ubquery FROM cla
21150 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20  use */.    pSrc 
21160 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b  = pParent->pSrc;
21170 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
21180 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
21190 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69   query */..    i
211a0 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20  f( pSrc ){.     
211b0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
211c0 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74  ==p );  /* First
211d0 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68   time through th
211e0 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
211f0 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69  jointype = pSubi
21200 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
21210 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21220 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
21230 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64  nt!=p );  /* 2nd
21240 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
21250 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68  times through th
21260 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
21270 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e  pSrc = pParent->
21280 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
21290 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20  cListAppend(db, 
212a0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
212b0 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20  if( pSrc==0 ){. 
212c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64         assert( d
212d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
212e0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
212f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21300 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  .    /* The subq
21310 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e 67  uery uses a sing
21320 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46  le slot of the F
21330 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
21340 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71  e outer.    ** q
21350 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73 75  uery.  If the su
21360 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20  bquery has more 
21370 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74  than one element
21380 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61   in its FROM cla
21390 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  use,.    ** then
213a0 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65   expand the oute
213b0 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20  r query to make 
213c0 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20  space for it to 
213d0 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74  hold all element
213e0 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  s.    ** of the 
213f0 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a  subquery..    **
21400 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
21410 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
21420 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
21430 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20  tabA, (SELECT * 
21440 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29  FROM sub1, sub2)
21450 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20  , tabB;.    **. 
21460 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20     ** The outer 
21470 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74  query has 3 slot
21480 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  s in its FROM cl
21490 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20  ause.  One slot 
214a0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  of the.    ** ou
214b0 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20 6d  ter query (the m
214c0 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75  iddle slot) is u
214d0 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71 75  sed by the subqu
214e0 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20  ery.  The next. 
214f0 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63     ** block of c
21500 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  ode will expand 
21510 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
21520 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20 34  FROM clause to 4
21530 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54   slots..    ** T
21540 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 20 69  he middle slot i
21550 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77  s expanded to tw
21560 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72  o slots in order
21570 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 0a 20   to make space. 
21580 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 77     ** for the tw
21590 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  o elements in th
215a0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
215b0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
215c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53     */.    if( nS
215d0 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  ubSrc>1 ){.     
215e0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
215f0 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53   pSrc = sqlite3S
21600 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
21610 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d  , pSrc, nSubSrc-
21620 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20  1,iFrom+1);.    
21630 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
21640 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
21650 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
21660 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
21670 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d  ransfer the FROM
21680 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72   clause terms fr
21690 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20  om the subquery 
216a0 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
216b0 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
216c0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
216d0 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29   i<nSubSrc; i++)
216e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
216f0 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
21700 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
21710 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20  .pUsing);.      
21720 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b  assert( pSrc->a[
21730 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e 69 73 54 61  i+iFrom].fg.isTa
21740 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  bFunc==0 );.    
21750 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f    pSrc->a[i+iFro
21760 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b  m] = pSubSrc->a[
21770 69 5d 3b 0a 20 20 20 20 20 20 69 4e 65 77 50 61  i];.      iNewPa
21780 72 65 6e 74 20 3d 20 70 53 75 62 53 72 63 2d 3e  rent = pSubSrc->
21790 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[i].iCursor;.  
217a0 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
217b0 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
217c0 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
217d0 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
217e0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66  pSrc->a[iFrom].f
217f0 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  g.jointype = joi
21800 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a  ntype;.  .    /*
21810 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
21820 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
21830 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
21840 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20  essions for .   
21850 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
21860 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
21870 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
21880 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
21890 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
218a0 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
218b0 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
218c0 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
218d0 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
218e0 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
218f0 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20      **   \      
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
21910 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
21920 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
21930 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
21940 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f    **    \_______
21950 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
21960 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
21970 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21980 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a  _________/.    *
21990 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b  *.    ** We look
219a0 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
219b0 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
219c0 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
219d0 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
219e0 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62     ** "a" we sub
219f0 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
21a00 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
21a10 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
21a20 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
21a30 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
21a40 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
21a50 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
21a60 20 70 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d   point, any non-
21a70 7a 65 72 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c  zero iOrderByCol
21a80 20 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74 65   values indicate
21a90 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
21aa0 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 6c 75  ** ORDER BY colu
21ab0 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  mn expression is
21ac0 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68   identical to th
21ad0 65 20 69 4f 72 64 65 72 42 79 43 6f 6c 27 74 68  e iOrderByCol'th
21ae0 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
21af0 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 62 79  sion returned by
21b00 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
21b10 74 20 70 53 75 62 2e 20 53 69 6e 63 65 20 74 68  t pSub. Since th
21b20 65 73 65 20 76 61 6c 75 65 73 0a 20 20 20 20 20  ese values.     
21b30 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73   ** do not neces
21b40 73 61 72 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e  sarily correspon
21b50 64 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  d to columns in 
21b60 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
21b70 20 70 50 61 72 65 6e 74 2c 0a 20 20 20 20 20 20   pParent,.      
21b80 2a 2a 20 7a 65 72 6f 20 74 68 65 6d 20 62 65 66  ** zero them bef
21b90 6f 72 65 20 74 72 61 6e 73 66 65 72 69 6e 67 20  ore transfering 
21ba0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
21bb0 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  use..      **.  
21bc0 20 20 20 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67      ** Not doing
21bd0 20 74 68 69 73 20 6d 61 79 20 63 61 75 73 65 20   this may cause 
21be0 61 6e 20 65 72 72 6f 72 20 69 66 20 61 20 73 75  an error if a su
21bf0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f  bsequent call to
21c00 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66   this.      ** f
21c10 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
21c20 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 20 63 6f   to flatten a co
21c30 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
21c40 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 0a 20 20   into pParent.  
21c50 20 20 20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79      ** (the only
21c60 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
21c70 70 70 65 6e 20 69 73 20 69 66 20 74 68 65 20 63  ppen is if the c
21c80 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
21c90 79 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 75  y is.      ** cu
21ca0 72 72 65 6e 74 6c 79 20 70 61 72 74 20 6f 66 20  rrently part of 
21cb0 70 53 75 62 2d 3e 70 53 72 63 29 2e 20 53 65 65  pSub->pSrc). See
21cc0 20 74 69 63 6b 65 74 20 5b 64 31 31 61 36 65 39   ticket [d11a6e9
21cd0 30 38 66 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20  08f].  */.      
21ce0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
21cf0 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65  By = pSub->pOrde
21d00 72 42 79 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  rBy;.      for(i
21d10 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
21d20 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
21d30 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
21d40 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
21d50 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Col = 0;.      }
21d60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21d70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
21d80 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==0 );.      ass
21d90 65 72 74 28 20 70 53 75 62 2d 3e 70 50 72 69 6f  ert( pSub->pPrio
21da0 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  r==0 );.      pP
21db0 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20  arent->pOrderBy 
21dc0 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
21dd0 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79    pSub->pOrderBy
21de0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
21df0 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
21e00 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
21e10 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  ->pWhere, 0);.  
21e20 20 20 69 66 28 20 69 73 4c 65 66 74 4a 6f 69 6e    if( isLeftJoin
21e30 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4a  >0 ){.      setJ
21e40 6f 69 6e 45 78 70 72 28 70 57 68 65 72 65 2c 20  oinExpr(pWhere, 
21e50 69 4e 65 77 50 61 72 65 6e 74 29 3b 0a 20 20 20  iNewParent);.   
21e60 20 7d 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e   }.    pParent->
21e70 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
21e80 45 78 70 72 41 6e 64 28 64 62 2c 20 70 57 68 65  ExprAnd(db, pWhe
21e90 72 65 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  re, pParent->pWh
21ea0 65 72 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62  ere);.    if( db
21eb0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
21ec0 30 20 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74  0 ){.      Subst
21ed0 43 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20  Context x;.     
21ee0 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   x.pParse = pPar
21ef0 73 65 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62  se;.      x.iTab
21f00 6c 65 20 3d 20 69 50 61 72 65 6e 74 3b 0a 20 20  le = iParent;.  
21f10 20 20 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20      x.iNewTable 
21f20 3d 20 69 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20  = iNewParent;.  
21f30 20 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e      x.isLeftJoin
21f40 20 3d 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20   = isLeftJoin;. 
21f50 20 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20       x.pEList = 
21f60 70 53 75 62 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  pSub->pEList;.  
21f70 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
21f80 26 78 2c 20 70 50 61 72 65 6e 74 2c 20 30 29 3b  &x, pParent, 0);
21f90 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
21fa0 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
21fb0 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
21fc0 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
21fd0 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20  nner or the.    
21fe0 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  ** outer query i
21ff0 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20  s distinct. .   
22000 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d   */.    pParent-
22010 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75  >selFlags |= pSu
22020 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
22030 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20  _Distinct;.  .  
22040 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45    /*.    ** SELE
22050 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c  CT ... FROM (SEL
22060 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20  ECT ... LIMIT a 
22070 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20  OFFSET b) LIMIT 
22080 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20  x OFFSET y;.    
22090 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73  **.    ** One is
220a0 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20   tempted to try 
220b0 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74  to add a and b t
220c0 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69  o combine the li
220d0 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a  mits.  But this.
220e0 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
220f0 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c  work if either l
22100 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
22110 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
22120 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
22130 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
22140 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70  pLimit = pSub->p
22150 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75  Limit;.      pSu
22160 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  b->pLimit = 0;. 
22170 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
22180 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20  inially, delete 
22190 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20  what is left of 
221a0 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  the subquery and
221b0 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63   return.  ** suc
221c0 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  cess..  */.  sql
221d0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
221e0 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69  (db, pSub1);..#i
221f0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
22200 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
22210 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
22220 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45   0x100 ){.    SE
22230 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
22240 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72  pParse,p,("After
22250 20 66 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e 22 29   flattening:\n")
22260 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
22270 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
22280 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
22290 66 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  f..  return 1;.}
222a0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
222b0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
222c0 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
222d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
222e0 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 0a 0a 23 69  T_VIEW) */....#i
222f0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
22300 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
22310 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
22320 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
22330 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73  *.** Make copies
22340 20 6f 66 20 72 65 6c 65 76 61 6e 74 20 57 48 45   of relevant WHE
22350 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
22360 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
22370 72 79 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 57  ry into.** the W
22380 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 73  HERE clause of s
22390 75 62 71 75 65 72 79 2e 20 20 45 78 61 6d 70 6c  ubquery.  Exampl
223a0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  e:.**.**    SELE
223b0 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
223c0 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53  T a AS x, c-d AS
223d0 20 79 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52   y FROM t1) WHER
223e0 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a  E x=5 AND y=10;.
223f0 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65  **.** Transforme
22400 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20  d into:.**.**   
22410 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
22420 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63  SELECT a AS x, c
22430 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 20  -d AS y FROM t1 
22440 57 48 45 52 45 20 61 3d 35 20 41 4e 44 20 63 2d  WHERE a=5 AND c-
22450 64 3d 31 30 29 0a 2a 2a 20 20 20 20 20 57 48 45  d=10).**     WHE
22460 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b  RE x=5 AND y=10;
22470 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f 70 65 20  .**.** The hope 
22480 69 73 20 74 68 61 74 20 74 68 65 20 74 65 72 6d  is that the term
22490 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  s added to the i
224a0 6e 6e 65 72 20 71 75 65 72 79 20 77 69 6c 6c 20  nner query will 
224b0 6d 61 6b 65 20 69 74 20 6d 6f 72 65 0a 2a 2a 20  make it more.** 
224c0 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
224d0 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
224e0 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
224f0 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  n if:.**.**   (1
22500 29 20 28 2a 2a 20 54 68 69 73 20 72 65 73 74 72  ) (** This restr
22510 69 63 74 69 6f 6e 20 77 61 73 20 72 65 6d 6f 76  iction was remov
22520 65 64 20 6f 6e 20 32 30 31 37 2d 30 39 2d 32 39  ed on 2017-09-29
22530 2e 20 20 57 65 20 75 73 65 64 20 74 6f 0a 2a 2a  .  We used to.**
22540 20 20 20 20 20 20 20 20 20 20 20 64 69 73 61 6c             disal
22550 6c 6f 77 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  low this optimiz
22560 61 74 69 6f 6e 20 66 6f 72 20 61 67 67 72 65 67  ation for aggreg
22570 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2c 20  ate subqueries, 
22580 62 75 74 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20  but now.**      
22590 20 20 20 20 20 69 74 20 69 73 20 61 6c 6c 6f 77       it is allow
225a0 65 64 20 62 79 20 70 75 74 74 69 6e 67 20 74 68  ed by putting th
225b0 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
225c0 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   the HAVING clau
225d0 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  se..**          
225e0 20 54 68 65 20 61 64 64 65 64 20 48 41 56 49 4e   The added HAVIN
225f0 47 20 63 6c 61 75 73 65 20 69 73 20 70 6f 69 6e  G clause is poin
22600 74 6c 65 73 73 20 69 66 20 74 68 65 20 73 75 62  tless if the sub
22610 71 75 65 72 79 20 6c 61 63 6b 73 0a 2a 2a 20 20  query lacks.**  
22620 20 20 20 20 20 20 20 20 20 61 20 47 52 4f 55 50           a GROUP
22630 20 42 59 20 63 6c 61 75 73 65 2e 20 20 42 75 74   BY clause.  But
22640 20 73 75 63 68 20 61 20 48 41 56 49 4e 47 20 63   such a HAVING c
22650 6c 61 75 73 65 20 69 73 20 61 6c 73 6f 20 68 61  lause is also ha
22660 72 6d 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 20  rmless.**       
22670 20 20 20 20 73 6f 20 74 68 65 72 65 20 64 6f 65      so there doe
22680 73 20 6e 6f 74 20 61 70 70 65 61 72 20 74 6f 20  s not appear to 
22690 62 65 20 61 6e 79 20 72 65 61 73 6f 6e 20 74 6f  be any reason to
226a0 20 61 64 64 20 65 78 74 72 61 20 6c 6f 67 69 63   add extra logic
226b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74 6f  .**           to
226c0 20 73 75 70 70 72 65 73 73 20 69 74 2e 20 2a 2a   suppress it. **
226d0 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54 68  ).**.**   (2) Th
226e0 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73  e inner query is
226f0 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 70   the recursive p
22700 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20  art of a common 
22710 74 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  table expression
22720 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54 68  ..**.**   (3) Th
22730 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 68 61  e inner query ha
22740 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  s a LIMIT clause
22750 20 28 73 69 6e 63 65 20 74 68 65 20 63 68 61 6e   (since the chan
22760 67 65 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  ges to the WHERE
22770 0a 2a 2a 20 20 20 20 20 20 20 63 6c 6f 73 65 20  .**       close 
22780 77 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65  would change the
22790 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
227a0 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  LIMIT)..**.**   
227b0 28 34 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75  (4) The inner qu
227c0 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
227d0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
227e0 46 54 20 4a 4f 49 4e 20 61 6e 64 20 74 68 65 0a  FT JOIN and the.
227f0 2a 2a 20 20 20 20 20 20 20 65 78 70 72 65 73 73  **       express
22800 69 6f 6e 20 74 6f 20 62 65 20 70 75 73 68 65 64  ion to be pushed
22810 20 64 6f 77 6e 20 64 6f 65 73 20 6e 6f 74 20 63   down does not c
22820 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ome from the ON 
22830 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  clause.**       
22840 6f 6e 20 74 68 61 74 20 4c 45 46 54 20 4a 4f 49  on that LEFT JOI
22850 4e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54  N..**.**   (5) T
22860 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
22870 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69  expression origi
22880 6e 61 74 65 73 20 69 6e 20 74 68 65 20 4f 4e 20  nates in the ON 
22890 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a  or USING clause.
228a0 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20 4c 45  **       of a LE
228b0 46 54 20 4a 4f 49 4e 20 77 68 65 72 65 20 69 43  FT JOIN where iC
228c0 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 74 68 65  ursor is not the
228d0 20 72 69 67 68 74 2d 68 61 6e 64 20 74 61 62 6c   right-hand tabl
228e0 65 20 6f 66 20 74 68 61 74 0a 2a 2a 20 20 20 20  e of that.**    
228f0 20 20 20 6c 65 66 74 20 6a 6f 69 6e 2e 20 20 41     left join.  A
22900 6e 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  n example:.**.**
22910 20 20 20 20 20 20 20 20 20 20 20 53 45 4c 45 43             SELEC
22920 54 20 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  T *.**          
22930 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 31 20   FROM (SELECT 1 
22940 41 53 20 61 31 20 55 4e 49 4f 4e 20 41 4c 4c 20  AS a1 UNION ALL 
22950 53 45 4c 45 43 54 20 32 29 20 41 53 20 61 61 0a  SELECT 2) AS aa.
22960 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4a 4f 49  **           JOI
22970 4e 20 28 53 45 4c 45 43 54 20 31 20 41 53 20 62  N (SELECT 1 AS b
22980 32 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  2 UNION ALL SELE
22990 43 54 20 32 29 20 41 53 20 62 62 20 4f 4e 20 28  CT 2) AS bb ON (
229a0 61 31 3d 62 32 29 0a 2a 2a 20 20 20 20 20 20 20  a1=b2).**       
229b0 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 28 53      LEFT JOIN (S
229c0 45 4c 45 43 54 20 38 20 41 53 20 63 33 20 55 4e  ELECT 8 AS c3 UN
229d0 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 39  ION ALL SELECT 9
229e0 29 20 41 53 20 63 63 20 4f 4e 20 28 62 32 3d 32  ) AS cc ON (b2=2
229f0 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 54  );.**.**       T
22a00 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
22a10 72 20 69 73 20 74 68 72 65 65 20 72 6f 77 73 3a  r is three rows:
22a20 20 20 28 31 2c 31 2c 4e 55 4c 4c 29 2c 28 32 2c    (1,1,NULL),(2,
22a30 32 2c 38 29 2c 28 32 2c 32 2c 39 29 2e 0a 2a 2a  2,8),(2,2,9)..**
22a40 20 20 20 20 20 20 20 42 75 74 20 69 66 20 74 68         But if th
22a50 65 20 28 62 32 3d 32 29 20 74 65 72 6d 20 77 65  e (b2=2) term we
22a60 72 65 20 74 6f 20 62 65 20 70 75 73 68 65 64 20  re to be pushed 
22a70 64 6f 77 6e 20 69 6e 74 6f 20 74 68 65 20 62 62  down into the bb
22a80 20 73 75 62 71 75 65 72 79 2c 0a 2a 2a 20 20 20   subquery,.**   
22a90 20 20 20 20 74 68 65 6e 20 74 68 65 20 28 31 2c      then the (1,
22aa0 31 2c 4e 55 4c 4c 29 20 72 6f 77 20 77 6f 75 6c  1,NULL) row woul
22ab0 64 20 62 65 20 73 75 70 70 72 65 73 73 65 64 2e  d be suppressed.
22ac0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  .**.** Return 0 
22ad0 69 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72  if no changes ar
22ae0 65 20 6d 61 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a  e made and non-z
22af0 65 72 6f 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f  ero if one or mo
22b00 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  re WHERE clause.
22b10 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 64 75 70  ** terms are dup
22b20 6c 69 63 61 74 65 64 20 69 6e 74 6f 20 74 68 65  licated into the
22b30 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
22b40 61 74 69 63 20 69 6e 74 20 70 75 73 68 44 6f 77  atic int pushDow
22b50 6e 57 68 65 72 65 54 65 72 6d 73 28 0a 20 20 50  nWhereTerms(.  P
22b60 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
22b70 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
22b80 6e 74 65 78 74 20 28 66 6f 72 20 6d 61 6c 6c 6f  ntext (for mallo
22b90 63 28 29 20 61 6e 64 20 65 72 72 6f 72 20 72 65  c() and error re
22ba0 70 6f 72 74 69 6e 67 29 20 2a 2f 0a 20 20 53 65  porting) */.  Se
22bb0 6c 65 63 74 20 2a 70 53 75 62 71 2c 20 20 20 20  lect *pSubq,    
22bc0 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75      /* The subqu
22bd0 65 72 79 20 77 68 6f 73 65 20 57 48 45 52 45 20  ery whose WHERE 
22be0 63 6c 61 75 73 65 20 69 73 20 74 6f 20 62 65 20  clause is to be 
22bf0 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45  augmented */.  E
22c00 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
22c10 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
22c20 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
22c30 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
22c40 20 69 6e 74 20 69 43 75 72 73 6f 72 2c 20 20 20   int iCursor,   
22c50 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
22c60 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 73   number of the s
22c70 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
22c80 20 69 73 4c 65 66 74 4a 6f 69 6e 20 20 20 20 20   isLeftJoin     
22c90 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 53     /* True if pS
22ca0 75 62 71 20 69 73 20 74 68 65 20 72 69 67 68 74  ubq is the right
22cb0 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20   term of a LEFT 
22cc0 4a 4f 49 4e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  JOIN */.){.  Exp
22cd0 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e  r *pNew;.  int n
22ce0 43 68 6e 67 20 3d 20 30 3b 0a 20 20 69 66 28 20  Chng = 0;.  if( 
22cf0 70 57 68 65 72 65 3d 3d 30 20 29 20 72 65 74 75  pWhere==0 ) retu
22d00 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 53 75 62  rn 0;.  if( pSub
22d10 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  q->selFlags & SF
22d20 5f 52 65 63 75 72 73 69 76 65 20 29 20 72 65 74  _Recursive ) ret
22d30 75 72 6e 20 30 3b 20 20 2f 2a 20 72 65 73 74 72  urn 0;  /* restr
22d40 69 63 74 69 6f 6e 20 28 32 29 20 2a 2f 0a 0a 23  iction (2) */..#
22d50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22d60 55 47 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65  UG.  /* Only the
22d70 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 61   first term of a
22d80 20 63 6f 6d 70 6f 75 6e 64 20 63 61 6e 20 68 61   compound can ha
22d90 76 65 20 61 20 57 49 54 48 20 63 6c 61 75 73 65  ve a WITH clause
22da0 2e 20 20 42 75 74 20 6d 61 6b 65 0a 20 20 2a 2a  .  But make.  **
22db0 20 73 75 72 65 20 6e 6f 20 6f 74 68 65 72 20 74   sure no other t
22dc0 65 72 6d 73 20 61 72 65 20 6d 61 72 6b 65 64 20  erms are marked 
22dd0 53 46 5f 52 65 63 75 72 73 69 76 65 20 69 6e 20  SF_Recursive in 
22de0 63 61 73 65 20 73 6f 6d 65 74 68 69 6e 67 20 63  case something c
22df0 68 61 6e 67 65 73 0a 20 20 2a 2a 20 69 6e 20 74  hanges.  ** in t
22e00 68 65 20 66 75 74 75 72 65 2e 0a 20 20 2a 2f 0a  he future..  */.
22e10 20 20 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a    {.    Select *
22e20 70 58 3b 20 20 0a 20 20 20 20 66 6f 72 28 70 58  pX;  .    for(pX
22e30 3d 70 53 75 62 71 3b 20 70 58 3b 20 70 58 3d 70  =pSubq; pX; pX=p
22e40 58 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  X->pPrior){.    
22e50 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 73    assert( (pX->s
22e60 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65  elFlags & (SF_Re
22e70 63 75 72 73 69 76 65 29 29 3d 3d 30 20 29 3b 0a  cursive))==0 );.
22e80 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
22e90 0a 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e 70  ..  if( pSubq->p
22ea0 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20 20 20  Limit!=0 ){.    
22eb0 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73  return 0; /* res
22ec0 74 72 69 63 74 69 6f 6e 20 28 33 29 20 2a 2f 0a  triction (3) */.
22ed0 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 57 68    }.  while( pWh
22ee0 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  ere->op==TK_AND 
22ef0 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20  ){.    nChng += 
22f00 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72  pushDownWhereTer
22f10 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75 62 71  ms(pParse, pSubq
22f20 2c 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74  , pWhere->pRight
22f30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f50 20 20 69 43 75 72 73 6f 72 2c 20 69 73 4c 65 66    iCursor, isLef
22f60 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 57 68 65  tJoin);.    pWhe
22f70 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 4c 65  re = pWhere->pLe
22f80 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  ft;.  }.  if( is
22f90 4c 65 66 74 4a 6f 69 6e 0a 20 20 20 26 26 20 28  LeftJoin.   && (
22fa0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
22fb0 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f  pWhere,EP_FromJo
22fc0 69 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  in)==0.         
22fd0 7c 7c 20 70 57 68 65 72 65 2d 3e 69 52 69 67 68  || pWhere->iRigh
22fe0 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 69 43 75 72  tJoinTable!=iCur
22ff0 73 6f 72 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  sor).  ){.    re
23000 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72  turn 0; /* restr
23010 69 63 74 69 6f 6e 20 28 34 29 20 2a 2f 0a 20 20  iction (4) */.  
23020 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  }.  if( ExprHasP
23030 72 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c 45  roperty(pWhere,E
23040 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 26 26 20 70  P_FromJoin) && p
23050 57 68 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f 69  Where->iRightJoi
23060 6e 54 61 62 6c 65 21 3d 69 43 75 72 73 6f 72 20  nTable!=iCursor 
23070 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
23080 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20   /* restriction 
23090 28 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  (5) */.  }.  if(
230a0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61   sqlite3ExprIsTa
230b0 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 57 68 65  bleConstant(pWhe
230c0 72 65 2c 20 69 43 75 72 73 6f 72 29 20 29 7b 0a  re, iCursor) ){.
230d0 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20      nChng++;.   
230e0 20 77 68 69 6c 65 28 20 70 53 75 62 71 20 29 7b   while( pSubq ){
230f0 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e 74  .      SubstCont
23100 65 78 74 20 78 3b 0a 20 20 20 20 20 20 70 4e 65  ext x;.      pNe
23110 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  w = sqlite3ExprD
23120 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
23130 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 20  Where, 0);.     
23140 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28 70   unsetJoinExpr(p
23150 4e 65 77 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  New, -1);.      
23160 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  x.pParse = pPars
23170 65 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c  e;.      x.iTabl
23180 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20  e = iCursor;.   
23190 20 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d     x.iNewTable =
231a0 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20   iCursor;.      
231b0 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30  x.isLeftJoin = 0
231c0 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c 69 73 74  ;.      x.pEList
231d0 20 3d 20 70 53 75 62 71 2d 3e 70 45 4c 69 73 74   = pSubq->pEList
231e0 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
231f0 75 62 73 74 45 78 70 72 28 26 78 2c 20 70 4e 65  ubstExpr(&x, pNe
23200 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  w);.      if( pS
23210 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ubq->selFlags & 
23220 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a  SF_Aggregate ){.
23230 20 20 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70          pSubq->p
23240 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
23250 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
23260 64 62 2c 20 70 53 75 62 71 2d 3e 70 48 61 76 69  db, pSubq->pHavi
23270 6e 67 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  ng, pNew);.     
23280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23290 70 53 75 62 71 2d 3e 70 57 68 65 72 65 20 3d 20  pSubq->pWhere = 
232a0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
232b0 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 75 62 71  Parse->db, pSubq
232c0 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b  ->pWhere, pNew);
232d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
232e0 53 75 62 71 20 3d 20 70 53 75 62 71 2d 3e 70 50  Subq = pSubq->pP
232f0 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rior;.    }.  }.
23300 20 20 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b 0a    return nChng;.
23310 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
23320 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
23330 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
23340 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
23350 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a  IT_VIEW) */../*.
23360 2a 2a 20 54 68 65 20 70 46 75 6e 63 20 69 73 20  ** The pFunc is 
23370 74 68 65 20 6f 6e 6c 79 20 61 67 67 72 65 67 61  the only aggrega
23380 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74  te function in t
23390 68 65 20 71 75 65 72 79 2e 20 20 43 68 65 63 6b  he query.  Check
233a0 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20 74 68   to see.** if th
233b0 65 20 71 75 65 72 79 20 69 73 20 61 20 63 61 6e  e query is a can
233c0 64 69 64 61 74 65 20 66 6f 72 20 74 68 65 20 6d  didate for the m
233d0 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74  in/max optimizat
233e0 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
233f0 68 65 20 71 75 65 72 79 20 69 73 20 61 20 63 61  he query is a ca
23400 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65 20  ndidate for the 
23410 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61  min/max optimiza
23420 74 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74 0a 2a  tion, then set.*
23430 2a 20 2a 70 70 4d 69 6e 4d 61 78 20 74 6f 20 62  * *ppMinMax to b
23440 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
23450 61 75 73 65 20 74 6f 20 62 65 20 75 73 65 64 20  ause to be used 
23460 66 6f 72 20 74 68 65 20 6f 70 74 69 6d 69 7a 61  for the optimiza
23470 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 74 75  tion.** and retu
23480 72 6e 20 65 69 74 68 65 72 20 57 48 45 52 45 5f  rn either WHERE_
23490 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57  ORDERBY_MIN or W
234a0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
234b0 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 0a 2a 2a   depending on.**
234c0 20 77 68 65 74 68 65 72 20 70 46 75 6e 63 20 69   whether pFunc i
234d0 73 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  s a min() or max
234e0 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  () function..**.
234f0 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  ** If the query 
23500 69 73 20 6e 6f 74 20 61 20 63 61 6e 64 69 64 61  is not a candida
23510 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d  te for the min/m
23520 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  ax optimization,
23530 20 72 65 74 75 72 6e 0a 2a 2a 20 57 48 45 52 45   return.** WHERE
23540 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20  _ORDERBY_NORMAL 
23550 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 7a  (which must be z
23560 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ero)..**.** This
23570 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
23580 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 67   called after ag
23590 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
235a0 73 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 6c  s have been.** l
235b0 6f 63 61 74 65 64 20 62 75 74 20 62 65 66 6f 72  ocated but befor
235c0 65 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74  e their argument
235d0 73 20 68 61 76 65 20 62 65 65 6e 20 73 75 62 6a  s have been subj
235e0 65 63 74 65 64 20 74 6f 20 61 67 67 72 65 67 61  ected to aggrega
235f0 74 65 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2e 0a  te.** analysis..
23600 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e  */.static u8 min
23610 4d 61 78 51 75 65 72 79 28 73 71 6c 69 74 65 33  MaxQuery(sqlite3
23620 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 46 75 6e   *db, Expr *pFun
23630 63 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70  c, ExprList **pp
23640 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65  MinMax){.  int e
23650 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
23660 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20  RBY_NORMAL;     
23670 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
23680 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
23690 70 45 4c 69 73 74 20 3d 20 70 46 75 6e 63 2d 3e  pEList = pFunc->
236a0 78 2e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 41  x.pList;    /* A
236b0 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67 20  rguments to agg 
236c0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  function */.  co
236d0 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 3b  nst char *zFunc;
236e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236f0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61      /* Name of a
23700 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
23710 6e 20 70 46 75 6e 63 20 2a 2f 0a 20 20 45 78 70  n pFunc */.  Exp
23720 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
23730 0a 20 20 75 38 20 73 6f 72 74 4f 72 64 65 72 3b  .  u8 sortOrder;
23740 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d  ..  assert( *ppM
23750 69 6e 4d 61 78 3d 3d 30 20 29 3b 0a 20 20 61 73  inMax==0 );.  as
23760 73 65 72 74 28 20 70 46 75 6e 63 2d 3e 6f 70 3d  sert( pFunc->op=
23770 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
23780 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74   );.  if( pEList
23790 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e  ==0 || pEList->n
237a0 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
237b0 20 65 52 65 74 3b 0a 20 20 7a 46 75 6e 63 20 3d   eRet;.  zFunc =
237c0 20 70 46 75 6e 63 2d 3e 75 2e 7a 54 6f 6b 65 6e   pFunc->u.zToken
237d0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
237e0 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d  trICmp(zFunc, "m
237f0 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65  in")==0 ){.    e
23800 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
23810 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 73 6f 72  RBY_MIN;.    sor
23820 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f  tOrder = SQLITE_
23830 53 4f 5f 41 53 43 3b 0a 20 20 7d 65 6c 73 65 20  SO_ASC;.  }else 
23840 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
23850 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29  mp(zFunc, "max")
23860 3d 3d 30 20 29 7b 0a 20 20 20 20 65 52 65 74 20  ==0 ){.    eRet 
23870 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
23880 4d 41 58 3b 0a 20 20 20 20 73 6f 72 74 4f 72 64  MAX;.    sortOrd
23890 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 44  er = SQLITE_SO_D
238a0 45 53 43 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ESC;.  }else{.  
238b0 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 20    return eRet;. 
238c0 20 7d 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d   }.  *ppMinMax =
238d0 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69   pOrderBy = sqli
238e0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
238f0 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20  b, pEList, 0);. 
23900 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
23910 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  y!=0 || db->mall
23920 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
23930 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72  ( pOrderBy ) pOr
23940 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74  derBy->a[0].sort
23950 4f 72 64 65 72 20 3d 20 73 6f 72 74 4f 72 64 65  Order = sortOrde
23960 72 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65 74  r;.  return eRet
23970 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
23980 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
23990 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
239a0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
239b0 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  an aggregate que
239c0 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ry..** The secon
239d0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  d argument is th
239e0 65 20 61 73 73 6f 63 69 61 74 65 64 20 61 67 67  e associated agg
239f0 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65  regate-info obje
23a00 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  ct. This .** fun
23a10 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74  ction tests if t
23a20 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20  he SELECT is of 
23a30 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
23a40 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
23a50 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a  ) FROM <tbl>.**.
23a60 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20 69  ** where table i
23a70 73 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  s a database tab
23a80 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65  le, not a sub-se
23a90 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66  lect or view. If
23aa0 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f   the query.** do
23ab0 65 73 20 6d 61 74 63 68 20 74 68 69 73 20 70 61  es match this pa
23ac0 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f  ttern, then a po
23ad0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62  inter to the Tab
23ae0 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73  le object repres
23af0 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20  enting.** <tbl> 
23b00 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
23b10 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74  erwise, 0 is ret
23b20 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
23b30 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65   Table *isSimple
23b40 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c  Count(Select *p,
23b50 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
23b60 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  fo){.  Table *pT
23b70 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  ab;.  Expr *pExp
23b80 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  r;..  assert( !p
23b90 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20  ->pGroupBy );.. 
23ba0 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c   if( p->pWhere |
23bb0 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  | p->pEList->nEx
23bc0 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e  pr!=1 .   || p->
23bd0 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c  pSrc->nSrc!=1 ||
23be0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
23bf0 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20  Select.  ){.    
23c00 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
23c10 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pTab = p->pSrc->
23c20 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78  a[0].pTab;.  pEx
23c30 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
23c40 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73  a[0].pExpr;.  as
23c50 73 65 72 74 28 20 70 54 61 62 20 26 26 20 21 70  sert( pTab && !p
23c60 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20  Tab->pSelect && 
23c70 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20  pExpr );..  if( 
23c80 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
23c90 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
23ca0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
23cb0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72  AGG_FUNCTION ) r
23cc0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e  eturn 0;.  if( N
23cd0 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e  EVER(pAggInfo->n
23ce0 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75 72  Func==0) ) retur
23cf0 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67  n 0;.  if( (pAgg
23d00 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70  Info->aFunc[0].p
23d10 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26  Func->funcFlags&
23d20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e  SQLITE_FUNC_COUN
23d30 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  T)==0 ) return 0
23d40 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66  ;.  if( pExpr->f
23d50 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74  lags&EP_Distinct
23d60 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
23d70 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
23d80 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75  /*.** If the sou
23d90 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61  rce-list item pa
23da0 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
23db0 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65  ent was augmente
23dc0 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44  d with an.** IND
23dd0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
23de0 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61  then try to loca
23df0 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  te the specified
23e00 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65   index. If there
23e10 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20 63  .** was such a c
23e20 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61  lause and the na
23e30 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74  med index cannot
23e40 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
23e50 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  n .** SQLITE_ERR
23e60 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20  OR and leave an 
23e70 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
23e80 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75   Otherwise, popu
23e90 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e  late .** pFrom->
23ea0 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72  pIndex and retur
23eb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
23ec0 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78  int sqlite3Index
23ed0 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65  edByLookup(Parse
23ee0 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74   *pParse, struct
23ef0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
23f00 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72  From){.  if( pFr
23f10 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f  om->pTab && pFro
23f20 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
23f30 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  y ){.    Table *
23f40 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
23f50 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49  ab;.    char *zI
23f60 6e 64 65 78 65 64 42 79 20 3d 20 70 46 72 6f 6d  ndexedBy = pFrom
23f70 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 3b  ->u1.zIndexedBy;
23f80 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
23f90 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
23fa0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20  Tab->pIndex; .  
23fb0 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73 71        pIdx && sq
23fc0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 64  lite3StrICmp(pId
23fd0 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78  x->zName, zIndex
23fe0 65 64 42 79 29 3b 20 0a 20 20 20 20 20 20 20 20  edBy); .        
23ff0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
24000 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
24010 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73  !pIdx ){.      s
24020 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
24030 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
24040 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64  index: %s", zInd
24050 65 78 65 64 42 79 2c 20 30 29 3b 0a 20 20 20 20  exedBy, 0);.    
24060 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
24070 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20  chema = 1;.     
24080 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
24090 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
240a0 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64 65 78 20  pFrom->pIBIndex 
240b0 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65  = pIdx;.  }.  re
240c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
240d0 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63  }./*.** Detect c
240e0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
240f0 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75  tatements that u
24100 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  se an ORDER BY c
24110 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20 61  lause with .** a
24120 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  n alternative co
24130 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
24140 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ..**.**    SELEC
24150 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58  T ... FROM t1 EX
24160 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20  CEPT SELECT ... 
24170 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59  FROM t2 ORDER BY
24180 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a   .. COLLATE ....
24190 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  **.** These are 
241a0 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 73  rewritten as a s
241b0 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  ubquery:.**.**  
241c0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
241d0 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d  (SELECT ... FROM
241e0 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   t1 EXCEPT SELEC
241f0 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a  T ... FROM t2).*
24200 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 2e  *     ORDER BY .
24210 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a  .. COLLATE ....*
24220 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66  *.** This transf
24230 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63 65  ormation is nece
24240 73 73 61 72 79 20 62 65 63 61 75 73 65 20 74 68  ssary because th
24250 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  e multiSelectOrd
24260 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a  erBy() routine.*
24270 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67 65 6e  * above that gen
24280 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
24290 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53  for a compound S
242a0 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f 52  ELECT with an OR
242b0 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a  DER BY clause.**
242c0 20 75 73 65 73 20 61 20 6d 65 72 67 65 20 61 6c   uses a merge al
242d0 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65 71  gorithm that req
242e0 75 69 72 65 73 20 74 68 65 20 73 61 6d 65 20 63  uires the same c
242f0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
24300 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75  e on the.** resu
24310 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e  lt columns as on
24320 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
24330 61 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b 65  ause.  See ticke
24340 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e  t.** http://www.
24350 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69  sqlite.org/src/i
24360 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a 2a  nfo/6709574d2a.*
24370 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66  *.** This transf
24380 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  ormation is only
24390 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43 45   needed for EXCE
243a0 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20 61  PT, INTERSECT, a
243b0 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65  nd UNION..** The
243c0 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
243d0 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20 77  tor works fine w
243e0 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  ith multiSelectO
243f0 72 64 65 72 42 79 28 29 20 65 76 65 6e 20 77 68  rderBy() even wh
24400 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  en.** there are 
24410 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69 6e  COLLATE terms in
24420 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a   the ORDER BY..*
24430 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e  /.static int con
24440 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65  vertCompoundSele
24450 63 74 54 6f 53 75 62 71 75 65 72 79 28 57 61 6c  ctToSubquery(Wal
24460 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
24470 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
24480 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  i;.  Select *pNe
24490 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b  w;.  Select *pX;
244a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
244b0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
244c0 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63  t_item *a;.  Src
244d0 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20  List *pNewSrc;. 
244e0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a   Parse *pParse;.
244f0 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a    Token dummy;..
24500 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d    if( p->pPrior=
24510 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
24520 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20  Continue;.  if( 
24530 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
24540 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
24550 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70  inue;.  for(pX=p
24560 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d  ; pX && (pX->op=
24570 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f  =TK_ALL || pX->o
24580 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70  p==TK_SELECT); p
24590 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a  X=pX->pPrior){}.
245a0 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72 65    if( pX==0 ) re
245b0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
245c0 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64  e;.  a = p->pOrd
245d0 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69  erBy->a;.  for(i
245e0 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  =p->pOrderBy->nE
245f0 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  xpr-1; i>=0; i--
24600 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d 2e  ){.    if( a[i].
24610 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
24620 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65 61  P_Collate ) brea
24630 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 30  k;.  }.  if( i<0
24640 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
24650 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66  ntinue;..  /* If
24660 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
24670 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73  oint, that means
24680 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74   the transformat
24690 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e  ion is required.
246a0 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
246b0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
246c0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
246d0 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  db;.  pNew = sql
246e0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
246f0 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
24700 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
24710 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
24720 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74  _Abort;.  memset
24730 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65  (&dummy, 0, size
24740 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e  of(dummy));.  pN
24750 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  ewSrc = sqlite3S
24760 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d  rcListAppendFrom
24770 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c  Term(pParse,0,0,
24780 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c  0,&dummy,pNew,0,
24790 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53 72  0);.  if( pNewSr
247a0 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  c==0 ) return WR
247b0 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77  C_Abort;.  *pNew
247c0 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63   = *p;.  p->pSrc
247d0 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d   = pNewSrc;.  p-
247e0 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
247f0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
24800 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74  pParse, 0, sqlit
24810 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 53  e3Expr(db, TK_AS
24820 54 45 52 49 53 4b 2c 20 30 29 29 3b 0a 20 20 70  TERISK, 0));.  p
24830 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
24840 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20  ;.  p->pWhere = 
24850 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  0;.  pNew->pGrou
24860 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  pBy = 0;.  pNew-
24870 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20  >pHaving = 0;.  
24880 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
24890 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20   0;.  p->pPrior 
248a0 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  = 0;.  p->pNext 
248b0 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74 68 20  = 0;.  p->pWith 
248c0 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  = 0;.  p->selFla
248d0 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75  gs &= ~SF_Compou
248e0 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  nd;.  assert( (p
248f0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
24900 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20 29 3b  Converted)==0 );
24910 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  .  p->selFlags |
24920 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 3b 0a  = SF_Converted;.
24930 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
24940 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70  pPrior!=0 );.  p
24950 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65  New->pPrior->pNe
24960 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65  xt = pNew;.  pNe
24970 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->pLimit = 0;. 
24980 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
24990 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  inue;.}../*.** C
249a0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
249b0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
249c0 65 72 6d 20 70 46 72 6f 6d 20 68 61 73 20 74 61  erm pFrom has ta
249d0 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74  ble-valued funct
249e0 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73  ion.** arguments
249f0 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20 6c  .  If it does, l
24a00 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
24a10 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 20  ssage in pParse 
24a20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  and return.** no
24a30 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63 65 20 70 46  n-zero, since pF
24a40 72 6f 6d 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  rom is not allow
24a50 65 64 20 74 6f 20 62 65 20 61 20 74 61 62 6c 65  ed to be a table
24a60 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e  -valued function
24a70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24a80 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e  cannotBeFunction
24a90 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
24aa0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
24ab0 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  tem *pFrom){.  i
24ac0 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 54  f( pFrom->fg.isT
24ad0 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 73 71  abFunc ){.    sq
24ae0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
24af0 61 72 73 65 2c 20 22 27 25 73 27 20 69 73 20 6e  arse, "'%s' is n
24b00 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e 22 2c 20  ot a function", 
24b10 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pFrom->zName);. 
24b20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
24b30 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
24b40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
24b50 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72  MIT_CTE./*.** Ar
24b60 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77 68  gument pWith (wh
24b70 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29  ich may be NULL)
24b80 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e   points to a lin
24b90 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73 74  ked list of nest
24ba0 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74  ed .** WITH cont
24bb0 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72  exts, from inner
24bc0 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49   to outermost. I
24bd0 66 20 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e  f the table iden
24be0 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46 52  tified by .** FR
24bf0 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
24c00 74 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c 6c  t pItem is reall
24c10 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65  y a common-table
24c20 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54 45  -expression (CTE
24c30 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  ) .** then retur
24c40 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
24c50 68 65 20 43 54 45 20 64 65 66 69 6e 69 74 69 6f  he CTE definitio
24c60 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65  n for that table
24c70 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 72  . Otherwise.** r
24c80 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
24c90 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  * If a non-NULL 
24ca0 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65  value is returne
24cb0 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65 78  d, set *ppContex
24cc0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
24cd0 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74  e With.** object
24ce0 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e   that the return
24cf0 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20 74  ed CTE belongs t
24d00 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  o..*/.static str
24d10 75 63 74 20 43 74 65 20 2a 73 65 61 72 63 68 57  uct Cte *searchW
24d20 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57 69  ith(.  With *pWi
24d30 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
24d40 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
24d50 74 20 69 6e 6e 65 72 6d 6f 73 74 20 57 49 54 48  t innermost WITH
24d60 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
24d70 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
24d80 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20   *pItem,     /* 
24d90 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
24da0 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a  ent to resolve *
24db0 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e  /.  With **ppCon
24dc0 74 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  text            
24dd0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48      /* OUT: WITH
24de0 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20 76   clause return v
24df0 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20  alue belongs to 
24e00 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
24e10 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28  ar *zName;.  if(
24e20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
24e30 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d  e==0 && (zName =
24e40 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d   pItem->zName)!=
24e50 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70  0 ){.    With *p
24e60 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69 74  ;.    for(p=pWit
24e70 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65  h; p; p=p->pOute
24e80 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  r){.      int i;
24e90 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
24ea0 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b  i<p->nCte; i++){
24eb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
24ec0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d  ite3StrICmp(zNam
24ed0 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  e, p->a[i].zName
24ee0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
24ef0 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20 70    *ppContext = p
24f00 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
24f10 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20  rn &p->a[i];.   
24f20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
24f30 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
24f40 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63  n 0;.}../* The c
24f50 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d 61  ode generator ma
24f60 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b 20  intains a stack 
24f70 6f 66 20 61 63 74 69 76 65 20 57 49 54 48 20 63  of active WITH c
24f80 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20 74  lauses.** with t
24f90 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49  he inner-most WI
24fa0 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67 20  TH clause being 
24fb0 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
24fc0 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  e stack..**.** T
24fd0 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73 68  his routine push
24fe0 65 73 20 74 68 65 20 57 49 54 48 20 63 6c 61 75  es the WITH clau
24ff0 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  se passed as the
25000 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
25010 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70  .** onto the top
25020 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 49   of the stack. I
25030 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65 65  f argument bFree
25040 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
25050 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75  his.** WITH clau
25060 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  se will never be
25070 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
25080 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73 20   stack. In this 
25090 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c  case it.** shoul
250a0 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67  d be freed along
250b0 20 77 69 74 68 20 74 68 65 20 50 61 72 73 65 20   with the Parse 
250c0 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65 72  object. In other
250d0 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20   cases, when.** 
250e0 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57 69  bFree==0, the Wi
250f0 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62  th object will b
25100 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69  e freed along wi
25110 74 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a 2a  th the SELECT .*
25120 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68  * statement with
25130 20 77 68 69 63 68 20 69 74 20 69 73 20 61 73 73   which it is ass
25140 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  ociated..*/.void
25150 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68   sqlite3WithPush
25160 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
25170 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38 20  With *pWith, u8 
25180 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72 74  bFree){.  assert
25190 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 28 70  ( bFree==0 || (p
251a0 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20  Parse->pWith==0 
251b0 26 26 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  && pParse->pWith
251c0 54 6f 46 72 65 65 3d 3d 30 29 20 29 3b 0a 20 20  ToFree==0) );.  
251d0 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20  if( pWith ){.   
251e0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
251f0 3e 70 57 69 74 68 21 3d 70 57 69 74 68 20 29 3b  >pWith!=pWith );
25200 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75 74  .    pWith->pOut
25210 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69  er = pParse->pWi
25220 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  th;.    pParse->
25230 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20  pWith = pWith;. 
25240 20 20 20 69 66 28 20 62 46 72 65 65 20 29 20 70     if( bFree ) p
25250 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72  Parse->pWithToFr
25260 65 65 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 0a  ee = pWith;.  }.
25270 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
25280 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66  nction checks if
25290 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d 20   argument pFrom 
252a0 72 65 66 65 72 73 20 74 6f 20 61 20 43 54 45 20  refers to a CTE 
252b0 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a 20  declared by .** 
252c0 61 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f 6e  a WITH clause on
252d0 20 74 68 65 20 73 74 61 63 6b 20 63 75 72 72 65   the stack curre
252e0 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64 20  ntly maintained 
252f0 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 20 41  by the parser. A
25300 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65 6e  nd,.** if curren
25310 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61  tly processing a
25320 20 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e 2c   CTE expression,
25330 20 69 66 20 69 74 20 69 73 20 61 20 72 65 63 75   if it is a recu
25340 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65 6e  rsive.** referen
25350 63 65 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ce to the curren
25360 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  t CTE..**.** If 
25370 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74 6f  pFrom falls into
25380 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 74   either of the t
25390 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61 62  wo categories ab
253a0 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ove, pFrom->pTab
253b0 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69  .** and other fi
253c0 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61 74  elds are populat
253d0 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  ed accordingly. 
253e0 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  The caller shoul
253f0 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72 6f  d check.** (pFro
25400 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20 64  m->pTab!=0) to d
25410 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
25420 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65 73   or not a succes
25430 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77 61  sful match.** wa
25440 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57  s found..**.** W
25450 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
25460 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20  match is found, 
25470 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
25480 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
25490 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66 20  r.** occurs. If 
254a0 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
254b0 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65  cur, an error me
254c0 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20  ssage is stored 
254d0 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65 72  in the.** parser
254e0 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72 20   and some error 
254f0 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e 20  code other than 
25500 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
25510 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
25520 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20 20  t withExpand(.  
25530 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
25540 20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69   .  struct SrcLi
25550 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a 29  st_item *pFrom.)
25560 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
25570 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
25580 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rse;.  sqlite3 *
25590 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
255a0 0a 20 20 73 74 72 75 63 74 20 43 74 65 20 2a 70  .  struct Cte *p
255b0 43 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cte;            
255c0 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43 54     /* Matched CT
255d0 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f  E (or NULL if no
255e0 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69 74   match) */.  Wit
255f0 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20 20  h *pWith;       
25600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25610 57 49 54 48 20 63 6c 61 75 73 65 20 74 68 61 74  WITH clause that
25620 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74 6f   pCte belongs to
25630 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
25640 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
25650 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72 63  ..  pCte = searc
25660 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70 57  hWith(pParse->pW
25670 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57 69  ith, pFrom, &pWi
25680 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65 20  th);.  if( pCte 
25690 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
256a0 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  ab;.    ExprList
256b0 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 65   *pEList;.    Se
256c0 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20  lect *pSel;.    
256d0 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20 20  Select *pLeft;  
256e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
256f0 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43   Left-most SELEC
25700 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
25710 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75 72     int bMayRecur
25720 73 69 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  sive;           
25730 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d 70   /* True if comp
25740 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20 55  ound joined by U
25750 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20  NION [ALL] */.  
25760 20 20 57 69 74 68 20 2a 70 53 61 76 65 64 57 69    With *pSavedWi
25770 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
25780 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65  /* Initial value
25790 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69 74   of pParse->pWit
257a0 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20  h */..    /* If 
257b0 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73  pCte->zCteErr is
257c0 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69   non-NULL at thi
257d0 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68  s point, then th
257e0 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c  is is an illegal
257f0 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76  .    ** recursiv
25800 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 43  e reference to C
25810 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20 61  TE pCte. Leave a
25820 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73  n error in pPars
25830 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  e and return.   
25840 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70 43   ** early. If pC
25850 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20 4e  te->zCteErr is N
25860 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69  ULL, then this i
25870 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76  s not a recursiv
25880 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20 20  e reference..   
25890 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
258a0 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20  , proceed.  */. 
258b0 20 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 43 74     if( pCte->zCt
258c0 65 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71  eErr ){.      sq
258d0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
258e0 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43 74 65  arse, pCte->zCte
258f0 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  Err, pCte->zName
25900 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
25910 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
25920 20 20 7d 0a 20 20 20 20 69 66 28 20 63 61 6e 6e    }.    if( cann
25930 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61  otBeFunction(pPa
25940 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 20 72 65  rse, pFrom) ) re
25950 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
25960 52 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  R;..    assert( 
25970 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
25980 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61  ;.    pFrom->pTa
25990 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
259a0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
259b0 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
259c0 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  );.    if( pTab=
259d0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
259e0 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62 2d  Abort;.    pTab-
259f0 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20  >nTabRef = 1;.  
25a00 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
25a10 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
25a20 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  db, pCte->zName)
25a30 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  ;.    pTab->iPKe
25a40 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61 62  y = -1;.    pTab
25a50 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32  ->nRowLogEst = 2
25a60 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d  00; assert( 200=
25a70 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
25a80 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20 70  048576) );.    p
25a90 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
25aa0 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 20 7c 20   TF_Ephemeral | 
25ab0 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69  TF_NoVisibleRowi
25ac0 64 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53  d;.    pFrom->pS
25ad0 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
25ae0 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 43 74  electDup(db, pCt
25af0 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  e->pSelect, 0);.
25b00 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
25b10 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
25b20 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
25b30 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28  KPT;.    assert(
25b40 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
25b50 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
25b60 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65   if this is a re
25b70 63 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a  cursive CTE. */.
25b80 20 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d      pSel = pFrom
25b90 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 62  ->pSelect;.    b
25ba0 4d 61 79 52 65 63 75 72 73 69 76 65 20 3d 20 28  MayRecursive = (
25bb0 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c   pSel->op==TK_AL
25bc0 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54  L || pSel->op==T
25bd0 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69  K_UNION );.    i
25be0 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  f( bMayRecursive
25bf0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
25c00 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a  .      SrcList *
25c10 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSrc = pFrom->pS
25c20 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20  elect->pSrc;.   
25c30 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
25c40 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  rc->nSrc; i++){.
25c50 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53          struct S
25c60 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
25c70 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d  em = &pSrc->a[i]
25c80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
25c90 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d  tem->zDatabase==
25ca0 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  0 .         && p
25cb0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a  Item->zName!=0 .
25cc0 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73           && 0==s
25cd0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49  qlite3StrICmp(pI
25ce0 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65  tem->zName, pCte
25cf0 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 20  ->zName).       
25d00 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
25d10 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pItem->pTab = pT
25d20 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  ab;.          pI
25d30 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73  tem->fg.isRecurs
25d40 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ive = 1;.       
25d50 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66     pTab->nTabRef
25d60 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ++;.          pS
25d70 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  el->selFlags |= 
25d80 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20 20  SF_Recursive;.  
25d90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
25da0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e      }..    /* On
25db0 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76 65  ly one recursive
25dc0 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 70 65   reference is pe
25dd0 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20  rmitted. */ .   
25de0 20 69 66 28 20 70 54 61 62 2d 3e 6e 54 61 62 52   if( pTab->nTabR
25df0 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71  ef>2 ){.      sq
25e00 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20  lite3ErrorMsg(. 
25e10 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
25e20 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72   "multiple refer
25e30 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73 69  ences to recursi
25e40 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70  ve table: %s", p
25e50 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  Cte->zName.     
25e60 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
25e70 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
25e80 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
25e90 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d   pTab->nTabRef==
25ea0 31 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  1 || .          
25eb0 20 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61    ((pSel->selFla
25ec0 67 73 26 53 46 5f 52 65 63 75 72 73 69 76 65 29  gs&SF_Recursive)
25ed0 20 26 26 20 70 54 61 62 2d 3e 6e 54 61 62 52 65   && pTab->nTabRe
25ee0 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70 43  f==2 ));..    pC
25ef0 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 63  te->zCteErr = "c
25f00 69 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63  ircular referenc
25f10 65 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76  e: %s";.    pSav
25f20 65 64 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d  edWith = pParse-
25f30 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72  >pWith;.    pPar
25f40 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
25f50 68 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52  h;.    if( bMayR
25f60 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
25f70 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
25f80 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
25f90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
25fa0 50 72 69 6f 72 2d 3e 70 57 69 74 68 3d 3d 30 20  Prior->pWith==0 
25fb0 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  );.      pPrior-
25fc0 3e 70 57 69 74 68 20 3d 20 70 53 65 6c 2d 3e 70  >pWith = pSel->p
25fd0 57 69 74 68 3b 0a 20 20 20 20 20 20 73 71 6c 69  With;.      sqli
25fe0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
25ff0 61 6c 6b 65 72 2c 20 70 50 72 69 6f 72 29 3b 0a  alker, pPrior);.
26000 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57        pPrior->pW
26010 69 74 68 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ith = 0;.    }el
26020 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
26030 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
26040 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  ker, pSel);.    
26050 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  }.    pParse->pW
26060 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 0a 20 20  ith = pWith;..  
26070 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c    for(pLeft=pSel
26080 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b  ; pLeft->pPrior;
26090 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50   pLeft=pLeft->pP
260a0 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69 73  rior);.    pELis
260b0 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73  t = pLeft->pELis
260c0 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d  t;.    if( pCte-
260d0 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20  >pCols ){.      
260e0 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
260f0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74  List->nExpr!=pCt
26100 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20  e->pCols->nExpr 
26110 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
26120 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
26130 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73  e, "table %s has
26140 20 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25   %d values for %
26150 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20  d columns",.    
26160 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e          pCte->zN
26170 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ame, pEList->nEx
26180 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d  pr, pCte->pCols-
26190 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20 29  >nExpr.        )
261a0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
261b0 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64  ->pWith = pSaved
261c0 57 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72 65  With;.        re
261d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
261e0 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
261f0 20 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e   pEList = pCte->
26200 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20  pCols;.    }..  
26210 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73    sqlite3Columns
26220 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
26230 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 26 70 54  rse, pEList, &pT
26240 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
26250 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20  >aCol);.    if( 
26260 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b  bMayRecursive ){
26270 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d  .      if( pSel-
26280 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
26290 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
262a0 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
262b0 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72 65  r = "multiple re
262c0 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
262d0 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d  es: %s";.      }
262e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
262f0 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 72  te->zCteErr = "r
26300 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
26310 63 65 20 69 6e 20 61 20 73 75 62 71 75 65 72 79  ce in a subquery
26320 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20  : %s";.      }. 
26330 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
26340 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
26350 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pSel);.    }.   
26360 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d   pCte->zCteErr =
26370 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   0;.    pParse->
26380 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57 69  pWith = pSavedWi
26390 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  th;.  }..  retur
263a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
263b0 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
263c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
263d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45  *.** If the SELE
263e0 43 54 20 70 61 73 73 65 64 20 61 73 20 74 68 65  CT passed as the
263f0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
26400 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61 74   has an associat
26410 65 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75  ed WITH .** clau
26420 73 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d 20  se, pop it from 
26430 74 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65 64  the stack stored
26440 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
26450 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a  Parse object..**
26460 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
26470 6e 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  n is used as the
26480 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b   xSelectCallback
26490 32 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a  2() callback by.
264a0 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
264b0 45 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77 61  Expand() when wa
264c0 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20 74  lking a SELECT t
264d0 72 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74  ree to resolve t
264e0 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e  able.** names an
264f0 64 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61  d other FROM cla
26500 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a  use elements. .*
26510 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
26520 6c 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c 6b  lectPopWith(Walk
26530 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
26540 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
26550 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
26560 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 66  er->pParse;.  if
26570 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54  ( OK_IF_ALWAYS_T
26580 52 55 45 28 70 50 61 72 73 65 2d 3e 70 57 69 74  RUE(pParse->pWit
26590 68 29 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d  h) && p->pPrior=
265a0 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a  =0 ){.    With *
265b0 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67 68  pWith = findRigh
265c0 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 3b  tmost(p)->pWith;
265d0 0a 20 20 20 20 69 66 28 20 70 57 69 74 68 21 3d  .    if( pWith!=
265e0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
265f0 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  t( pParse->pWith
26600 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20 20  ==pWith );.     
26610 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
26620 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a   pWith->pOuter;.
26630 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
26640 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63 74  e.#define select
26650 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69 66  PopWith 0.#endif
26660 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
26670 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72  tine is a Walker
26680 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65   callback for "e
26690 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45  xpanding" a SELE
266a0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
266b0 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61   "Expanding" mea
266c0 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c  ns to do the fol
266d0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
266e0 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20   (1)  Make sure 
266f0 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
26700 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
26710 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a  signed to every.
26720 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65  **         eleme
26730 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  nt of the FROM c
26740 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lause..**.**    
26750 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  (2)  Fill in the
26760 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
26770 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68  Tab fields in th
26780 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a  e SrcList that .
26790 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e  **         defin
267a0 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  es FROM clause. 
267b0 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65   When views appe
267c0 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ar in the FROM c
267d0 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20  lause,.**       
267e0 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d    fill pTabList-
267f0 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74  >a[].pSelect wit
26800 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
26810 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
26820 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74  .**         that
26830 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
26840 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73  view.  A copy is
26850 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65   made of the vie
26860 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20  w's SELECT.**   
26870 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20        statement 
26880 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66  so that we can f
26890 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20  reely modify or 
268a0 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74  delete that stat
268b0 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
268c0 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e   without worryin
268d0 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20  g about messing 
268e0 75 70 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  up the persisten
268f0 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
26900 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74  .**         of t
26910 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20  he view..**.**  
26920 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73    (3)  Add terms
26930 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
26940 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64  ause to accommod
26950 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20  ate the NATURAL 
26960 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20  keyword.**      
26970 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20     on joins and 
26980 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
26990 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73   clause of joins
269a0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20  ..**.**    (4)  
269b0 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  Scan the list of
269c0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
269d0 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69  result set (pELi
269e0 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20  st) looking.**  
269f0 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61         for insta
26a00 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20  nces of the "*" 
26a10 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20  operator or the 
26a20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72  TABLE.* operator
26a30 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20  ..**         If 
26a40 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61  found, expand ea
26a50 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65  ch "*" to be eve
26a60 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65  ry column in eve
26a70 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  ry table.**     
26a80 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20      and TABLE.* 
26a90 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
26aa0 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a  mn in TABLE..**.
26ab0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
26ac0 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c  lectExpander(Wal
26ad0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
26ae0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
26af0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
26b00 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  ker->pParse;.  i
26b10 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72  nt i, j, k;.  Sr
26b20 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
26b30 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
26b40 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
26b50 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
26b60 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
26b70 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
26b80 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67   Expr *pE, *pRig
26b90 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31  ht, *pExpr;.  u1
26ba0 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e  6 selFlags = p->
26bb0 73 65 6c 46 6c 61 67 73 3b 0a 20 20 75 33 32 20  selFlags;.  u32 
26bc0 65 6c 69 73 74 46 6c 61 67 73 20 3d 20 30 3b 0a  elistFlags = 0;.
26bd0 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  .  p->selFlags |
26be0 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20  = SF_Expanded;. 
26bf0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
26c00 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65  ailed  ){.    re
26c10 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
26c20 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
26c30 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66  >pSrc!=0 );.  if
26c40 28 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46  ( (selFlags & SF
26c50 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b  _Expanded)!=0 ){
26c60 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
26c70 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61  Prune;.  }.  pTa
26c80 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
26c90 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
26ca0 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 4f 4b 5f  EList;.  if( OK_
26cb0 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
26cc0 2d 3e 70 57 69 74 68 29 20 29 7b 0a 20 20 20 20  ->pWith) ){.    
26cd0 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28  sqlite3WithPush(
26ce0 70 50 61 72 73 65 2c 20 70 2d 3e 70 57 69 74 68  pParse, p->pWith
26cf0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
26d00 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72  Make sure cursor
26d10 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
26d20 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  en assigned to a
26d30 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ll entries in.  
26d40 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
26d50 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  se of the SELECT
26d60 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
26d70 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
26d80 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
26d90 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29  Parse, pTabList)
26da0 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20  ;..  /* Look up 
26db0 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65  every table name
26dc0 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
26dd0 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65  ause of the sele
26de0 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20  ct.  If.  ** an 
26df0 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
26e00 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75  M clause is a su
26e10 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f  bquery instead o
26e20 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
26e30 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65  w,.  ** then cre
26e40 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ate a transient 
26e50 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
26e60 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20  to describe the 
26e70 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  subquery..  */. 
26e80 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
26e90 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
26ea0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
26eb0 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
26ec0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
26ed0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
26ee0 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ->fg.isRecursive
26ef0 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54  ==0 || pFrom->pT
26f00 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab!=0 );.    if(
26f10 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63   pFrom->fg.isRec
26f20 75 72 73 69 76 65 20 29 20 63 6f 6e 74 69 6e 75  ursive ) continu
26f30 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
26f40 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
26f50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26f60 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 69 66 28  OMIT_CTE.    if(
26f70 20 77 69 74 68 45 78 70 61 6e 64 28 70 57 61 6c   withExpand(pWal
26f80 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29 20 72 65  ker, pFrom) ) re
26f90 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
26fa0 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70      if( pFrom->p
26fb0 54 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65  Tab ) {} else.#e
26fc0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 72  ndif.    if( pFr
26fd0 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  om->zName==0 ){.
26fe0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
26ff0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
27000 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20     Select *pSel 
27010 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
27020 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  ;.      /* A sub
27030 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
27040 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
27050 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61  ELECT */.      a
27060 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29  ssert( pSel!=0 )
27070 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27080 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
27090 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
270a0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
270b0 61 6c 6b 65 72 2c 20 70 53 65 6c 29 20 29 20 72  alker, pSel) ) r
270c0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
270d0 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
270e0 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
270f0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
27100 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
27110 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ));.      if( pT
27120 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
27130 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
27140 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20  pTab->nTabRef = 
27150 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72  1;.      if( pFr
27160 6f 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20  om->zAlias ){.  
27170 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
27180 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
27190 44 75 70 28 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a  Dup(db, pFrom->z
271a0 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 65  Alias);.      }e
271b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61  lse{.        pTa
271c0 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
271d0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
271e0 75 62 71 75 65 72 79 5f 25 70 22 2c 20 28 76 6f  ubquery_%p", (vo
271f0 69 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20  id*)pTab);.     
27200 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
27210 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20  pSel->pPrior ){ 
27220 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
27230 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c  ior; }.      sql
27240 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
27250 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
27260 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54  pSel->pEList,&pT
27270 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e  ab->nCol,&pTab->
27280 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61  aCol);.      pTa
27290 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
272a0 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c       pTab->nRowL
272b0 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
272c0 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
272d0 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
272e0 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   );.      pTab->
272f0 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
27300 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66  phemeral;.#endif
27310 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27320 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79    /* An ordinary
27330 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
27340 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ame in the FROM 
27350 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
27360 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
27370 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
27380 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
27390 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
273a0 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72  teTableItem(pPar
273b0 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20  se, 0, pFrom);. 
273c0 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
273d0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
273e0 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ort;.      if( p
273f0 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78  Tab->nTabRef>=0x
27400 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  ffff ){.        
27410 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
27420 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
27430 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  y references to 
27440 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33  \"%s\": max 6553
27450 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  5",.           p
27460 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
27470 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
27480 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
27490 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
274a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
274b0 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20  ab->nTabRef++;. 
274c0 20 20 20 20 20 69 66 28 20 21 49 73 56 69 72 74       if( !IsVirt
274d0 75 61 6c 28 70 54 61 62 29 20 26 26 20 63 61 6e  ual(pTab) && can
274e0 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50  notBeFunction(pP
274f0 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a  arse, pFrom) ){.
27500 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
27510 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
27520 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  }.#if !defined(S
27530 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
27540 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51   || !defined (SQ
27550 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
27560 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66  LTABLE).      if
27570 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
27580 29 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  ) || pTab->pSele
27590 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 31  ct ){.        i1
275a0 36 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  6 nCol;.        
275b0 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47  if( sqlite3ViewG
275c0 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
275d0 61 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65  arse, pTab) ) re
275e0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
275f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27600 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pFrom->pSelect==
27610 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72  0 );.        pFr
27620 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
27630 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
27640 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  b, pTab->pSelect
27650 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
27660 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61  lite3SelectSetNa
27670 6d 65 28 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  me(pFrom->pSelec
27680 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  t, pTab->zName);
27690 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  .        nCol = 
276a0 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  pTab->nCol;.    
276b0 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
276c0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   -1;.        sql
276d0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
276e0 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70  Walker, pFrom->p
276f0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
27700 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43   pTab->nCol = nC
27710 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ol;.      }.#end
27720 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
27730 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65   Locate the inde
27740 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49  x named by the I
27750 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
27760 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20  , if any. */.   
27770 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65   if( sqlite3Inde
27780 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72  xedByLookup(pPar
27790 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20  se, pFrom) ){.  
277a0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
277b0 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  bort;.    }.  }.
277c0 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41  .  /* Process NA
277d0 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20  TURAL keywords, 
277e0 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  and ON and USING
277f0 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e   clauses of join
27800 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  s..  */.  if( db
27810 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
27820 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  | sqliteProcessJ
27830 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29  oin(pParse, p) )
27840 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
27850 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f  _Abort;.  }..  /
27860 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20  * For every "*" 
27870 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74  that occurs in t
27880 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
27890 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
278a0 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c   of.  ** all col
278b0 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
278c0 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65  es.  And for eve
278d0 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72  ry TABLE.* inser
278e0 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a  t the names.  **
278f0 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
27900 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70  in TABLE.  The p
27910 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61  arser inserted a
27920 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73   special express
27930 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68  ion.  ** with th
27940 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70  e TK_ASTERISK op
27950 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20  erator for each 
27960 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e  "*" that it foun
27970 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a  d in the column.
27980 20 20 2a 2a 20 6c 69 73 74 2e 20 20 54 68 65 20    ** list.  The 
27990 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a  following code j
279a0 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74  ust has to locat
279b0 65 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53  e the TK_ASTERIS
279c0 4b 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  K.  ** expressio
279d0 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 20 65 61  ns and expand ea
279e0 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69  ch one to the li
279f0 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  st of all column
27a00 73 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61  s in.  ** all ta
27a10 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
27a20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a  The first loop j
27a30 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ust checks to se
27a40 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
27a50 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73  ny "*" operators
27a60 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20  .  ** that need 
27a70 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a  expanding..  */.
27a80 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
27a90 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
27aa0 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73  {.    pE = pELis
27ab0 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20  t->a[k].pExpr;. 
27ac0 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
27ad0 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72 65  K_ASTERISK ) bre
27ae0 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ak;.    assert( 
27af0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
27b00 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20  | pE->pRight!=0 
27b10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
27b20 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
27b30 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26   (pE->pLeft!=0 &
27b40 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
27b50 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69  =TK_ID) );.    i
27b60 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
27b70 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  T && pE->pRight-
27b80 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op==TK_ASTERISK
27b90 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 65 6c   ) break;.    el
27ba0 69 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e  istFlags |= pE->
27bb0 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28  flags;.  }.  if(
27bc0 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
27bd0 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
27be0 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65  * If we get here
27bf0 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65   it means the re
27c00 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e  sult set contain
27c10 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a  s one or more "*
27c20 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f  ".    ** operato
27c30 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  rs that need to 
27c40 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f  be expanded.  Lo
27c50 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
27c60 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
27c70 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
27c80 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74  set and expand t
27c90 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  hem one by one..
27ca0 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63      */.    struc
27cb0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
27cc0 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  *a = pEList->a;.
27cd0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e      ExprList *pN
27ce0 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ew = 0;.    int 
27cf0 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e  flags = pParse->
27d00 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69  db->flags;.    i
27d10 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28  nt longNames = (
27d20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
27d30 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a  ullColNames)!=0.
27d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d50 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20        && (flags 
27d60 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
27d70 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20  lNames)==0;..   
27d80 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
27d90 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
27da0 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d  .      pE = a[k]
27db0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6c  .pExpr;.      el
27dc0 69 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e  istFlags |= pE->
27dd0 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 70 52 69  flags;.      pRi
27de0 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74  ght = pE->pRight
27df0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27e00 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
27e10 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  | pRight!=0 );. 
27e20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21       if( pE->op!
27e30 3d 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 20  =TK_ASTERISK.   
27e40 20 20 20 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d      && (pE->op!=
27e50 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74  TK_DOT || pRight
27e60 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53  ->op!=TK_ASTERIS
27e70 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  K).      ){.    
27e80 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
27e90 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
27ea0 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
27eb0 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
27ec0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
27ed0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
27ee0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
27ef0 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b  pParse, pNew, a[
27f00 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  k].pExpr);.     
27f10 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
27f20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
27f30 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
27f40 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61  zName = a[k].zNa
27f50 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  me;.          pN
27f60 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
27f70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b  r-1].zSpan = a[k
27f80 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20  ].zSpan;.       
27f90 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20     a[k].zName = 
27fa0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b  0;.          a[k
27fb0 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20  ].zSpan = 0;.   
27fc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
27fd0 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20  [k].pExpr = 0;. 
27fe0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27ff0 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72      /* This expr
28000 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20  ession is a "*" 
28010 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61  or a "TABLE.*" a
28020 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  nd needs to be. 
28030 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64         ** expand
28040 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ed. */.        i
28050 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30  nt tableSeen = 0
28060 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f  ;      /* Set to
28070 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61   1 when TABLE ma
28080 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  tches */.       
28090 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20   char *zTName = 
280a0 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74  0;       /* text
280b0 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c   of name of TABL
280c0 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  E */.        if(
280d0 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
280e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
280f0 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d  ert( pE->pLeft!=
28100 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
28110 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
28120 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66  roperty(pE->pLef
28130 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  t, EP_IntValue) 
28140 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  );.          zTN
28150 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d  ame = pE->pLeft-
28160 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
28170 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
28180 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
28190 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
281a0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
281b0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
281c0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
281d0 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
281e0 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20           Select 
281f0 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSub = pFrom->p
28200 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
28210 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
28220 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73   = pFrom->zAlias
28230 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  ;.          cons
28240 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e  t char *zSchemaN
28250 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
28260 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
28270 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
28280 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
28290 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
282a0 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
282b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
282c0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
282d0 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b  cFailed ) break;
282e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
282f0 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d  Sub==0 || (pSub-
28300 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e  >selFlags & SF_N
28310 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b  estedFrom)==0 ){
28320 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75  .            pSu
28330 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  b = 0;.         
28340 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
28350 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
28360 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  zTName, zTabName
28370 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
28380 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
28390 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
283a0 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20            iDb = 
283b0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
283c0 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
283d0 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
283e0 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65       zSchemaName
283f0 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e   = iDb>=0 ? db->
28400 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
28410 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20  e : "*";.       
28420 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
28430 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
28440 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
28450 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
28460 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ame = pTab->aCol
28470 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
28480 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f         char *zCo
28490 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63  lname;  /* The c
284a0 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e  omputed column n
284b0 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ame */.         
284c0 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65     char *zToFree
284d0 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20  ;   /* Malloced 
284e0 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64  string that need
284f0 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
28500 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b  .            Tok
28510 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  en sColname;  /*
28520 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   Computed column
28530 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e   name as a token
28540 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20   */..           
28550 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29   assert( zName )
28560 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
28570 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62  ( zTName && pSub
28580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
28590 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61   sqlite3MatchSpa
285a0 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69  nName(pSub->pELi
285b0 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20  st->a[j].zSpan, 
285c0 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30  0, zTName, 0)==0
285d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
285e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
285f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
28600 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
28610 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d     /* If a colum
28620 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27  n is marked as '
28630 68 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74  hidden', omit it
28640 20 66 72 6f 6d 20 74 68 65 20 65 78 70 61 6e 64   from the expand
28650 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ed.            *
28660 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73  * result-set lis
28670 74 20 75 6e 6c 65 73 73 20 74 68 65 20 53 45 4c  t unless the SEL
28680 45 43 54 20 68 61 73 20 74 68 65 20 53 46 5f 49  ECT has the SF_I
28690 6e 63 6c 75 64 65 48 69 64 64 65 6e 0a 20 20 20  ncludeHidden.   
286a0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 69 74 20           ** bit 
286b0 73 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  set..           
286c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
286d0 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
286e0 20 26 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64   & SF_IncludeHid
286f0 64 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  den)==0.        
28700 20 20 20 20 20 26 26 20 49 73 48 69 64 64 65 6e       && IsHidden
28710 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43  Column(&pTab->aC
28720 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20 20  ol[j]) .        
28730 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
28740 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
28750 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
28760 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65           tableSe
28770 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20  en = 1;..       
28780 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20       if( i>0 && 
28790 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  zTName==0 ){.   
287a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
287b0 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pFrom->fg.jointy
287c0 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29  pe & JT_NATURAL)
287d0 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
287e0 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43      && tableAndC
287f0 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c  olumnIndex(pTabL
28800 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30  ist, i, zName, 0
28810 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  , 0).           
28820 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
28830 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41        /* In a NA
28840 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74  TURAL join, omit
28850 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e   the join column
28860 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
28870 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
28880 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68  able to the righ
28890 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  t of the join */
288a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
288b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
288c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
288d0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
288e0 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28  ite3IdListIndex(
288f0 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a  pFrom->pUsing, z
28900 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
28910 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
28920 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20  n a join with a 
28930 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d  USING clause, om
28940 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  it columns in th
28950 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
28960 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73    ** using claus
28970 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  e from the table
28980 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a   on the right. *
28990 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
289a0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
289b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
289c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
289d0 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73        pRight = s
289e0 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
289f0 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  K_ID, zName);.  
28a00 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61            zColna
28a10 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
28a20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20          zToFree 
28a30 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
28a40 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c   if( longNames |
28a50 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  | pTabList->nSrc
28a60 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
28a70 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b      Expr *pLeft;
28a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
28a90 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
28aa0 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54  pr(db, TK_ID, zT
28ab0 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  abName);.       
28ac0 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
28ad0 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
28ae0 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
28af0 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  t, pRight);.    
28b00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53            if( zS
28b10 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20  chemaName ){.   
28b20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
28b30 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
28b40 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68  (db, TK_ID, zSch
28b50 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  emaName);.      
28b60 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
28b70 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
28b80 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
28b90 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 20 20  Left, pExpr);.  
28ba0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
28bc0 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20  longNames ){.   
28bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
28be0 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  lname = sqlite3M
28bf0 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
28c00 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e  s", zTabName, zN
28c10 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
28c20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
28c30 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20  zColname;.      
28c40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28c50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28c60 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
28c70 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
28c80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28c90 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
28ca0 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
28cb0 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
28cc0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
28cd0 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
28ce0 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20  Init(&sColname, 
28cf0 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  zColname);.     
28d00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
28d10 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50  prListSetName(pP
28d20 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f  arse, pNew, &sCo
28d30 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  lname, 0);.     
28d40 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
28d50 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  && (p->selFlags 
28d60 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29  & SF_NestedFrom)
28d70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
28d80 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
28d90 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20  List_item *pX = 
28da0 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e  &pNew->a[pNew->n
28db0 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20  Expr-1];.       
28dc0 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20         if( pSub 
28dd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
28de0 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73     pX->zSpan = s
28df0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
28e00 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  b, pSub->pEList-
28e10 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20  >a[j].zSpan);.  
28e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
28e30 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61  stcase( pX->zSpa
28e40 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
28e50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28e60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
28e70 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
28e80 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
28e90 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20  %s.%s",.        
28ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ec0 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20     zSchemaName, 
28ed0 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61  zTabName, zColna
28ee0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
28ef0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
28f00 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20  X->zSpan==0 );. 
28f10 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
28f20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
28f30 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b  >bSpanIsTab = 1;
28f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
28f50 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
28f60 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f  e3DbFree(db, zTo
28f70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Free);.         
28f80 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
28f90 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53       if( !tableS
28fa0 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  een ){.         
28fb0 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20   if( zTName ){. 
28fc0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
28fd0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
28fe0 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
28ff0 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b  e: %s", zTName);
29000 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
29010 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
29020 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
29030 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73  arse, "no tables
29040 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20   specified");.  
29050 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29060 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
29070 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
29080 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
29090 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
290a0 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  pEList = pNew;. 
290b0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69   }.  if( p->pELi
290c0 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  st ){.    if( p-
290d0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64  >pEList->nExpr>d
290e0 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
290f0 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29  _LIMIT_COLUMN] )
29100 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
29110 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
29120 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
29130 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22  s in result set"
29140 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
29150 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
29160 0a 20 20 20 20 69 66 28 20 28 65 6c 69 73 74 46  .    if( (elistF
29170 6c 61 67 73 20 26 20 28 45 50 5f 48 61 73 46 75  lags & (EP_HasFu
29180 6e 63 7c 45 50 5f 53 75 62 71 75 65 72 79 29 29  nc|EP_Subquery))
29190 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  !=0 ){.      p->
291a0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43  selFlags |= SF_C
291b0 6f 6d 70 6c 65 78 52 65 73 75 6c 74 3b 0a 20 20  omplexResult;.  
291c0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
291d0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
291e0 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f  ../*.** No-op ro
291f0 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61  utine for the pa
29200 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e  rse-tree walker.
29210 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
29220 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
29230 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
29240 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73  back then expres
29250 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72  sion trees.** ar
29260 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74  e walked without
29270 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69   any actions bei
29280 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68  ng taken at each
29290 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62   node.  Presumab
292a0 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  ly,.** when this
292b0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
292c0 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70   for Walker.xExp
292d0 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a  rCallback then .
292e0 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63  ** Walker.xSelec
292f0 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74  tCallback is set
29300 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   to do something
29310 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72   useful for ever
29320 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69  y .** subquery i
29330 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65  n the parser tre
29340 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
29350 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61  3ExprWalkNoop(Wa
29360 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45  lker *NotUsed, E
29370 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a  xpr *NotUsed2){.
29380 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
29390 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
293a0 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
293b0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
293c0 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f  ../*.** No-op ro
293d0 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61  utine for the pa
293e0 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 20  rse-tree walker 
293f0 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
29400 6d 65 6e 74 73 2e 0a 2a 2a 20 73 75 62 71 75 65  ments..** subque
29410 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  ry in the parser
29420 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   tree..*/.int sq
29430 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e  lite3SelectWalkN
29440 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55  oop(Walker *NotU
29450 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  sed, Select *Not
29460 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
29470 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
29480 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
29490 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
294a0 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 20 53 51  tinue;.}..#if SQ
294b0 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
294c0 20 41 6c 77 61 79 73 20 61 73 73 65 72 74 2e 20   Always assert. 
294d0 20 54 68 69 73 20 78 53 65 6c 65 63 74 43 61 6c   This xSelectCal
294e0 6c 62 61 63 6b 32 20 69 6d 70 6c 65 6d 65 6e 74  lback2 implement
294f0 61 74 69 6f 6e 20 70 72 6f 76 65 73 20 74 68 61  ation proves tha
29500 74 20 74 68 65 0a 2a 2a 20 78 53 65 6c 65 63 74  t the.** xSelect
29510 43 61 6c 6c 62 61 63 6b 32 20 69 73 20 6e 65 76  Callback2 is nev
29520 65 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 76  er invoked..*/.v
29530 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
29540 74 57 61 6c 6b 41 73 73 65 72 74 32 28 57 61 6c  tWalkAssert2(Wal
29550 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65  ker *NotUsed, Se
29560 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b  lect *NotUsed2){
29570 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
29580 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
29590 74 55 73 65 64 32 29 3b 0a 20 20 61 73 73 65 72  tUsed2);.  asser
295a0 74 28 20 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66  t( 0 );.}.#endif
295b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
295c0 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61 20  ine "expands" a 
295d0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
295e0 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
295f0 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46  subqueries..** F
29600 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
29610 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61  formation on wha
29620 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65  t it means to "e
29630 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a  xpand" a SELECT.
29640 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65  ** statement, se
29650 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
29660 20 74 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e   the selectExpan
29670 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63  d worker callbac
29680 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45  k above..**.** E
29690 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43  xpanding a SELEC
296a0 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74  T statement is t
296b0 68 65 20 66 69 72 73 74 20 73 74 65 70 20 69 6e  he first step in
296c0 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a   processing a.**
296d0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
296e0 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73  t.  The SELECT s
296f0 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65  tatement must be
29700 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65   expanded before
29710 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  .** name resolut
29720 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ion is performed
29730 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68  ..**.** If anyth
29740 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
29750 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
29760 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
29770 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20   pParse..** The 
29780 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
29790 20 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20   can detect the 
297a0 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69  problem by looki
297b0 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45  ng at pParse->nE
297c0 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61  rr.** and/or pPa
297d0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
297e0 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ailed..*/.static
297f0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c   void sqlite3Sel
29800 65 63 74 45 78 70 61 6e 64 28 50 61 72 73 65 20  ectExpand(Parse 
29810 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
29820 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c  *pSelect){.  Wal
29830 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72  ker w;.  w.xExpr
29840 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
29850 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  e3ExprWalkNoop;.
29860 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
29870 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46  rse;.  if( OK_IF
29880 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70 50 61  _ALWAYS_TRUE(pPa
29890 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64  rse->hasCompound
298a0 29 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65  ) ){.    w.xSele
298b0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e  ctCallback = con
298c0 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65  vertCompoundSele
298d0 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20  ctToSubquery;.  
298e0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
298f0 61 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 73 71  ack2 = 0;.    sq
29900 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
29910 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  &w, pSelect);.  
29920 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  }.  w.xSelectCal
29930 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78  lback = selectEx
29940 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c  pander;.  w.xSel
29950 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73  ectCallback2 = s
29960 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a 20 20  electPopWith;.  
29970 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
29980 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
29990 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
299a0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
299b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
299c0 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43   Walker.xSelectC
299d0 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b  allback callback
299e0 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
299f0 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29  SelectTypeInfo()
29a00 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  .** interface..*
29a10 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52  *.** For each FR
29a20 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
29a30 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a  ry, add Column.z
29a40 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e  Type and Column.
29a50 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  zColl.** informa
29a60 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c  tion to the Tabl
29a70 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
29a80 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
29a90 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66  result set.** of
29aa0 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a   that subquery..
29ab0 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  **.** The Table 
29ac0 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
29ad0 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
29ae0 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e  sult set was con
29af0 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73  structed.** by s
29b00 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20  electExpander() 
29b10 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  but the type and
29b20 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
29b30 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74  mation was omitt
29b40 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f  ed.** at that po
29b50 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e  int because iden
29b60 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20  tifiers had not 
29b70 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  yet been resolve
29b80 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  d.  This.** rout
29b90 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
29ba0 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72  ter identifier r
29bb0 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  esolution..*/.st
29bc0 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
29bd0 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
29be0 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  nfo(Walker *pWal
29bf0 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
29c00 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
29c10 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63  ;.  int i;.  Src
29c20 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
29c30 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
29c40 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20  _item *pFrom;.. 
29c50 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46   assert( p->selF
29c60 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
29c70 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ed );.  assert( 
29c80 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
29c90 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d  F_HasTypeInfo)==
29ca0 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  0 );.  p->selFla
29cb0 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65  gs |= SF_HasType
29cc0 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d  Info;.  pParse =
29cd0 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
29ce0 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
29cf0 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->pSrc;.  for(i=
29d00 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
29d10 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
29d20 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
29d30 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  om++){.    Table
29d40 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
29d50 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
29d60 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
29d70 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46   if( (pTab->tabF
29d80 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
29d90 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ral)!=0 ){.     
29da0 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
29db0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
29dc0 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
29dd0 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
29de0 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
29df0 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28  elect;.      if(
29e00 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20   pSel ){.       
29e10 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50   while( pSel->pP
29e20 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53  rior ) pSel = pS
29e30 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  el->pPrior;.    
29e40 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
29e50 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
29e60 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73  dCollation(pPars
29e70 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a  e, pTab, pSel);.
29e80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
29e90 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
29ea0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
29eb0 61 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e  adds datatype an
29ec0 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
29ed0 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ence information
29ee0 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65   to.** the Table
29ef0 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61   structures of a
29f00 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
29f10 75 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a  ubqueries in a.*
29f20 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
29f30 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  nt..**.** Use th
29f40 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72  is routine after
29f50 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
29f60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
29f70 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
29f80 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20  dTypeInfo(Parse 
29f90 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
29fa0 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64  *pSelect){.#ifnd
29fb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
29fc0 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72  UBQUERY.  Walker
29fd0 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43   w;.  w.xSelectC
29fe0 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
29ff0 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b  3SelectWalkNoop;
2a000 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2a010 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64  back2 = selectAd
2a020 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66  dSubqueryTypeInf
2a030 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  o;.  w.xExprCall
2a040 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  back = sqlite3Ex
2a050 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
2a060 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
2a070 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
2a080 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
2a090 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  );.#endif.}.../*
2a0a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2a0b0 20 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43   sets up a SELEC
2a0c0 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  T statement for 
2a0d0 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65  processing.  The
2a0e0 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  .** following is
2a0f0 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a   accomplished:.*
2a100 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45  *.**     *  VDBE
2a110 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   Cursor numbers 
2a120 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20  are assigned to 
2a130 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
2a140 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  terms..**     * 
2a150 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65   Ephemeral Table
2a160 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65   objects are cre
2a170 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f  ated for all FRO
2a180 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
2a190 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f  ies..**     *  O
2a1a0 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
2a1b0 73 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20  ses are shifted 
2a1c0 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65  into WHERE state
2a1d0 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20  ments.**     *  
2a1e0 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e  Wildcards "*" an
2a1f0 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72  d "TABLE.*" in r
2a200 65 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65  esult sets are e
2a210 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20  xpanded..**     
2a220 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69  *  Identifiers i
2a230 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65  n expression are
2a240 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c   matched to tabl
2a250 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
2a260 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75  outine acts recu
2a270 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73  rsively on all s
2a280 75 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e  ubqueries within
2a290 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
2a2a0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
2a2b0 63 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20  ctPrep(.  Parse 
2a2c0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2a2d0 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
2a2e0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
2a2f0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
2a300 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
2a310 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
2a320 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d   coded. */.  Nam
2a330 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72  eContext *pOuter
2a340 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74  NC  /* Name cont
2a350 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65  ext for containe
2a360 72 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  r */.){.  assert
2a370 28 20 70 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  ( p!=0 || pParse
2a380 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2a390 65 64 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ed );.  if( pPar
2a3a0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
2a3b0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
2a3c0 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
2a3d0 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66   & SF_HasTypeInf
2a3e0 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  o ) return;.  sq
2a3f0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
2a400 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  d(pParse, p);.  
2a410 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
2a420 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
2a430 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
2a440 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
2a450 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d  ResolveSelectNam
2a460 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f  es(pParse, p, pO
2a470 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70  uterNC);.  if( p
2a480 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70  Parse->nErr || p
2a490 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
2a4a0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
2a4b0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
2a4c0 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61  tAddTypeInfo(pPa
2a4d0 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rse, p);.}../*.*
2a4e0 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72  * Reset the aggr
2a4f0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
2a500 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67  r..**.** The agg
2a510 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
2a520 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d  or is a set of m
2a530 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74  emory cells that
2a540 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65   hold.** interme
2a550 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68  diate results wh
2a560 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20  ile calculating 
2a570 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54  an aggregate.  T
2a580 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  his.** routine g
2a590 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68  enerates code th
2a5a0 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20  at stores NULLs 
2a5b0 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20  in all of those 
2a5c0 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e  memory.** cells.
2a5d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2a5e0 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
2a5f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2a600 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
2a610 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
2a620 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
2a630 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
2a640 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
2a650 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67  Func;.  int nReg
2a660 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   = pAggInfo->nFu
2a670 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  nc + pAggInfo->n
2a680 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52  Column;.  if( nR
2a690 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  eg==0 ) return;.
2a6a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2a6b0 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  BUG.  /* Verify 
2a6c0 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f  that all AggInfo
2a6d0 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20 77   registers are w
2a6e0 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20  ithin the range 
2a6f0 73 70 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a  specified by.  *
2a700 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e  * AggInfo.mnReg.
2a710 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a  .AggInfo.mxReg *
2a720 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 67  /.  assert( nReg
2a730 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  ==pAggInfo->mxRe
2a740 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  g-pAggInfo->mnRe
2a750 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  g+1 );.  for(i=0
2a760 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; i<pAggInfo->nC
2a770 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
2a780 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66   assert( pAggInf
2a790 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e  o->aCol[i].iMem>
2a7a0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  =pAggInfo->mnReg
2a7b0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67  .         && pAg
2a7c0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
2a7d0 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem<=pAggInfo->m
2a7e0 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f  xReg );.  }.  fo
2a7f0 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
2a800 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a  o->nFunc; i++){.
2a810 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
2a820 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69  Info->aFunc[i].i
2a830 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem>=pAggInfo->m
2a840 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26  nReg.         &&
2a850 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
2a860 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e  [i].iMem<=pAggIn
2a870 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d  fo->mxReg );.  }
2a880 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
2a890 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2a8a0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49  P_Null, 0, pAggI
2a8b0 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67  nfo->mnReg, pAgg
2a8c0 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20  Info->mxReg);.  
2a8d0 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e  for(pFunc=pAggIn
2a8e0 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20  fo->aFunc, i=0; 
2a8f0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
2a900 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29  c; i++, pFunc++)
2a910 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d  {.    if( pFunc-
2a920 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
2a930 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
2a940 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a  = pFunc->pExpr;.
2a950 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2a960 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2a970 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  E, EP_xIsSelect)
2a980 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
2a990 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
2a9a0 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pE->x.pList->nEx
2a9b0 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  pr!=1 ){.       
2a9c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2a9d0 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e  (pParse, "DISTIN
2a9e0 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75  CT aggregates mu
2a9f0 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20  st have exactly 
2aa00 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  one ".          
2aa10 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20   "argument");.  
2aa20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69        pFunc->iDi
2aa30 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
2aa40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2aa50 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
2aa60 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
2aa70 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
2aa80 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30  , pE->x.pList, 0
2aa90 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
2aaa0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2aab0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
2aac0 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73  ral, pFunc->iDis
2aad0 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  tinct, 0, 0,.   
2aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aaf0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
2ab00 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
2ab10 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FO);.      }.   
2ab20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
2ab30 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67  Invoke the OP_Ag
2ab40 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65  gFinalize opcode
2ab50 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65   for every aggre
2ab60 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  gate function.**
2ab70 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20   in the AggInfo 
2ab80 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
2ab90 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69  atic void finali
2aba0 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50  zeAggFunctions(P
2abb0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
2abc0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
2abd0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
2abe0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
2abf0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
2ac00 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
2ac10 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
2ac20 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
2ac30 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
2ac40 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
2ac50 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
2ac60 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
2ac70 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
2ac80 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2ac90 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
2aca0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
2acb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2acc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67  eAddOp2(v, OP_Ag
2acd0 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d  gFinal, pF->iMem
2ace0 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  , pList ? pList-
2acf0 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20  >nExpr : 0);.   
2ad00 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
2ad10 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e  ndP4(v, pF->pFun
2ad20 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
2ad30 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64    }.}../*.** Upd
2ad40 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ate the accumula
2ad50 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  tor memory cells
2ad60 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74   for an aggregat
2ad70 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68  e based on.** th
2ad80 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
2ad90 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   position..*/.st
2ada0 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65  atic void update
2adb0 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
2adc0 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
2add0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
2ade0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
2adf0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
2ae00 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20  i;.  int regHit 
2ae10 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48  = 0;.  int addrH
2ae20 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74  itTest = 0;.  st
2ae30 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
2ae40 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20  c *pF;.  struct 
2ae50 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b  AggInfo_col *pC;
2ae60 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  ..  pAggInfo->di
2ae70 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
2ae80 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
2ae90 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
2aea0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
2aeb0 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
2aec0 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e  int nArg;.    in
2aed0 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a  t addrNext = 0;.
2aee0 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a      int regAgg;.
2aef0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
2af00 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
2af10 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
2af20 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2af30 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
2af40 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2af50 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
2af60 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d   ){.      nArg =
2af70 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
2af80 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71       regAgg = sq
2af90 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
2afa0 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b  e(pParse, nArg);
2afb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2afc0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
2afd0 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65  Parse, pList, re
2afe0 67 41 67 67 2c 20 30 2c 20 53 51 4c 49 54 45 5f  gAgg, 0, SQLITE_
2aff0 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d  ECEL_DUP);.    }
2b000 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67  else{.      nArg
2b010 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41   = 0;.      regA
2b020 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  gg = 0;.    }.  
2b030 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69    if( pF->iDisti
2b040 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
2b050 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
2b060 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2b070 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  v);.      testca
2b080 73 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20  se( nArg==0 );  
2b090 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74 69  /* Error conditi
2b0a0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  on */.      test
2b0b0 63 61 73 65 28 20 6e 41 72 67 3e 31 20 29 3b 20  case( nArg>1 ); 
2b0c0 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72    /* Also an err
2b0d0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65  or */.      code
2b0e0 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
2b0f0 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20   pF->iDistinct, 
2b100 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67  addrNext, 1, reg
2b110 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Agg);.    }.    
2b120 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66  if( pF->pFunc->f
2b130 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
2b140 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
2b150 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
2b160 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20   *pColl = 0;.   
2b170 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
2b180 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
2b190 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
2b1a0 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
2b1b0 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74  !=0 );  /* pList
2b1c0 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63  !=0 if pF->pFunc
2b1d0 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f   has NEEDCOLL */
2b1e0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
2b1f0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
2b200 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67  !pColl && j<nArg
2b210 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
2b220 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
2b230 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2b240 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
2b250 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
2b260 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43   }.      if( !pC
2b270 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  oll ){.        p
2b280 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
2b290 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
2b2a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2b2b0 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67  regHit==0 && pAg
2b2c0 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
2b2d0 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b  tor ) regHit = +
2b2e0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2b2f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2b300 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
2b310 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c  lSeq, regHit, 0,
2b320 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
2b330 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
2b340 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2b350 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2b360 50 5f 41 67 67 53 74 65 70 30 2c 20 30 2c 20 72  P_AggStep0, 0, r
2b370 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 29  egAgg, pF->iMem)
2b380 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2b390 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d  eAppendP4(v, pF-
2b3a0 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
2b3b0 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EF);.    sqlite3
2b3c0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
2b3d0 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73  (u8)nArg);.    s
2b3e0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
2b3f0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
2b400 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
2b410 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
2b420 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
2b430 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
2b440 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20   nArg);.    if( 
2b450 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20  addrNext ){.    
2b460 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2b470 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
2b480 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71  rNext);.      sq
2b490 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2b4a0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
2b4b0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66   }.  }..  /* Bef
2b4c0 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74  ore populating t
2b4d0 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  he accumulator r
2b4e0 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20  egisters, clear 
2b4f0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
2b500 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  ..  ** Otherwise
2b510 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  , if any of the 
2b520 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20  required column 
2b530 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61  values are alrea
2b540 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a  dy present .  **
2b550 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73   in registers, s
2b560 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
2b570 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70   may use OP_SCop
2b580 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61  y to copy the va
2b590 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e  lue.  ** to pC->
2b5a0 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65  iMem. But by the
2b5b0 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20   time the value 
2b5c0 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69  is used, the ori
2b5d0 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20  ginal register. 
2b5e0 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65   ** may have bee
2b5f0 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61  n used, invalida
2b600 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79  ting the underly
2b610 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69  ing buffer holdi
2b620 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74  ng the.  ** text
2b630 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20   or blob value. 
2b640 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30  See ticket [8830
2b650 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20  34dcb5]..  **.  
2b660 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74  ** Another solut
2b670 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ion would be to 
2b680 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43  change the OP_SC
2b690 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79  opy used to copy
2b6a0 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c   cached.  ** val
2b6b0 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70  ues to an OP_Cop
2b6c0 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  y..  */.  if( re
2b6d0 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72  gHit ){.    addr
2b6e0 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65  HitTest = sqlite
2b6f0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2b700 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56  P_If, regHit); V
2b710 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2b720 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
2b730 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2b740 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  se);.  for(i=0, 
2b750 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  pC=pAggInfo->aCo
2b760 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  l; i<pAggInfo->n
2b770 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b  Accumulator; i++
2b780 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  , pC++){.    sql
2b790 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
2b7a0 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20  rse, pC->pExpr, 
2b7b0 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20  pC->iMem);.  }. 
2b7c0 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
2b7d0 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c  tMode = 0;.  sql
2b7e0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2b7f0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  ar(pParse);.  if
2b800 28 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b  ( addrHitTest ){
2b810 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2b820 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
2b830 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a  HitTest);.  }.}.
2b840 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e  ./*.** Add a sin
2b850 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69  gle OP_Explain i
2b860 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
2b870 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69  e VDBE to explai
2b880 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f  n a simple.** co
2b890 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53  unt(*) query ("S
2b8a0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2b8b0 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23  ROM pTab")..*/.#
2b8c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2b8d0 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69  IT_EXPLAIN.stati
2b8e0 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69  c void explainSi
2b8f0 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72  mpleCount(.  Par
2b900 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2b910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b920 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
2b930 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
2b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b950 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e     /* Table bein
2b960 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49  g queried */.  I
2b970 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
2b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b990 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20  * Index used to 
2b9a0 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f  optimize scan, o
2b9b0 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  r NULL */.){.  i
2b9c0 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
2b9d0 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74  in==2 ){.    int
2b9e0 20 62 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21   bCover = (pIdx!
2b9f0 3d 30 20 26 26 20 28 48 61 73 52 6f 77 69 64 28  =0 && (HasRowid(
2ba00 70 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d  pTab) || !IsPrim
2ba10 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
2ba20 29 29 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  )));.    char *z
2ba30 45 71 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Eqp = sqlite3MPr
2ba40 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
2ba50 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25   "SCAN TABLE %s%
2ba60 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54  s%s",.        pT
2ba70 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
2ba80 20 20 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53     bCover ? " US
2ba90 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44  ING COVERING IND
2baa0 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20  EX " : "",.     
2bab0 20 20 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78     bCover ? pIdx
2bac0 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20  ->zName : "".   
2bad0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
2bae0 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20  dbeAddOp4(.     
2baf0 20 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65     pParse->pVdbe
2bb00 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50  , OP_Explain, pP
2bb10 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
2bb20 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f   0, 0, zEqp, P4_
2bb30 44 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20  DYNAMIC.    );. 
2bb40 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
2bb50 69 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c  ine explainSimpl
2bb60 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65  eCount(a,b,c).#e
2bb70 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69  ndif../*.** sqli
2bb80 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63 61  te3WalkExpr() ca
2bb90 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 68  llback used by h
2bba0 61 76 69 6e 67 54 6f 57 68 65 72 65 28 29 2e 0a  avingToWhere()..
2bbb0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 64  **.** If the nod
2bbc0 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  e passed to the 
2bbd0 63 61 6c 6c 62 61 63 6b 20 69 73 20 61 20 54 4b  callback is a TK
2bbe0 5f 41 4e 44 20 6e 6f 64 65 2c 20 72 65 74 75 72  _AND node, retur
2bbf0 6e 20 0a 2a 2a 20 57 52 43 5f 43 6f 6e 74 69 6e  n .** WRC_Contin
2bc00 75 65 20 74 6f 20 74 65 6c 6c 20 73 71 6c 69 74  ue to tell sqlit
2bc10 65 33 57 61 6c 6b 45 78 70 72 28 29 20 74 6f 20  e3WalkExpr() to 
2bc20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
2bc30 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2a 0a  child nodes..**.
2bc40 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
2bc50 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 2e 20  turn WRC_Prune. 
2bc60 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c  In this case, al
2bc70 73 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  so check if the 
2bc80 0a 2a 2a 20 73 75 62 2d 65 78 70 72 65 73 73 69  .** sub-expressi
2bc90 6f 6e 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  on matches the c
2bca0 72 69 74 65 72 69 61 20 66 6f 72 20 62 65 69 6e  riteria for bein
2bcb0 67 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 57  g moved to the W
2bcc0 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 2e 20  HERE.** clause. 
2bcd0 49 66 20 73 6f 2c 20 61 64 64 20 69 74 20 74 6f  If so, add it to
2bce0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2bcf0 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 74 68  e and replace th
2bd00 65 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f 6e  e sub-expression
2bd10 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 48  .** within the H
2bd20 41 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  AVING expression
2bd30 20 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74   with a constant
2bd40 20 22 31 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   "1"..*/.static 
2bd50 69 6e 74 20 68 61 76 69 6e 67 54 6f 57 68 65 72  int havingToWher
2bd60 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a  eExprCb(Walker *
2bd70 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
2bd80 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78  Expr){.  if( pEx
2bd90 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44 20 29  pr->op!=TK_AND )
2bda0 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  {.    Select *pS
2bdb0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53   = pWalker->u.pS
2bdc0 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20 73  elect;.    if( s
2bdd0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
2bde0 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 70 57  tantOrGroupBy(pW
2bdf0 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70  alker->pParse, p
2be00 45 78 70 72 2c 20 70 53 2d 3e 70 47 72 6f 75 70  Expr, pS->pGroup
2be10 42 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  By) ){.      sql
2be20 69 74 65 33 20 2a 64 62 20 3d 20 70 57 61 6c 6b  ite3 *db = pWalk
2be30 65 72 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  er->pParse->db;.
2be40 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
2be50 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
2be60 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  loc(db, TK_INTEG
2be70 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54  ER, &sqlite3IntT
2be80 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20  okens[1], 0);.  
2be90 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
2bea0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 57          Expr *pW
2beb0 68 65 72 65 20 3d 20 70 53 2d 3e 70 57 68 65 72  here = pS->pWher
2bec0 65 3b 0a 20 20 20 20 20 20 20 20 53 57 41 50 28  e;.        SWAP(
2bed0 45 78 70 72 2c 20 2a 70 4e 65 77 2c 20 2a 70 45  Expr, *pNew, *pE
2bee0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  xpr);.        pN
2bef0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
2bf00 41 6e 64 28 64 62 2c 20 70 57 68 65 72 65 2c 20  And(db, pWhere, 
2bf10 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70  pNew);.        p
2bf20 53 2d 3e 70 57 68 65 72 65 20 3d 20 70 4e 65 77  S->pWhere = pNew
2bf30 3b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  ;.        pWalke
2bf40 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20  r->eCode = 1;.  
2bf50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2bf60 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2bf70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  ;.  }.  return W
2bf80 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
2bf90 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65  /*.** Transfer e
2bfa0 6c 69 67 69 62 6c 65 20 74 65 72 6d 73 20 66 72  ligible terms fr
2bfb0 6f 6d 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  om the HAVING cl
2bfc0 61 75 73 65 20 6f 66 20 61 20 71 75 65 72 79 2c  ause of a query,
2bfd0 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 70 72 6f   which is.** pro
2bfe0 63 65 73 73 65 64 20 61 66 74 65 72 20 67 72 6f  cessed after gro
2bff0 75 70 69 6e 67 2c 20 74 6f 20 74 68 65 20 57 48  uping, to the WH
2c000 45 52 45 20 63 6c 61 75 73 65 2c 20 77 68 69 63  ERE clause, whic
2c010 68 20 69 73 20 70 72 6f 63 65 73 73 65 64 20 62  h is processed b
2c020 65 66 6f 72 65 0a 2a 2a 20 67 72 6f 75 70 69 6e  efore.** groupin
2c030 67 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  g. For example, 
2c040 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  the query:.**.**
2c050 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2c060 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20   <tables> WHERE 
2c070 61 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48  a=? GROUP BY b H
2c080 41 56 49 4e 47 20 62 3d 3f 20 41 4e 44 20 63 3d  AVING b=? AND c=
2c090 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ?.**.** can be r
2c0a0 65 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a  ewritten as:.**.
2c0b0 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
2c0c0 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52  OM <tables> WHER
2c0d0 45 20 61 3d 3f 20 41 4e 44 20 62 3d 3f 20 47 52  E a=? AND b=? GR
2c0e0 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20  OUP BY b HAVING 
2c0f0 63 3d 3f 0a 2a 2a 0a 2a 2a 20 41 20 74 65 72 6d  c=?.**.** A term
2c100 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 65   of the HAVING e
2c110 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 6c 69  xpression is eli
2c120 67 69 62 6c 65 20 66 6f 72 20 74 72 61 6e 73 66  gible for transf
2c130 65 72 20 69 66 20 69 74 20 63 6f 6e 73 69 73 74  er if it consist
2c140 73 0a 2a 2a 20 65 6e 74 69 72 65 6c 79 20 6f 66  s.** entirely of
2c150 20 63 6f 6e 73 74 61 6e 74 73 20 61 6e 64 20 65   constants and e
2c160 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
2c170 61 72 65 20 61 6c 73 6f 20 47 52 4f 55 50 20 42  are also GROUP B
2c180 59 20 74 65 72 6d 73 20 74 68 61 74 0a 2a 2a 20  Y terms that.** 
2c190 75 73 65 20 74 68 65 20 22 42 49 4e 41 52 59 22  use the "BINARY"
2c1a0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
2c1b0 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nce..*/.static v
2c1c0 6f 69 64 20 68 61 76 69 6e 67 54 6f 57 68 65 72  oid havingToWher
2c1d0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
2c1e0 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 57   Select *p){.  W
2c1f0 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20  alker sWalker;. 
2c200 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b 65 72   memset(&sWalker
2c210 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 61 6c  , 0, sizeof(sWal
2c220 6b 65 72 29 29 3b 0a 20 20 73 57 61 6c 6b 65 72  ker));.  sWalker
2c230 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
2c240 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70  ;.  sWalker.xExp
2c250 72 43 61 6c 6c 62 61 63 6b 20 3d 20 68 61 76 69  rCallback = havi
2c260 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43 62 3b  ngToWhereExprCb;
2c270 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70 53 65  .  sWalker.u.pSe
2c280 6c 65 63 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69  lect = p;.  sqli
2c290 74 65 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61  te3WalkExpr(&sWa
2c2a0 6c 6b 65 72 2c 20 70 2d 3e 70 48 61 76 69 6e 67  lker, p->pHaving
2c2b0 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
2c2c0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
2c2d0 20 73 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 26   sWalker.eCode &
2c2e0 26 20 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74  & (sqlite3Select
2c2f0 54 72 61 63 65 20 26 20 30 78 31 30 30 29 21 3d  Trace & 0x100)!=
2c300 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
2c310 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
2c320 65 2c 70 2c 28 22 4d 6f 76 65 20 48 41 56 49 4e  e,p,("Move HAVIN
2c330 47 20 74 65 72 6d 73 20 69 6e 74 6f 20 57 48 45  G terms into WHE
2c340 52 45 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  RE:\n"));.    sq
2c350 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
2c360 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
2c370 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
2c380 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
2c390 66 20 74 68 65 20 70 54 68 69 73 20 65 6e 74 72  f the pThis entr
2c3a0 79 20 6f 66 20 70 54 61 62 4c 69 73 74 20 69 73  y of pTabList is
2c3b0 20 61 20 73 65 6c 66 2d 6a 6f 69 6e 20 6f 66 20   a self-join of 
2c3c0 61 20 70 72 69 6f 72 20 76 69 65 77 2e 0a 2a 2a  a prior view..**
2c3d0 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   If it is, then 
2c3e0 72 65 74 75 72 6e 20 74 68 65 20 53 72 63 4c 69  return the SrcLi
2c3f0 73 74 5f 69 74 65 6d 20 66 6f 72 20 74 68 65 20  st_item for the 
2c400 70 72 69 6f 72 20 76 69 65 77 2e 20 20 49 66 20  prior view.  If 
2c410 69 74 20 69 73 20 6e 6f 74 2c 0a 2a 2a 20 74 68  it is not,.** th
2c420 65 6e 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  en return 0..*/.
2c430 73 74 61 74 69 63 20 73 74 72 75 63 74 20 53 72  static struct Sr
2c440 63 4c 69 73 74 5f 69 74 65 6d 20 2a 69 73 53 65  cList_item *isSe
2c450 6c 66 4a 6f 69 6e 56 69 65 77 28 0a 20 20 53 72  lfJoinView(.  Sr
2c460 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
2c470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
2c480 61 72 63 68 20 66 6f 72 20 73 65 6c 66 2d 6a 6f  arch for self-jo
2c490 69 6e 73 20 69 6e 20 74 68 69 73 20 46 52 4f 4d  ins in this FROM
2c4a0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
2c4b0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2c4c0 20 2a 70 54 68 69 73 20 20 20 2f 2a 20 53 65 61   *pThis   /* Sea
2c4d0 72 63 68 20 66 6f 72 20 70 72 69 6f 72 20 72 65  rch for prior re
2c4e0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20  ference to this 
2c4f0 73 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20  subquery */.){. 
2c500 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2c510 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66  item *pItem;.  f
2c520 6f 72 28 70 49 74 65 6d 20 3d 20 70 54 61 62 4c  or(pItem = pTabL
2c530 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 54  ist->a; pItem<pT
2c540 68 69 73 3b 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  his; pItem++){. 
2c550 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
2c560 65 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69  elect==0 ) conti
2c570 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74  nue;.    if( pIt
2c580 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
2c590 69 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ine ) continue;.
2c5a0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
2c5b0 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Name==0 ) contin
2c5c0 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ue;.    if( sqli
2c5d0 74 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65  te3_stricmp(pIte
2c5e0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20 70 54  m->zDatabase, pT
2c5f0 68 69 73 2d 3e 7a 44 61 74 61 62 61 73 65 29 21  his->zDatabase)!
2c600 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2c610 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
2c620 74 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e  tricmp(pItem->zN
2c630 61 6d 65 2c 20 70 54 68 69 73 2d 3e 7a 4e 61 6d  ame, pThis->zNam
2c640 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  e)!=0 ) continue
2c650 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2c660 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20  3ExprCompare(0, 
2c670 0a 20 20 20 20 20 20 20 20 20 20 70 54 68 69 73  .          pThis
2c680 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72  ->pSelect->pWher
2c690 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  e, pItem->pSelec
2c6a0 74 2d 3e 70 57 68 65 72 65 2c 20 2d 31 29 20 0a  t->pWhere, -1) .
2c6b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
2c6c0 54 68 65 20 76 69 65 77 20 77 61 73 20 6d 6f 64  The view was mod
2c6d0 69 66 69 65 64 20 62 79 20 73 6f 6d 65 20 6f 74  ified by some ot
2c6e0 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  her optimization
2c6f0 20 73 75 63 68 20 61 73 0a 20 20 20 20 20 20 2a   such as.      *
2c700 2a 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54  * pushDownWhereT
2c710 65 72 6d 73 28 29 20 2a 2f 0a 20 20 20 20 20 20  erms() */.      
2c720 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
2c730 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d      return pItem
2c740 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2c750 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
2c760 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f  TE_COUNTOFVIEW_O
2c770 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  PTIMIZATION./*.*
2c780 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 74 72 61  * Attempt to tra
2c790 6e 73 66 6f 72 6d 20 61 20 71 75 65 72 79 20 6f  nsform a query o
2c7a0 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
2c7b0 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
2c7c0 28 2a 29 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  (*) FROM (SELECT
2c7d0 20 78 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   x FROM t1 UNION
2c7e0 20 41 4c 4c 20 53 45 4c 45 43 54 20 79 20 46 52   ALL SELECT y FR
2c7f0 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 49 6e 74  OM t2).**.** Int
2c800 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  o this:.**.**   
2c810 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
2c820 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
2c830 29 2b 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  )+(SELECT count(
2c840 2a 29 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a  *) FROM t2).**.*
2c850 2a 20 54 68 65 20 74 72 61 6e 73 66 6f 72 6d 61  * The transforma
2c860 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  tion only works 
2c870 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
2c880 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
2c890 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65  :.**.**   *  The
2c8a0 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 55   subquery is a U
2c8b0 4e 49 4f 4e 20 41 4c 4c 20 6f 66 20 74 77 6f 20  NION ALL of two 
2c8c0 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 0a 2a 2a  or more terms.**
2c8d0 20 20 20 2a 20 20 54 68 65 72 65 20 69 73 20 6e     *  There is n
2c8e0 6f 20 57 48 45 52 45 20 6f 72 20 47 52 4f 55 50  o WHERE or GROUP
2c8f0 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20 63 6c   BY or HAVING cl
2c900 61 75 73 65 73 20 6f 6e 20 74 68 65 20 73 75 62  auses on the sub
2c910 71 75 65 72 69 65 73 0a 2a 2a 20 20 20 2a 20 20  queries.**   *  
2c920 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
2c930 69 73 20 61 20 73 69 6d 70 6c 65 20 63 6f 75 6e  is a simple coun
2c940 74 28 2a 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  t(*).**.** Retur
2c950 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6f 70  n TRUE if the op
2c960 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 6e  timization is un
2c970 64 65 72 74 61 6b 65 6e 2e 0a 2a 2f 0a 73 74 61  dertaken..*/.sta
2c980 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 4f 66 56  tic int countOfV
2c990 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28  iewOptimization(
2c9a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
2c9b0 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c  elect *p){.  Sel
2c9c0 65 63 74 20 2a 70 53 75 62 2c 20 2a 70 50 72 69  ect *pSub, *pPri
2c9d0 6f 72 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  or;.  Expr *pExp
2c9e0 72 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 75 6e  r;.  Expr *pCoun
2c9f0 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
2ca00 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  ;.  if( (p->selF
2ca10 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
2ca20 61 74 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ate)==0 ) return
2ca30 20 30 3b 20 20 20 2f 2a 20 54 68 69 73 20 69 73   0;   /* This is
2ca40 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f   an aggregate */
2ca50 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
2ca60 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
2ca70 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
2ca80 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 72       /* Single r
2ca90 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  esult column */.
2caa0 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c    pExpr = p->pEL
2cab0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
2cac0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
2cad0 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  !=TK_AGG_FUNCTIO
2cae0 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  N ) return 0;   
2caf0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 69       /* Result i
2cb00 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a  s an aggregate *
2cb10 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
2cb20 73 74 72 69 63 6d 70 28 70 45 78 70 72 2d 3e 75  stricmp(pExpr->u
2cb30 2e 7a 54 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22 29  .zToken,"count")
2cb40 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
2cb50 20 49 73 20 63 6f 75 6e 74 28 29 20 2a 2f 0a 20   Is count() */. 
2cb60 20 69 66 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c   if( pExpr->x.pL
2cb70 69 73 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20  ist!=0 ) return 
2cb80 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2cb90 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
2cba0 75 6e 74 28 2a 29 20 2a 2f 0a 20 20 69 66 28 20  unt(*) */.  if( 
2cbb0 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  p->pSrc->nSrc!=1
2cbc0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2cbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cbe0 20 4f 6e 65 20 74 61 62 6c 65 20 69 6e 20 46 52   One table in FR
2cbf0 4f 4d 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20  OM  */.  pSub = 
2cc00 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
2cc10 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 53 75  elect;.  if( pSu
2cc20 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  b==0 ) return 0;
2cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2cc50 65 20 46 52 4f 4d 20 69 73 20 61 20 73 75 62 71  e FROM is a subq
2cc60 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 70 53  uery */.  if( pS
2cc70 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20  ub->pPrior==0 ) 
2cc80 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
2cc90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2cca0 75 73 74 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  ust be a compoun
2ccb0 64 20 72 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20  d ry */.  do{.  
2ccc0 20 20 69 66 28 20 70 53 75 62 2d 3e 6f 70 21 3d    if( pSub->op!=
2ccd0 54 4b 5f 41 4c 4c 20 26 26 20 70 53 75 62 2d 3e  TK_ALL && pSub->
2cce0 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20  pPrior ) return 
2ccf0 30 3b 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 55  0;  /* Must be U
2cd00 4e 49 4f 4e 20 41 4c 4c 20 2a 2f 0a 20 20 20 20  NION ALL */.    
2cd10 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65  if( pSub->pWhere
2cd20 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2cd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd40 20 20 2f 2a 20 4e 6f 20 57 48 45 52 45 20 63 6c    /* No WHERE cl
2cd50 61 75 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  ause */.    if( 
2cd60 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
2cd70 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 20   SF_Aggregate ) 
2cd80 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a  return 0;     /*
2cd90 20 4e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   Not an aggregat
2cda0 65 20 2a 2f 0a 20 20 20 20 70 53 75 62 20 3d 20  e */.    pSub = 
2cdb0 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 20 20  pSub->pPrior;   
2cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cdd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2cde0 70 65 61 74 20 6f 76 65 72 20 63 6f 6d 70 6f 75  peat over compou
2cdf0 6e 64 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20  nd */.  }while( 
2ce00 70 53 75 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  pSub );..  /* If
2ce10 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
2ce20 6f 69 6e 74 20 74 68 65 6e 20 69 74 20 69 73 20  oint then it is 
2ce30 4f 4b 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  OK to perform th
2ce40 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  e transformation
2ce50 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72   */..  db = pPar
2ce60 73 65 2d 3e 64 62 3b 0a 20 20 70 43 6f 75 6e 74  se->db;.  pCount
2ce70 20 3d 20 70 45 78 70 72 3b 0a 20 20 70 45 78 70   = pExpr;.  pExp
2ce80 72 20 3d 20 30 3b 0a 20 20 70 53 75 62 20 3d 20  r = 0;.  pSub = 
2ce90 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
2cea0 65 6c 65 63 74 3b 0a 20 20 70 2d 3e 70 53 72 63  elect;.  p->pSrc
2ceb0 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d  ->a[0].pSelect =
2cec0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63   0;.  sqlite3Src
2ced0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2cee0 2d 3e 70 53 72 63 29 3b 0a 20 20 70 2d 3e 70 53  ->pSrc);.  p->pS
2cef0 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
2cf00 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
2cf10 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 2d 3e  >db, sizeof(*p->
2cf20 70 53 72 63 29 29 3b 0a 20 20 77 68 69 6c 65 28  pSrc));.  while(
2cf30 20 70 53 75 62 20 29 7b 0a 20 20 20 20 45 78 70   pSub ){.    Exp
2cf40 72 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 70 50  r *pTerm;.    pP
2cf50 72 69 6f 72 20 3d 20 70 53 75 62 2d 3e 70 50 72  rior = pSub->pPr
2cf60 69 6f 72 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  ior;.    pSub->p
2cf70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
2cf80 53 75 62 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  Sub->pNext = 0;.
2cf90 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61      pSub->selFla
2cfa0 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61  gs |= SF_Aggrega
2cfb0 74 65 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73 65  te;.    pSub->se
2cfc0 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f  lFlags &= ~SF_Co
2cfd0 6d 70 6f 75 6e 64 3b 0a 20 20 20 20 70 53 75 62  mpound;.    pSub
2cfe0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30  ->nSelectRow = 0
2cff0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2d000 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
2d010 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
2d020 20 20 20 70 54 65 72 6d 20 3d 20 70 50 72 69 6f     pTerm = pPrio
2d030 72 20 3f 20 73 71 6c 69 74 65 33 45 78 70 72 44  r ? sqlite3ExprD
2d040 75 70 28 64 62 2c 20 70 43 6f 75 6e 74 2c 20 30  up(db, pCount, 0
2d050 29 20 3a 20 70 43 6f 75 6e 74 3b 0a 20 20 20 20  ) : pCount;.    
2d060 70 53 75 62 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pSub->pEList = s
2d070 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
2d080 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
2d090 70 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72  pTerm);.    pTer
2d0a0 6d 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  m = sqlite3PExpr
2d0b0 28 70 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45  (pParse, TK_SELE
2d0c0 43 54 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  CT, 0, 0);.    s
2d0d0 71 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65  qlite3PExprAddSe
2d0e0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 65  lect(pParse, pTe
2d0f0 72 6d 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 69  rm, pSub);.    i
2d100 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20  f( pExpr==0 ){. 
2d110 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 54 65       pExpr = pTe
2d120 72 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rm;.    }else{. 
2d130 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
2d140 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
2d150 2c 20 54 4b 5f 50 4c 55 53 2c 20 70 54 65 72 6d  , TK_PLUS, pTerm
2d160 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  , pExpr);.    }.
2d170 20 20 20 20 70 53 75 62 20 3d 20 70 50 72 69 6f      pSub = pPrio
2d180 72 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 45 4c 69  r;.  }.  p->pELi
2d190 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 20 3d  st->a[0].pExpr =
2d1a0 20 70 45 78 70 72 3b 0a 20 20 70 2d 3e 73 65 6c   pExpr;.  p->sel
2d1b0 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 41 67 67  Flags &= ~SF_Agg
2d1c0 72 65 67 61 74 65 3b 0a 0a 23 69 66 20 53 45 4c  regate;..#if SEL
2d1d0 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2d1e0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
2d1f0 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30  lectTrace & 0x40
2d200 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
2d210 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73  RACE(0x400,pPars
2d220 65 2c 70 2c 28 22 41 66 74 65 72 20 63 6f 75 6e  e,p,("After coun
2d230 74 2d 6f 66 2d 76 69 65 77 20 6f 70 74 69 6d 69  t-of-view optimi
2d240 7a 61 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20  zation:\n"));.  
2d250 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2d260 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
2d270 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
2d280 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
2d290 66 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 55 4e  f /* SQLITE_COUN
2d2a0 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41  TOFVIEW_OPTIMIZA
2d2b0 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  TION */../*.** G
2d2c0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
2d2d0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
2d2e0 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74  ement given in t
2d2f0 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20  he p argument.  
2d300 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
2d310 74 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20  ts are returned 
2d320 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
2d330 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75   SelectDest stru
2d340 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f  cture..** See co
2d350 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65  mments in sqlite
2d360 49 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65  Int.h for furthe
2d370 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  r information..*
2d380 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2d390 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
2d3a0 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
2d3b0 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
2d3c0 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  re.** encountere
2d3d0 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  d, then an appro
2d3e0 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73  priate error mes
2d3f0 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a  sage is left in.
2d400 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ** pParse->zErrM
2d410 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sg..**.** This r
2d420 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20  outine does NOT 
2d430 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20  free the Select 
2d440 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
2d450 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c   in.  The.** cal
2d460 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65  ling function ne
2d470 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  eds to do that..
2d480 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
2d490 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
2d4a0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
2d4b0 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
2d4c0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
2d4d0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
2d4e0 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
2d4f0 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
2d500 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  oded. */.  Selec
2d510 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
2d520 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
2d530 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72  with the query r
2d540 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
2d550 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
2d560 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2d570 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
2d580 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
2d590 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f     /* Return fro
2d5a0 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  m sqlite3WhereBe
2d5b0 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20  gin() */.  Vdbe 
2d5c0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
2d5d0 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
2d5e0 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63   machine under c
2d5f0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
2d600 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20   int isAgg;     
2d610 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2d620 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73  for select lists
2d630 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22   like "count(*)"
2d640 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
2d650 70 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20  pEList = 0;  /* 
2d660 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
2d670 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20  to extract. */. 
2d680 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
2d690 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st;     /* List 
2d6a0 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c  of tables to sel
2d6b0 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78  ect from */.  Ex
2d6c0 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
2d6d0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
2d6e0 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
2d6f0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
2d700 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
2d710 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
2d720 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
2d730 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
2d740 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
2d750 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
2d760 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
2d770 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
2d780 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  rc = 1;         
2d790 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
2d7a0 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20  eturn from this 
2d7b0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69  function */.  Di
2d7c0 73 74 69 6e 63 74 43 74 78 20 73 44 69 73 74 69  stinctCtx sDisti
2d7d0 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20  nct; /* Info on 
2d7e0 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20  how to code the 
2d7f0 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
2d800 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53   */.  SortCtx sS
2d810 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ort;         /* 
2d820 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63  Info on how to c
2d830 6f 64 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ode the ORDER BY
2d840 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67   clause */.  Agg
2d850 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20  Info sAggInfo;  
2d860 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
2d870 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65  on used by aggre
2d880 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a  gate queries */.
2d890 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20    int iEnd;     
2d8a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
2d8b0 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f  ess of the end o
2d8c0 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  f the query */. 
2d8d0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
2d8e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
2d8f0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2d900 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  on */.  ExprList
2d910 20 2a 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79   *pMinMaxOrderBy
2d920 20 3d 20 30 3b 20 20 2f 2a 20 41 64 64 65 64 20   = 0;  /* Added 
2d930 4f 52 44 45 52 20 42 59 20 66 6f 72 20 6d 69 6e  ORDER BY for min
2d940 2f 6d 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a  /max queries */.
2d950 20 20 75 38 20 6d 69 6e 4d 61 78 46 6c 61 67 3b    u8 minMaxFlag;
2d960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d970 20 2f 2a 20 46 6c 61 67 20 66 6f 72 20 6d 69 6e   /* Flag for min
2d980 2f 6d 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a  /max queries */.
2d990 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d9a0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
2d9b0 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  nt iRestoreSelec
2d9c0 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  tId = pParse->iS
2d9d0 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73  electId;.  pPars
2d9e0 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70  e->iSelectId = p
2d9f0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
2da00 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ctId++;.#endif..
2da10 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
2da20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  b;.  if( p==0 ||
2da30 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2da40 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
2da50 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
2da60 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  1;.  }.  if( sql
2da70 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
2da80 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
2da90 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20  ECT, 0, 0, 0) ) 
2daa0 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73  return 1;.  mems
2dab0 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c  et(&sAggInfo, 0,
2dac0 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f   sizeof(sAggInfo
2dad0 29 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  ));.#if SELECTTR
2dae0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45  ACE_ENABLED.  SE
2daf0 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
2db00 73 65 2c 70 2c 20 28 22 62 65 67 69 6e 20 70 72  se,p, ("begin pr
2db10 6f 63 65 73 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a  ocessing:\n"));.
2db20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2db30 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
2db40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54   ){.    sqlite3T
2db50 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
2db60 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
2db70 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  if..  assert( p-
2db80 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
2db90 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
2dba0 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20  T_DistFifo );.  
2dbb0 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
2dbc0 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
2dbd0 3e 65 44 65 73 74 21 3d 53 52 54 5f 46 69 66 6f  >eDest!=SRT_Fifo
2dbe0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
2dbf0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
2dc00 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
2dc10 54 5f 44 69 73 74 51 75 65 75 65 20 29 3b 0a 20  T_DistQueue );. 
2dc20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
2dc30 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
2dc40 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65  ->eDest!=SRT_Que
2dc50 75 65 20 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f  ue );.  if( Igno
2dc60 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65  rableOrderby(pDe
2dc70 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  st) ){.    asser
2dc80 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  t(pDest->eDest==
2dc90 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44  SRT_Exists || pD
2dca0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2dcb0 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20  Union || .      
2dcc0 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
2dcd0 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c  t==SRT_Except ||
2dce0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2dcf0 52 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20 20  RT_Discard ||.  
2dd00 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
2dd10 65 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75 65  eDest==SRT_Queue
2dd20 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73    || pDest->eDes
2dd30 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
2dd40 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  ||.           pD
2dd50 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2dd60 44 69 73 74 51 75 65 75 65 20 7c 7c 20 70 44 65  DistQueue || pDe
2dd70 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46  st->eDest==SRT_F
2dd80 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  ifo);.    /* If 
2dd90 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e  ORDER BY makes n
2dda0 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20  o difference in 
2ddb0 74 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20  the output then 
2ddc0 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20  neither does.   
2ddd0 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20   ** DISTINCT so 
2dde0 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65  it can be remove
2ddf0 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71  d too. */.    sq
2de00 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2de10 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
2de20 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rBy);.    p->pOr
2de30 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
2de40 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
2de50 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  F_Distinct;.  }.
2de60 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
2de70 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30  rep(pParse, p, 0
2de80 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f  );.  memset(&sSo
2de90 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53  rt, 0, sizeof(sS
2dea0 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70  ort));.  sSort.p
2deb0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
2dec0 64 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73  derBy;.  pTabLis
2ded0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69  t = p->pSrc;.  i
2dee0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
2def0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
2df00 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
2df10 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
2df20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
2df30 69 73 74 21 3d 30 20 29 3b 0a 20 20 69 73 41 67  ist!=0 );.  isAg
2df40 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  g = (p->selFlags
2df50 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
2df60 21 3d 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  !=0;.#if SELECTT
2df70 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
2df80 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2df90 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
2dfa0 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
2dfb0 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
2dfc0 20 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72 65   ("after name re
2dfd0 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a  solution:\n"));.
2dfe0 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2dff0 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
2e000 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
2e010 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74    /* Get a point
2e020 65 72 20 74 68 65 20 56 44 42 45 20 75 6e 64 65  er the VDBE unde
2e030 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2c 20  r construction, 
2e040 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  allocating a new
2e050 20 56 44 42 45 20 69 66 20 6f 6e 65 0a 20 20 2a   VDBE if one.  *
2e060 2a 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  * does not alrea
2e070 64 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 76 20  dy exist */.  v 
2e080 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
2e090 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
2e0a0 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  v==0 ) goto sele
2e0b0 63 74 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 44  ct_end;.  if( pD
2e0c0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2e0d0 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65  Output ){.    ge
2e0e0 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
2e0f0 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
2e100 7d 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 76  }..  /* Try to v
2e110 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  arious optimizat
2e120 69 6f 6e 73 20 28 66 6c 61 74 74 65 6e 69 6e 67  ions (flattening
2e130 20 73 75 62 71 75 65 72 69 65 73 2c 20 61 6e 64   subqueries, and
2e140 20 73 74 72 65 6e 67 74 68 0a 20 20 2a 2a 20 72   strength.  ** r
2e150 65 64 75 63 74 69 6f 6e 20 6f 66 20 6a 6f 69 6e  eduction of join
2e160 20 6f 70 65 72 61 74 6f 72 73 29 20 69 6e 20 74   operators) in t
2e170 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 75  he FROM clause u
2e180 70 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  p into the main 
2e190 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21  query.  */.#if !
2e1a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2e1b0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
2e1c0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2e1d0 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f  _OMIT_VIEW).  fo
2e1e0 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f  r(i=0; !p->pPrio
2e1f0 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d  r && i<pTabList-
2e200 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
2e210 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2e220 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
2e230 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20  TabList->a[i];. 
2e240 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
2e250 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  = pItem->pSelect
2e260 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
2e270 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
2e280 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
2e290 20 4c 45 46 54 20 4a 4f 49 4e 20 69 6e 74 6f 20   LEFT JOIN into 
2e2a0 4a 4f 49 4e 20 69 66 20 74 68 65 72 65 20 61 72  JOIN if there ar
2e2b0 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 72  e terms of the r
2e2c0 69 67 68 74 20 74 61 62 6c 65 0a 20 20 20 20 2a  ight table.    *
2e2d0 2a 20 6f 66 20 74 68 65 20 4c 45 46 54 20 4a 4f  * of the LEFT JO
2e2e0 49 4e 20 75 73 65 64 20 69 6e 20 74 68 65 20 57  IN used in the W
2e2f0 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 20  HERE clause..   
2e300 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 74   */.    if( (pIt
2e310 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  em->fg.jointype 
2e320 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20 20  & JT_LEFT)!=0.  
2e330 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
2e340 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52  rImpliesNonNullR
2e350 6f 77 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 49  ow(p->pWhere, pI
2e360 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20  tem->iCursor).  
2e370 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
2e380 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
2e390 4c 49 54 45 5f 53 69 6d 70 6c 69 66 79 4a 6f 69  LITE_SimplifyJoi
2e3a0 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  n).    ){.      
2e3b0 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
2e3c0 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20  0,pParse,p,.    
2e3d0 20 20 20 20 20 20 20 20 20 20 20 20 28 22 4c 45              ("LE
2e3e0 46 54 2d 4a 4f 49 4e 20 73 69 6d 70 6c 69 66 69  FT-JOIN simplifi
2e3f0 65 73 20 74 6f 20 4a 4f 49 4e 20 6f 6e 20 74 65  es to JOIN on te
2e400 72 6d 20 25 64 5c 6e 22 2c 69 29 29 3b 0a 20 20  rm %d\n",i));.  
2e410 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f      pItem->fg.jo
2e420 69 6e 74 79 70 65 20 26 3d 20 7e 28 4a 54 5f 4c  intype &= ~(JT_L
2e430 45 46 54 7c 4a 54 5f 4f 55 54 45 52 29 3b 0a 20  EFT|JT_OUTER);. 
2e440 20 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78       unsetJoinEx
2e450 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 49  pr(p->pWhere, pI
2e460 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
2e470 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20     }..    /* No 
2e480 66 75 74 68 65 72 20 61 63 74 69 6f 6e 20 69 66  futher action if
2e490 20 74 68 69 73 20 74 65 72 6d 20 6f 66 20 74 68   this term of th
2e4a0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
2e4b0 20 6e 6f 20 61 20 73 75 62 71 75 65 72 79 20 2a   no a subquery *
2e4c0 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d  /.    if( pSub==
2e4d0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
2e4e0 20 20 20 2f 2a 20 43 61 74 63 68 20 6d 69 73 6d     /* Catch mism
2e4f0 61 74 63 68 20 69 6e 20 74 68 65 20 64 65 63 6c  atch in the decl
2e500 61 72 65 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  ared columns of 
2e510 61 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 6e  a view and the n
2e520 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
2e530 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 53  columns in the S
2e540 45 4c 45 43 54 20 6f 6e 20 74 68 65 20 52 48 53  ELECT on the RHS
2e550 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62   */.    if( pTab
2e560 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e 70 45  ->nCol!=pSub->pE
2e570 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
2e580 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2e590 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65 78  rMsg(pParse, "ex
2e5a0 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e  pected %d column
2e5b0 73 20 66 6f 72 20 27 25 73 27 20 62 75 74 20 67  s for '%s' but g
2e5c0 6f 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  ot %d",.        
2e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
2e5e0 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e  ab->nCol, pTab->
2e5f0 7a 4e 61 6d 65 2c 20 70 53 75 62 2d 3e 70 45 4c  zName, pSub->pEL
2e600 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
2e610 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
2e620 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  nd;.    }..    /
2e630 2a 20 44 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20  * Do not try to 
2e640 66 6c 61 74 74 65 6e 20 61 6e 20 61 67 67 72 65  flatten an aggre
2e650 67 61 74 65 20 73 75 62 71 75 65 72 79 2e 0a 20  gate subquery.. 
2e660 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6c 61     **.    ** Fla
2e670 74 74 65 6e 69 6e 67 20 61 6e 20 61 67 67 72 65  ttening an aggre
2e680 67 61 74 65 20 73 75 62 71 75 65 72 79 20 69 73  gate subquery is
2e690 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69   only possible i
2e6a0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
2e6b0 79 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  y.    ** is not 
2e6c0 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66 20  a join.  But if 
2e6d0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
2e6e0 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2c 20 74  is not a join, t
2e6f0 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 79  hen the subquery
2e700 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  .    ** will be 
2e710 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
2e720 20 63 6f 2d 72 6f 75 74 69 6e 65 20 61 6e 64 20   co-routine and 
2e730 74 68 65 72 65 20 69 73 20 6e 6f 20 61 64 76 61  there is no adva
2e740 6e 74 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20  ntage to.    ** 
2e750 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 74 68  flattening in th
2e760 61 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  at case..    */.
2e770 20 20 20 20 69 66 28 20 28 70 53 75 62 2d 3e 73      if( (pSub->s
2e780 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
2e790 72 65 67 61 74 65 29 21 3d 30 20 29 20 63 6f 6e  regate)!=0 ) con
2e7a0 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
2e7b0 74 28 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42  t( pSub->pGroupB
2e7c0 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  y==0 );..    /* 
2e7d0 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  If the outer que
2e7e0 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 22 63  ry contains a "c
2e7f0 6f 6d 70 6c 65 78 22 20 72 65 73 75 6c 74 20 73  omplex" result s
2e800 65 74 20 28 74 68 61 74 20 69 73 2c 0a 20 20 20  et (that is,.   
2e810 20 2a 2a 20 69 66 20 74 68 65 20 72 65 73 75 6c   ** if the resul
2e820 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74  t set of the out
2e830 65 72 20 71 75 65 72 79 20 75 73 65 73 20 66 75  er query uses fu
2e840 6e 63 74 69 6f 6e 73 20 6f 72 20 73 75 62 71 75  nctions or subqu
2e850 65 72 69 65 73 29 0a 20 20 20 20 2a 2a 20 61 6e  eries).    ** an
2e860 64 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  d if the subquer
2e870 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 4f 52  y contains an OR
2e880 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
2e890 64 20 69 66 0a 20 20 20 20 2a 2a 20 69 74 20 77  d if.    ** it w
2e8a0 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74  ill be implement
2e8b0 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69  ed as a co-routi
2e8c0 6e 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ne, then do not 
2e8d0 66 6c 61 74 74 65 6e 2e 20 20 54 68 69 73 0a 20  flatten.  This. 
2e8e0 20 20 20 2a 2a 20 72 65 73 74 72 69 63 74 69 6f     ** restrictio
2e8f0 6e 20 61 6c 6c 6f 77 73 20 53 51 4c 20 63 6f 6e  n allows SQL con
2e900 73 74 72 75 63 74 73 20 6c 69 6b 65 20 74 68 69  structs like thi
2e910 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
2e920 20 20 53 45 4c 45 43 54 20 65 78 70 65 6e 73 69    SELECT expensi
2e930 76 65 5f 66 75 6e 63 74 69 6f 6e 28 78 29 0a 20  ve_function(x). 
2e940 20 20 20 2a 2a 20 20 20 20 46 52 4f 4d 20 28 53     **    FROM (S
2e950 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62  ELECT x FROM tab
2e960 20 4f 52 44 45 52 20 42 59 20 79 20 4c 49 4d 49   ORDER BY y LIMI
2e970 54 20 31 30 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  T 10);.    **.  
2e980 20 20 2a 2a 20 54 68 65 20 65 78 70 65 6e 73 69    ** The expensi
2e990 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73  ve_function() is
2e9a0 20 6f 6e 6c 79 20 63 6f 6d 70 75 74 65 64 20 6f   only computed o
2e9b0 6e 20 74 68 65 20 31 30 20 72 6f 77 73 20 74 68  n the 10 rows th
2e9c0 61 74 0a 20 20 20 20 2a 2a 20 61 72 65 20 6f 75  at.    ** are ou
2e9d0 74 70 75 74 2c 20 72 61 74 68 65 72 20 74 68 61  tput, rather tha
2e9e0 6e 20 65 76 65 72 79 20 72 6f 77 20 6f 66 20 74  n every row of t
2e9f0 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  he table..    **
2ea00 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 71 75  .    ** The requ
2ea10 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65  irement that the
2ea20 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 76   outer query hav
2ea30 65 20 61 20 63 6f 6d 70 6c 65 78 20 72 65 73 75  e a complex resu
2ea40 6c 74 20 73 65 74 0a 20 20 20 20 2a 2a 20 6d 65  lt set.    ** me
2ea50 61 6e 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e  ans that flatten
2ea60 69 6e 67 20 64 6f 65 73 20 6f 63 63 75 72 20 6f  ing does occur o
2ea70 6e 20 73 69 6d 70 6c 65 72 20 53 51 4c 20 63 6f  n simpler SQL co
2ea80 6e 73 74 72 61 69 6e 74 73 20 77 69 74 68 6f 75  nstraints withou
2ea90 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 78 70  t.    ** the exp
2eaa0 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28  ensive_function(
2eab0 29 20 6c 69 6b 65 3a 0a 20 20 20 20 2a 2a 0a 20  ) like:.    **. 
2eac0 20 20 20 2a 2a 20 20 53 45 4c 45 43 54 20 78 20     **  SELECT x 
2ead0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46  FROM (SELECT x F
2eae0 52 4f 4d 20 74 61 62 20 4f 52 44 45 52 20 42 59  ROM tab ORDER BY
2eaf0 20 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a 20 20   y LIMIT 10);.  
2eb00 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
2eb10 62 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 0a 20  b->pOrderBy!=0. 
2eb20 20 20 20 20 26 26 20 69 3d 3d 30 0a 20 20 20 20      && i==0.    
2eb30 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
2eb40 20 26 20 53 46 5f 43 6f 6d 70 6c 65 78 52 65 73   & SF_ComplexRes
2eb50 75 6c 74 29 21 3d 30 0a 20 20 20 20 20 26 26 20  ult)!=0.     && 
2eb60 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d  (pTabList->nSrc=
2eb70 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  =1.         || (
2eb80 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66  pTabList->a[1].f
2eb90 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c  g.jointype&(JT_L
2eba0 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
2ebb0 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
2ebc0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
2ebd0 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e  .    if( flatten
2ebe0 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c  Subquery(pParse,
2ebf0 20 70 2c 20 69 2c 20 69 73 41 67 67 29 20 29 7b   p, i, isAgg) ){
2ec00 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73  .      /* This s
2ec10 75 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61  ubquery can be a
2ec20 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73  bsorbed into its
2ec30 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20   parent. */.    
2ec40 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a    i = -1;.    }.
2ec50 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
2ec60 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20  ->pSrc;.    if( 
2ec70 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2ec80 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2ec90 6e 64 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e  nd;.    if( !Ign
2eca0 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
2ecb0 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73 53  est) ){.      sS
2ecc0 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  ort.pOrderBy = p
2ecd0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
2ece0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  }.  }.#endif..#i
2ecf0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2ed00 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
2ed10 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f  T.  /* Handle co
2ed20 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
2ed30 61 74 65 6d 65 6e 74 73 20 75 73 69 6e 67 20 74  atements using t
2ed40 68 65 20 73 65 70 61 72 61 74 65 20 6d 75 6c 74  he separate mult
2ed50 69 53 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70  iSelect().  ** p
2ed60 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20  rocedure..  */. 
2ed70 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
2ed80 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69  {.    rc = multi
2ed90 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
2eda0 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78  , pDest);.    ex
2edb0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
2edc0 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
2edd0 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  d, iRestoreSelec
2ede0 74 49 64 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  tId);.#if SELECT
2edf0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2ee00 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
2ee10 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63  pParse,p,("end c
2ee20 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70  ompound-select p
2ee30 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a  rocessing\n"));.
2ee40 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
2ee50 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
2ee60 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20  ..  /* For each 
2ee70 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d  term in the FROM
2ee80 20 63 6c 61 75 73 65 2c 20 64 6f 20 74 77 6f 20   clause, do two 
2ee90 74 68 69 6e 67 73 3a 0a 20 20 2a 2a 20 28 31 29  things:.  ** (1)
2eea0 20 41 75 74 68 6f 72 69 7a 65 64 20 75 6e 72 65   Authorized unre
2eeb0 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 73 0a  ferenced tables.
2eec0 20 20 2a 2a 20 28 32 29 20 47 65 6e 65 72 61 74    ** (2) Generat
2eed0 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73  e code for all s
2eee0 75 62 2d 71 75 65 72 69 65 73 0a 20 20 2a 2f 0a  ub-queries.  */.
2eef0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
2ef00 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
2ef10 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
2ef20 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
2ef30 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
2ef40 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44  [i];.    SelectD
2ef50 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65  est dest;.    Se
2ef60 6c 65 63 74 20 2a 70 53 75 62 3b 0a 23 69 66 20  lect *pSub;.#if 
2ef70 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2ef80 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
2ef90 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
2efa0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20  E_OMIT_VIEW).   
2efb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
2efc0 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  vedAuthContext;.
2efd0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
2efe0 73 73 75 65 20 53 51 4c 49 54 45 5f 52 45 41 44  ssue SQLITE_READ
2eff0 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73 20   authorizations 
2f000 77 69 74 68 20 61 20 66 61 6b 65 20 63 6f 6c 75  with a fake colu
2f010 6d 6e 20 6e 61 6d 65 20 66 6f 72 20 61 6e 79 0a  mn name for any.
2f020 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 74 68      ** tables th
2f030 61 74 20 61 72 65 20 72 65 66 65 72 65 6e 63 65  at are reference
2f040 64 20 62 75 74 20 66 72 6f 6d 20 77 68 69 63 68  d but from which
2f050 20 6e 6f 20 76 61 6c 75 65 73 20 61 72 65 20 65   no values are e
2f060 78 74 72 61 63 74 65 64 2e 0a 20 20 20 20 2a 2a  xtracted..    **
2f070 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 65   Examples of whe
2f080 72 65 20 74 68 65 73 65 20 6b 69 6e 64 73 20 6f  re these kinds o
2f090 66 20 6e 75 6c 6c 20 53 51 4c 49 54 45 5f 52 45  f null SQLITE_RE
2f0a0 41 44 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  AD authorization
2f0b0 73 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 6f  s.    ** would o
2f0c0 63 63 75 72 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ccur:.    **.   
2f0d0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63   **     SELECT c
2f0e0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b  ount(*) FROM t1;
2f0f0 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41     -- SQLITE_REA
2f100 44 20 74 31 2e 22 22 0a 20 20 20 20 2a 2a 20 20  D t1."".    **  
2f110 20 20 20 53 45 4c 45 43 54 20 74 31 2e 2a 20 46     SELECT t1.* F
2f120 52 4f 4d 20 74 31 2c 20 74 32 3b 20 20 20 2d 2d  ROM t1, t2;   --
2f130 20 53 51 4c 49 54 45 5f 52 45 41 44 20 74 32 2e   SQLITE_READ t2.
2f140 22 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  "".    **.    **
2f150 20 54 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e   The fake column
2f160 20 6e 61 6d 65 20 69 73 20 61 6e 20 65 6d 70 74   name is an empt
2f170 79 20 73 74 72 69 6e 67 2e 20 20 49 74 20 69 73  y string.  It is
2f180 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20   possible for a 
2f190 74 61 62 6c 65 20 74 6f 0a 20 20 20 20 2a 2a 20  table to.    ** 
2f1a0 68 61 76 65 20 61 20 63 6f 6c 75 6d 6e 20 6e 61  have a column na
2f1b0 6d 65 64 20 62 79 20 74 68 65 20 65 6d 70 74 79  med by the empty
2f1c0 20 73 74 72 69 6e 67 2c 20 69 6e 20 77 68 69 63   string, in whic
2f1d0 68 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20  h case there is 
2f1e0 6e 6f 20 77 61 79 20 74 6f 0a 20 20 20 20 2a 2a  no way to.    **
2f1f0 20 64 69 73 74 69 6e 67 75 69 73 68 20 62 65 74   distinguish bet
2f200 77 65 65 6e 20 61 6e 20 75 6e 72 65 66 65 72 65  ween an unrefere
2f210 6e 63 65 64 20 74 61 62 6c 65 20 61 6e 64 20 61  nced table and a
2f220 6e 20 61 63 74 75 61 6c 20 72 65 66 65 72 65 6e  n actual referen
2f230 63 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ce to the.    **
2f240 20 22 22 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 20   "" column. The 
2f250 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20  original design 
2f260 77 61 73 20 66 6f 72 20 74 68 65 20 66 61 6b 65  was for the fake
2f270 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74 6f 20   column name to 
2f280 62 65 20 61 20 4e 55 4c 4c 2c 0a 20 20 20 20 2a  be a NULL,.    *
2f290 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65  * which would be
2f2a0 20 75 6e 61 6d 62 69 67 75 6f 75 73 2e 20 20 42   unambiguous.  B
2f2b0 75 74 20 6c 65 67 61 63 79 20 61 75 74 68 6f 72  ut legacy author
2f2c0 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b  ization callback
2f2d0 73 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 61  s might.    ** a
2f2e0 73 73 75 6d 65 20 74 68 65 20 63 6f 6c 75 6d 6e  ssume the column
2f2f0 20 6e 61 6d 65 20 69 73 20 6e 6f 6e 2d 4e 55 4c   name is non-NUL
2f300 4c 20 61 6e 64 20 73 65 67 66 61 75 6c 74 2e 20  L and segfault. 
2f310 20 54 68 65 20 75 73 65 20 6f 66 20 61 6e 20 65   The use of an e
2f320 6d 70 74 79 0a 20 20 20 20 2a 2a 20 73 74 72 69  mpty.    ** stri
2f330 6e 67 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20  ng for the fake 
2f340 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 73 65 65 6d  column name seem
2f350 73 20 73 61 66 65 72 2e 0a 20 20 20 20 2a 2f 0a  s safer..    */.
2f360 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 63      if( pItem->c
2f370 6f 6c 55 73 65 64 3d 3d 30 20 29 7b 0a 20 20 20  olUsed==0 ){.   
2f380 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 43 68     sqlite3AuthCh
2f390 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
2f3a0 54 45 5f 52 45 41 44 2c 20 70 49 74 65 6d 2d 3e  TE_READ, pItem->
2f3b0 7a 4e 61 6d 65 2c 20 22 22 2c 20 70 49 74 65 6d  zName, "", pItem
2f3c0 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
2f3d0 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
2f3e0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
2f3f0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
2f400 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2f410 56 49 45 57 29 0a 20 20 20 20 2f 2a 20 47 65 6e  VIEW).    /* Gen
2f420 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
2f430 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69  ll sub-queries i
2f440 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2f450 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 53 75  e.    */.    pSu
2f460 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  b = pItem->pSele
2f470 63 74 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62  ct;.    if( pSub
2f480 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2f490 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65  .    /* Sometime
2f4a0 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61  s the code for a
2f4b0 20 73 75 62 71 75 65 72 79 20 77 69 6c 6c 20 62   subquery will b
2f4c0 65 20 67 65 6e 65 72 61 74 65 64 20 6d 6f 72 65  e generated more
2f4d0 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63   than.    ** onc
2f4e0 65 2c 20 69 66 20 74 68 65 20 73 75 62 71 75 65  e, if the subque
2f4f0 72 79 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ry is part of th
2f500 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
2f510 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20  n a LEFT JOIN,. 
2f520 20 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c     ** for exampl
2f530 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  e.  In that case
2f540 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72  , do not regener
2f550 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
2f560 6d 61 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a 20  manifest.    ** 
2f570 61 20 76 69 65 77 20 6f 72 20 74 68 65 20 63 6f  a view or the co
2f580 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c  -routine to impl
2f590 65 6d 65 6e 74 20 61 20 76 69 65 77 2e 20 20 54  ement a view.  T
2f5a0 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63  he first instanc
2f5b0 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 66 66  e.    ** is suff
2f5c0 69 63 69 65 6e 74 2c 20 74 68 6f 75 67 68 20 74  icient, though t
2f5d0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f  he subroutine to
2f5e0 20 6d 61 6e 69 66 65 73 74 20 74 68 65 20 76 69   manifest the vi
2f5f0 65 77 20 64 6f 65 73 20 6e 65 65 64 0a 20 20 20  ew does need.   
2f600 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65   ** to be invoke
2f610 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20  d again. */.    
2f620 69 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  if( pItem->addrF
2f630 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20 20  illSub ){.      
2f640 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69  if( pItem->fg.vi
2f650 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b  aCoroutine==0 ){
2f660 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2f670 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
2f680 6d 61 6e 69 66 65 73 74 73 20 74 68 65 20 76 69  manifests the vi
2f690 65 77 20 6d 69 67 68 74 20 62 65 20 61 20 6f 6e  ew might be a on
2f6a0 65 2d 74 69 6d 65 20 72 6f 75 74 69 6e 65 2c 0a  e-time routine,.
2f6b0 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 69 74          ** or it
2f6c0 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62   might need to b
2f6d0 65 20 72 65 72 75 6e 20 6f 6e 20 65 61 63 68 20  e rerun on each 
2f6e0 69 74 65 72 61 74 69 6f 6e 20 62 65 63 61 75 73  iteration becaus
2f6f0 65 20 69 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  e it.        ** 
2f700 65 6e 63 6f 64 65 73 20 61 20 63 6f 72 72 65 6c  encodes a correl
2f710 61 74 65 64 20 73 75 62 71 75 65 72 79 2e 20 2a  ated subquery. *
2f720 2f 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  /.        testca
2f730 73 65 28 20 73 71 6c 69 74 65 33 56 64 62 65 47  se( sqlite3VdbeG
2f740 65 74 4f 70 28 76 2c 20 70 49 74 65 6d 2d 3e 61  etOp(v, pItem->a
2f750 64 64 72 46 69 6c 6c 53 75 62 29 2d 3e 6f 70 63  ddrFillSub)->opc
2f760 6f 64 65 3d 3d 4f 50 5f 4f 6e 63 65 20 29 3b 0a  ode==OP_Once );.
2f770 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2f780 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2f790 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65  Gosub, pItem->re
2f7a0 67 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e  gReturn, pItem->
2f7b0 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20  addrFillSub);.  
2f7c0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74      }.      cont
2f7d0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  inue;.    }..   
2f7e0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61   /* Increment Pa
2f7f0 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74  rse.nHeight by t
2f800 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65  he height of the
2f810 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73   largest express
2f820 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20  ion.    ** tree 
2f830 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 74  referred to by t
2f840 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20  his, the parent 
2f850 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c  select. The chil
2f860 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20  d select.    ** 
2f870 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72  may contain expr
2f880 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20  ession trees of 
2f890 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28  at most.    ** (
2f8a0 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
2f8b0 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69  DEPTH-Parse.nHei
2f8c0 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69  ght) height. Thi
2f8d0 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a  s is a bit.    *
2f8e0 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74  * more conservat
2f8f0 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61  ive than necessa
2f900 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73  ry, but much eas
2f910 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69  ier than enforci
2f920 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61  ng.    ** an exa
2f930 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f  ct limit..    */
2f940 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
2f950 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  ight += sqlite3S
2f960 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
2f970 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  p);..    /* Make
2f980 20 63 6f 70 69 65 73 20 6f 66 20 63 6f 6e 73 74   copies of const
2f990 61 6e 74 20 57 48 45 52 45 2d 63 6c 61 75 73 65  ant WHERE-clause
2f9a0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6f 75   terms in the ou
2f9b0 74 65 72 20 71 75 65 72 79 20 64 6f 77 6e 0a 20  ter query down. 
2f9c0 20 20 20 2a 2a 20 69 6e 73 69 64 65 20 74 68 65     ** inside the
2f9d0 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73   subquery.  This
2f9e0 20 63 61 6e 20 68 65 6c 70 20 74 68 65 20 73 75   can help the su
2f9f0 62 71 75 65 72 79 20 74 6f 20 72 75 6e 20 6d 6f  bquery to run mo
2fa00 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a  re efficiently..
2fa10 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4f      */.    if( O
2fa20 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
2fa30 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 50 75  ed(db, SQLITE_Pu
2fa40 73 68 44 6f 77 6e 29 0a 20 20 20 20 20 26 26 20  shDown).     && 
2fa50 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72  pushDownWhereTer
2fa60 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ms(pParse, pSub,
2fa70 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65   p->pWhere, pIte
2fa80 6d 2d 3e 69 43 75 72 73 6f 72 2c 0a 20 20 20 20  m->iCursor,.    
2fa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2faa0 20 20 20 20 20 20 20 28 70 49 74 65 6d 2d 3e 66         (pItem->f
2fab0 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
2fac0 4f 55 54 45 52 29 21 3d 30 29 0a 20 20 20 20 29  OUTER)!=0).    )
2fad0 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  {.#if SELECTTRAC
2fae0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20  E_ENABLED.      
2faf0 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
2fb00 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
2fb10 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  {.        SELECT
2fb20 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
2fb30 73 65 2c 70 2c 28 22 41 66 74 65 72 20 57 48 45  se,p,("After WHE
2fb40 52 45 2d 63 6c 61 75 73 65 20 70 75 73 68 2d 64  RE-clause push-d
2fb50 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20  own:\n"));.     
2fb60 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2fb70 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
2fb80 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
2fb90 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
2fba0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
2fbb0 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x100,pParse,p,("
2fbc0 50 75 73 68 2d 64 6f 77 6e 20 6e 6f 74 20 70 6f  Push-down not po
2fbd0 73 73 69 62 6c 65 5c 6e 22 29 29 3b 0a 20 20 20  ssible\n"));.   
2fbe0 20 7d 0a 0a 20 20 20 20 7a 53 61 76 65 64 41 75   }..    zSavedAu
2fbf0 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  thContext = pPar
2fc00 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
2fc10 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41  ;.    pParse->zA
2fc20 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49 74  uthContext = pIt
2fc30 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20  em->zName;..    
2fc40 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
2fc50 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
2fc60 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a  e subquery.    *
2fc70 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 75 62  *.    ** The sub
2fc80 71 75 65 72 79 20 69 73 20 69 6d 70 6c 65 6d 65  query is impleme
2fc90 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75  nted as a co-rou
2fca0 74 69 6e 65 20 69 66 20 74 68 65 20 73 75 62 71  tine if the subq
2fcb0 75 65 72 79 20 69 73 0a 20 20 20 20 2a 2a 20 67  uery is.    ** g
2fcc0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
2fcd0 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 28  the outer loop (
2fce0 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  so that it does 
2fcf0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
2fd00 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 6d     ** computed m
2fd10 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a 20  ore than once). 
2fd20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f 44     **.    ** TOD
2fd30 4f 3a 20 41 72 65 20 74 68 65 72 65 20 6f 74 68  O: Are there oth
2fd40 65 72 20 72 65 61 73 6f 6e 73 20 62 65 73 69 64  er reasons besid
2fd50 65 20 28 31 29 20 74 6f 20 75 73 65 20 61 20 63  e (1) to use a c
2fd60 6f 2d 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  o-routine.    **
2fd70 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 3f   implementation?
2fd80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2fd90 69 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  i==0.     && (pT
2fda0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a  abList->nSrc==1.
2fdb0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
2fdc0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66  pTabList->a[1].f
2fdd0 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c  g.jointype&(JT_L
2fde0 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
2fdf0 30 29 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20  0)  /* (1) */.  
2fe00 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d    ){.      /* Im
2fe10 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75  plement a co-rou
2fe20 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72  tine that will r
2fe30 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72  eturn a single r
2fe40 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
2fe50 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e  .      ** set on
2fe60 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e   each invocation
2fe70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2fe80 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73   int addrTop = s
2fe90 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2fea0 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20  tAddr(v)+1;.    
2feb0 20 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72   .      pItem->r
2fec0 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
2fed0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2fee0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2fef0 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
2ff00 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72  outine, pItem->r
2ff10 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64  egReturn, 0, add
2ff20 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62  rTop);.      Vdb
2ff30 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
2ff40 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
2ff50 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70  zName));.      p
2ff60 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2ff70 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20  b = addrTop;.   
2ff80 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2ff90 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
2ffa0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70  SRT_Coroutine, p
2ffb0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
2ffc0 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
2ffd0 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
2ffe0 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
2fff0 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
30000 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
30010 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
30020 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
30030 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
30040 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
30050 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52  = pSub->nSelectR
30060 6f 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ow;.      pItem-
30070 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
30080 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65   = 1;.      pIte
30090 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64  m->regResult = d
300a0 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20  est.iSdst;.     
300b0 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
300c0 6f 72 6f 75 74 69 6e 65 28 76 2c 20 70 49 74 65  oroutine(v, pIte
300d0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
300e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
300f0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
30100 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  Top-1);.      sq
30110 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65  lite3ClearTempRe
30120 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a  gCache(pParse);.
30130 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30140 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
30150 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  ubroutine that w
30160 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65  ill fill an ephe
30170 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68  meral table with
30180 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  .      ** the co
30190 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75  ntent of this su
301a0 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e  bquery.  pItem->
301b0 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c  addrFillSub will
301c0 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20   point.      ** 
301d0 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  to the address o
301e0 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  f the generated 
301f0 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74  subroutine.  pIt
30200 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20  em->regReturn.  
30210 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69      ** is a regi
30220 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74  ster allocated t
30230 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f  o hold the subro
30240 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64  utine return add
30250 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ress.      */.  
30260 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b      int topAddr;
30270 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41  .      int onceA
30280 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ddr = 0;.      i
30290 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20  nt retAddr;.    
302a0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
302b0 5f 69 74 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a  _item *pPrior;..
302c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
302d0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
302e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74  ==0 );.      pIt
302f0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
30300 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
30310 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20        topAddr = 
30320 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30330 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
30340 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65   0, pItem->regRe
30350 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74  turn);.      pIt
30360 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
30370 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20  = topAddr+1;.   
30380 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
30390 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30  .isCorrelated==0
303a0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
303b0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
303c0 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64  s not correlated
303d0 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e   and if we are n
303e0 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20  ot inside of.   
303f0 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
30400 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20  r, then we only 
30410 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
30420 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
30430 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20   subquery.      
30440 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20    ** once. */.  
30450 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d        onceAddr =
30460 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30470 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20  p0(v, OP_Once); 
30480 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
30490 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
304a0 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69  ment((v, "materi
304b0 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70  alize \"%s\"", p
304c0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
304d0 65 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  e));.      }else
304e0 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f  {.        VdbeNo
304f0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d  opComment((v, "m
30500 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c  aterialize \"%s\
30510 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  "", pItem->pTab-
30520 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
30530 7d 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d  }.      pPrior =
30540 20 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28   isSelfJoinView(
30550 70 54 61 62 4c 69 73 74 2c 20 70 49 74 65 6d 29  pTabList, pItem)
30560 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
30570 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  or ){.        sq
30580 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
30590 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
305a0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70  Item->iCursor, p
305b0 50 72 69 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b  Prior->iCursor);
305c0 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e  .        explain
305d0 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
305e0 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 70 50 72  ->iSelectId, pPr
305f0 69 6f 72 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b  ior->iSelectId);
30600 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
30610 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74   pPrior->pSelect
30620 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
30630 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  Sub->nSelectRow 
30640 3d 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63  = pPrior->pSelec
30650 74 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  t->nSelectRow;. 
30660 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
30670 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
30680 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
30690 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70   SRT_EphemTab, p
306a0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
306b0 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53          explainS
306c0 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
306d0 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
306e0 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
306f0 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 20 20  ectId);.        
30700 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
30710 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73  arse, pSub, &des
30720 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
30730 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e    pItem->pTab->n
30740 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62  RowLogEst = pSub
30750 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
30760 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72      if( onceAddr
30770 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
30780 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64  mpHere(v, onceAd
30790 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64  dr);.      retAd
307a0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
307b0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
307c0 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  urn, pItem->regR
307d0 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64  eturn);.      Vd
307e0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
307f0 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  nd %s", pItem->p
30800 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
30810 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
30820 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64  hangeP1(v, topAd
30830 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20  dr, retAddr);.  
30840 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
30850 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61  TempRegCache(pPa
30860 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rse);.    }.    
30870 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
30880 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
30890 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61 72  ct_end;.    pPar
308a0 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73  se->nHeight -= s
308b0 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
308c0 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70  Height(p);.    p
308d0 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
308e0 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68  ext = zSavedAuth
308f0 43 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a  Context;.#endif.
30900 20 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75    }..  /* Variou
30910 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  s elements of th
30920 65 20 53 45 4c 45 43 54 20 63 6f 70 69 65 64 20  e SELECT copied 
30930 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61  into local varia
30940 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f  bles for.  ** co
30950 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70  nvenience */.  p
30960 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
30970 74 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d  t;.  pWhere = p-
30980 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75  >pWhere;.  pGrou
30990 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
309a0 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70  y;.  pHaving = p
309b0 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69  ->pHaving;.  sDi
309c0 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20  stinct.isTnct = 
309d0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
309e0 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a  F_Distinct)!=0;.
309f0 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
30a00 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
30a10 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
30a20 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20  e & 0x400 ){.   
30a30 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34   SELECTTRACE(0x4
30a40 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
30a50 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61  ter all FROM-cla
30a60 75 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22  use analysis:\n"
30a70 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
30a80 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
30a90 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
30aa0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
30ab0 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50  E_COUNTOFVIEW_OP
30ac0 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  TIMIZATION.  if(
30ad0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
30ae0 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
30af0 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 7c 53  QueryFlattener|S
30b00 51 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65  QLITE_CountOfVie
30b10 77 29 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f 66  w).   && countOf
30b20 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  ViewOptimization
30b30 28 70 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b  (pParse, p).  ){
30b40 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
30b50 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
30b60 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
30b70 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
30b80 69 73 74 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  ist;.    pTabLis
30b90 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d  t = p->pSrc;.  }
30ba0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
30bb0 20 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49   the query is DI
30bc0 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f  STINCT with an O
30bd0 52 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e  RDER BY but is n
30be0 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c  ot an aggregate,
30bf0 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68   and .  ** if th
30c00 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73  e select-list is
30c10 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
30c20 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20   ORDER BY list, 
30c30 74 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a  then this query.
30c40 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72    ** can be rewr
30c50 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50  itten as a GROUP
30c60 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f   BY. In other wo
30c70 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a  rds, this:.  **.
30c80 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
30c90 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f  DISTINCT xyz FRO
30ca0 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78  M ... ORDER BY x
30cb0 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20  yz.  **.  ** is 
30cc0 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a  transformed to:.
30cd0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
30ce0 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e  LECT xyz FROM ..
30cf0 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f  . GROUP BY xyz O
30d00 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a  RDER BY xyz.  **
30d10 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  .  ** The second
30d20 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72   form is preferr
30d30 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69  ed as a single i
30d40 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61  ndex (or temp-ta
30d50 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a  ble) may be .  *
30d60 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20  * used for both 
30d70 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64  the ORDER BY and
30d80 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
30d90 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61  sing. As origina
30da0 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65  lly .  ** writte
30db0 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74  n the query must
30dc0 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c   use a temp-tabl
30dd0 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f  e for at least o
30de0 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ne of the ORDER 
30df0 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53  .  ** BY and DIS
30e00 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e  TINCT, and an in
30e10 64 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20  dex or separate 
30e20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74  temp-table for t
30e30 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20  he other..  */. 
30e40 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
30e50 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
30e60 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
30e70 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20  =SF_Distinct .  
30e80 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c   && sqlite3ExprL
30e90 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74  istCompare(sSort
30ea0 2e 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73  .pOrderBy, pELis
30eb0 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20  t, -1)==0.  ){. 
30ec0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
30ed0 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
30ee0 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
30ef0 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
30f00 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
30f10 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a  db, pEList, 0);.
30f20 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68      /* Notice th
30f30 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20  at even thought 
30f40 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20  SF_Distinct has 
30f50 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f  been cleared fro
30f60 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20  m p->selFlags,. 
30f70 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69     ** the sDisti
30f80 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74  nct.isTnct is st
30f90 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c  ill set.  Hence,
30fa0 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e   isTnct represen
30fb0 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72  ts the.    ** or
30fc0 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f  iginal setting o
30fd0 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63  f the SF_Distinc
30fe0 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20  t flag, not the 
30ff0 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20  current setting 
31000 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
31010 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
31020 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52  );..#if SELECTTR
31030 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
31040 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
31050 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  tTrace & 0x400 )
31060 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  {.      SELECTTR
31070 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
31080 2c 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20 44  ,p,("Transform D
31090 49 53 54 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f  ISTINCT into GRO
310a0 55 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20  UP BY:\n"));.   
310b0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
310c0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
310d0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
310e0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
310f0 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
31100 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63  Y clause, then c
31110 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72  reate an ephemer
31120 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a  al index to.  **
31130 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e   do the sorting.
31140 20 20 42 75 74 20 74 68 69 73 20 73 6f 72 74 69    But this sorti
31150 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  ng ephemeral ind
31160 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a  ex might end up.
31170 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65    ** being unuse
31180 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61  d if the data ca
31190 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20 69  n be extracted i
311a0 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64  n pre-sorted ord
311b0 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74  er..  ** If that
311c0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
311d0 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  en the OP_OpenEp
311e0 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
311f0 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a  ion will be.  **
31200 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f   changed to an O
31210 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66  P_Noop once we f
31220 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74  igure out that t
31230 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
31240 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65   is.  ** not nee
31250 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e  ded.  The sSort.
31260 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61  addrSortIndex va
31270 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
31280 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a  o facilitate.  *
31290 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20  * that change.. 
312a0 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e   */.  if( sSort.
312b0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
312c0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
312d0 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  o;.    pKeyInfo 
312e0 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
312f0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73 53  rList(pParse, sS
31300 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c  ort.pOrderBy, 0,
31310 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
31320 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72  .    sSort.iECur
31330 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
31340 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e  ab++;.    sSort.
31350 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a  addrSortIndex =.
31360 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
31370 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
31380 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
31390 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43         sSort.iEC
313a0 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72  ursor, sSort.pOr
313b0 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70  derBy->nExpr+1+p
313c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c  EList->nExpr, 0,
313d0 0a 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72  .          (char
313e0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
313f0 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a  EYINFO.      );.
31400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f    }else{.    sSo
31410 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
31420 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
31430 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
31440 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
31450 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
31460 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
31470 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  e..  */.  if( pD
31480 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
31490 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
314a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
314b0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
314c0 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53  meral, pDest->iS
314d0 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e  DParm, pEList->n
314e0 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Expr);.  }..  /*
314f0 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
31500 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20  ..  */.  iEnd = 
31510 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
31520 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 28  abel(v);.  if( (
31530 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
31540 5f 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20  _FixedLimit)==0 
31550 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  ){.    p->nSelec
31560 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20  tRow = 320;  /* 
31570 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a  4 billion rows *
31580 2f 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c  /.  }.  computeL
31590 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
315a0 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a  arse, p, iEnd);.
315b0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d    if( p->iLimit=
315c0 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72  =0 && sSort.addr
315d0 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a  SortIndex>=0 ){.
315e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
315f0 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73  hangeOpcode(v, s
31600 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
31610 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  ex, OP_SorterOpe
31620 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f  n);.    sSort.so
31630 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46  rtFlags |= SORTF
31640 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20  LAG_UseSorter;. 
31650 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e   }..  /* Open an
31660 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
31670 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
31680 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
31690 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
316a0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
316b0 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69  ct ){.    sDisti
316c0 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50  nct.tabTnct = pP
316d0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
316e0 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72    sDistinct.addr
316f0 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Tnct = sqlite3Vd
31700 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
31710 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
31720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31730 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74             sDist
31740 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c  inct.tabTnct, 0,
31750 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
31760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31770 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46   (char*)keyInfoF
31780 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
31790 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c  se, p->pEList,0,
317a0 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
317b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317c0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
317d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
317e0 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55  ngeP5(v, BTREE_U
317f0 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73  NORDERED);.    s
31800 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
31810 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  pe = WHERE_DISTI
31820 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20  NCT_UNORDERED;. 
31830 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73   }else{.    sDis
31840 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
31850 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
31860 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66  _NOOP;.  }..  if
31870 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f  ( !isAgg && pGro
31880 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  upBy==0 ){.    /
31890 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66  * No aggregate f
318a0 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20  unctions and no 
318b0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
318c0 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c  */.    u16 wctrl
318d0 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e  Flags = (sDistin
318e0 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52  ct.isTnct ? WHER
318f0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
31900 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  : 0);.    assert
31910 28 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49  ( WHERE_USE_LIMI
31920 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69 74  T==SF_FixedLimit
31930 20 29 3b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61   );.    wctrlFla
31940 67 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  gs |= p->selFlag
31950 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69  s & SF_FixedLimi
31960 74 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e  t;..    /* Begin
31970 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
31980 61 6e 2e 20 2a 2f 0a 20 20 20 20 53 45 4c 45 43  an. */.    SELEC
31990 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
319a0 70 2c 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e  p,("WhereBegin\n
319b0 22 29 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20  "));.    pWInfo 
319c0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
319d0 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
319e0 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53  List, pWhere, sS
319f0 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20  ort.pOrderBy,.  
31a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a10 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
31a20 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61  pEList, wctrlFla
31a30 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  gs, p->nSelectRo
31a40 77 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  w);.    if( pWIn
31a50 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
31a60 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
31a70 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74   sqlite3WhereOut
31a80 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e  putRowCount(pWIn
31a90 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74  fo) < p->nSelect
31aa0 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Row ){.      p->
31ab0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
31ac0 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52  ite3WhereOutputR
31ad0 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b  owCount(pWInfo);
31ae0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
31af0 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
31b00 26 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  && sqlite3WhereI
31b10 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f  sDistinct(pWInfo
31b20 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74  ) ){.      sDist
31b30 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
31b40 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
31b50 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b  istinct(pWInfo);
31b60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
31b70 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
31b80 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42  .      sSort.nOB
31b90 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65  Sat = sqlite3Whe
31ba0 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
31bb0 66 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f 72 74  fo);.      sSort
31bc0 2e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  .bOrderedInnerLo
31bd0 6f 70 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  op = sqlite3Wher
31be0 65 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f  eOrderedInnerLoo
31bf0 70 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  p(pWInfo);.     
31c00 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61   if( sSort.nOBSa
31c10 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  t==sSort.pOrderB
31c20 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
31c30 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72      sSort.pOrder
31c40 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  By = 0;.      }.
31c50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
31c60 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
31c70 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20  hat was created 
31c80 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70  by a prior OP_Op
31c90 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20  enEphemeral .   
31ca0 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
31cb0 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69  ended up not bei
31cc0 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  ng needed, then 
31cd0 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  change the OP_Op
31ce0 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20  enEphemeral.    
31cf0 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f  ** into an OP_No
31d00 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  op..    */.    i
31d10 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  f( sSort.addrSor
31d20 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73 53 6f  tIndex>=0 && sSo
31d30 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  rt.pOrderBy==0 )
31d40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
31d50 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
31d60 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  v, sSort.addrSor
31d70 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a  tIndex);.    }..
31d80 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73      /* Use the s
31d90 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
31da0 6f 70 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  op. */.    asser
31db0 74 28 20 70 2d 3e 70 45 4c 69 73 74 3d 3d 70 45  t( p->pEList==pE
31dc0 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 65 6c 65  List );.    sele
31dd0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
31de0 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72  se, p, -1, &sSor
31df0 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70  t, &sDistinct, p
31e00 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
31e10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31e20 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61  3WhereContinueLa
31e30 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20  bel(pWInfo),.   
31e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e50 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
31e60 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29  akLabel(pWInfo))
31e70 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68  ;..    /* End th
31e80 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
31e90 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
31ea0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
31eb0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  (pWInfo);.  }els
31ec0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  e{.    /* This c
31ed0 61 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65  ase when there e
31ee0 78 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66  xist aggregate f
31ef0 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52  unctions or a GR
31f00 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20  OUP BY clause.  
31f10 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a    ** or both */.
31f20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
31f30 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  sNC;    /* Name 
31f40 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63  context for proc
31f50 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
31f60 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
31f70 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20      int iAMem;  
31f80 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
31f90 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
31fa0 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74   storing current
31fb0 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
31fc0 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20   int iBMem;     
31fd0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
31fe0 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72  m address for pr
31ff0 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20  evious GROUP BY 
32000 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46  */.    int iUseF
32010 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  lag;       /* Me
32020 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e  m address holdin
32030 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e  g flag indicatin
32040 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a  g that at least.
32050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32060 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72          ** one r
32070 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ow of the input 
32080 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  to the aggregato
32090 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  r has been.     
320a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
320b0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
320c0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72  */.    int iAbor
320d0 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65  tFlag;     /* Me
320e0 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20  m address which 
320f0 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f  causes query abo
32100 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  rt if positive *
32110 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42  /.    int groupB
32120 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77  ySort;    /* Row
32130 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72  s come from sour
32140 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ce in GROUP BY o
32150 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rder */.    int 
32160 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20  addrEnd;        
32170 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73  /* End of proces
32180 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45  sing for this SE
32190 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20  LECT */.    int 
321a0 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20  sortPTab = 0;   
321b0 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75  /* Pseudotable u
321c0 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f  sed to decode so
321d0 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  rting results */
321e0 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74  .    int sortOut
321f0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70   = 0;    /* Outp
32200 75 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d  ut register from
32210 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20   the sorter */. 
32220 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72     int orderByGr
32230 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69  p = 0; /* True i
32240 66 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  f the GROUP BY a
32250 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72 65 20  nd ORDER BY are 
32260 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20  the same */..   
32270 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61   /* Remove any a
32280 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62  nd all aliases b
32290 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c  etween the resul
322a0 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20  t set and the.  
322b0 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c    ** GROUP BY cl
322c0 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ause..    */.   
322d0 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
322e0 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20  .      int k;   
322f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32300 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
32310 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74  nter */.      st
32320 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
32330 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46  em *pItem;  /* F
32340 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
32350 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20  expression in a 
32360 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66  list */..      f
32370 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  or(k=p->pEList->
32380 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e  nExpr, pItem=p->
32390 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20  pEList->a; k>0; 
323a0 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
323b0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
323c0 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  x.iAlias = 0;.  
323d0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
323e0 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  k=pGroupBy->nExp
323f0 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42  r, pItem=pGroupB
32400 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  y->a; k>0; k--, 
32410 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
32420 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
32430 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
32440 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 36  .      assert( 6
32450 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
32460 28 31 30 30 29 20 29 3b 0a 20 20 20 20 20 20 69  (100) );.      i
32470 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
32480 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  >66 ) p->nSelect
32490 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20 20 7d 65  Row = 66;.    }e
324a0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
324b0 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  t( 0==sqlite3Log
324c0 45 73 74 28 31 29 20 29 3b 0a 20 20 20 20 20 20  Est(1) );.      
324d0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
324e0 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
324f0 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74   If there is bot
32500 68 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64  h a GROUP BY and
32510 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
32520 75 73 65 20 61 6e 64 20 74 68 65 79 20 61 72 65  use and they are
32530 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 63 61  .    ** identica
32540 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62  l, then it may b
32550 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 69  e possible to di
32560 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20  sable the ORDER 
32570 42 59 20 63 6c 61 75 73 65 20 0a 20 20 20 20 2a  BY clause .    *
32580 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64 73  * on the grounds
32590 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50 20   that the GROUP 
325a0 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c  BY will cause el
325b0 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f  ements to come o
325c0 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ut .    ** in th
325d0 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e  e correct order.
325e0 20 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74   It also may not
325f0 20 2d 20 74 68 65 20 47 52 4f 55 50 20 42 59 20   - the GROUP BY 
32600 6d 69 67 68 74 20 75 73 65 20 61 0a 20 20 20 20  might use a.    
32610 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  ** database inde
32620 78 20 74 68 61 74 20 63 61 75 73 65 73 20 72 6f  x that causes ro
32630 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70 65 64  ws to be grouped
32640 20 74 6f 67 65 74 68 65 72 20 61 73 20 72 65 71   together as req
32650 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62 75 74  uired.    ** but
32660 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 73 6f   not actually so
32670 72 74 65 64 2e 20 45 69 74 68 65 72 20 77 61 79  rted. Either way
32680 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  , record the fac
32690 74 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  t that the.    *
326a0 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47  * ORDER BY and G
326b0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 73 20  ROUP BY clauses 
326c0 61 72 65 20 74 68 65 20 73 61 6d 65 20 62 79 20  are the same by 
326d0 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72 64 65  setting the orde
326e0 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20 76 61  rByGrp.    ** va
326f0 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  riable.  */.    
32700 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
32710 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72 6f 75  istCompare(pGrou
32720 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  pBy, sSort.pOrde
32730 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  rBy, -1)==0 ){. 
32740 20 20 20 20 20 6f 72 64 65 72 42 79 47 72 70 20       orderByGrp 
32750 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20  = 1;.    }. .   
32760 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62   /* Create a lab
32770 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68  el to jump to wh
32780 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62  en we want to ab
32790 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f  ort the query */
327a0 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73  .    addrEnd = s
327b0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
327c0 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  bel(v);..    /* 
327d0 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d  Convert TK_COLUM
327e0 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f  N nodes into TK_
327f0 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d  AGG_COLUMN and m
32800 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  ake entries in. 
32810 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66     ** sAggInfo f
32820 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55  or all TK_AGG_FU
32830 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20  NCTION nodes in 
32840 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
32850 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  he.    ** SELECT
32860 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
32870 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
32880 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
32890 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61  C));.    sNC.pPa
328a0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
328b0 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
328c0 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73   pTabList;.    s
328d0 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73  NC.pAggInfo = &s
328e0 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67  AggInfo;.    sAg
328f0 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50  gInfo.mnReg = pP
32900 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
32910 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
32920 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f  ingColumn = pGro
32930 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d  upBy ? pGroupBy-
32940 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20  >nExpr : 0;.    
32950 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42  sAggInfo.pGroupB
32960 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
32970 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
32980 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
32990 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
329a0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
329b0 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73  eAggList(&sNC, s
329c0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a  Sort.pOrderBy);.
329d0 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
329e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 47 72  ){.      if( pGr
329f0 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20  oupBy ){.       
32a00 20 61 73 73 65 72 74 28 20 70 57 68 65 72 65 3d   assert( pWhere=
32a10 3d 70 2d 3e 70 57 68 65 72 65 20 29 3b 0a 20 20  =p->pWhere );.  
32a20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48        assert( pH
32a30 61 76 69 6e 67 3d 3d 70 2d 3e 70 48 61 76 69 6e  aving==p->pHavin
32a40 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  g );.        ass
32a50 65 72 74 28 20 70 47 72 6f 75 70 42 79 3d 3d 70  ert( pGroupBy==p
32a60 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20  ->pGroupBy );.  
32a70 20 20 20 20 20 20 68 61 76 69 6e 67 54 6f 57 68        havingToWh
32a80 65 72 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ere(pParse, p);.
32a90 20 20 20 20 20 20 20 20 70 57 68 65 72 65 20 3d          pWhere =
32aa0 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20   p->pWhere;.    
32ab0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
32ac0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
32ad0 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61  egates(&sNC, pHa
32ae0 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ving);.    }.   
32af0 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d   sAggInfo.nAccum
32b00 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66  ulator = sAggInf
32b10 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69  o.nColumn;.    i
32b20 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  f( p->pGroupBy==
32b30 30 20 26 26 20 70 2d 3e 70 48 61 76 69 6e 67 3d  0 && p->pHaving=
32b40 3d 30 20 26 26 20 73 41 67 67 49 6e 66 6f 2e 6e  =0 && sAggInfo.n
32b50 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20  Func==1 ){.     
32b60 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20 6d 69   minMaxFlag = mi
32b70 6e 4d 61 78 51 75 65 72 79 28 64 62 2c 20 73 41  nMaxQuery(db, sA
32b80 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e  ggInfo.aFunc[0].
32b90 70 45 78 70 72 2c 20 26 70 4d 69 6e 4d 61 78 4f  pExpr, &pMinMaxO
32ba0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 65 6c  rderBy);.    }el
32bb0 73 65 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78  se{.      minMax
32bc0 46 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44  Flag = WHERE_ORD
32bd0 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  ERBY_NORMAL;.   
32be0 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
32bf0 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63  i<sAggInfo.nFunc
32c00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
32c10 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
32c20 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e  operty(sAggInfo.
32c30 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20  aFunc[i].pExpr, 
32c40 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
32c50 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
32c60 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75  gs |= NC_InAggFu
32c70 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
32c80 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
32c90 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e  ist(&sNC, sAggIn
32ca0 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
32cb0 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
32cc0 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26     sNC.ncFlags &
32cd0 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b  = ~NC_InAggFunc;
32ce0 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
32cf0 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72  nfo.mxReg = pPar
32d00 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66  se->nMem;.    if
32d10 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
32d20 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
32d30 5f 65 6e 64 3b 0a 23 69 66 20 53 45 4c 45 43 54  _end;.#if SELECT
32d40 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
32d50 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
32d60 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
32d70 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
32d80 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  ;.      SELECTTR
32d90 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
32da0 2c 70 2c 28 22 41 66 74 65 72 20 61 67 67 72 65  ,p,("After aggre
32db0 67 61 74 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e  gate analysis:\n
32dc0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
32dd0 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
32de0 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20  (0, p, 0);.     
32df0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41   for(ii=0; ii<sA
32e00 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
32e10 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73  ii++){.        s
32e20 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
32e30 66 28 22 61 67 67 2d 63 6f 6c 75 6d 6e 5b 25 64  f("agg-column[%d
32e40 5d 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20  ] iMem=%d\n",.  
32e50 20 20 20 20 20 20 20 20 20 20 69 69 2c 20 73 41            ii, sA
32e60 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e  ggInfo.aCol[ii].
32e70 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  iMem);.        s
32e80 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
32e90 70 72 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61  pr(0, sAggInfo.a
32ea0 43 6f 6c 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30  Col[ii].pExpr, 0
32eb0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
32ec0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41   for(ii=0; ii<sA
32ed0 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 69  ggInfo.nFunc; ii
32ee0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
32ef0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
32f00 22 61 67 67 2d 66 75 6e 63 5b 25 64 5d 3a 20 69  "agg-func[%d]: i
32f10 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  Mem=%d\n",.     
32f20 20 20 20 20 20 20 20 69 69 2c 20 73 41 67 67 49         ii, sAggI
32f30 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 69 4d  nfo.aFunc[ii].iM
32f40 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
32f50 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
32f60 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  (0, sAggInfo.aFu
32f70 6e 63 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 29  nc[ii].pExpr, 0)
32f80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
32f90 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20 2f 2a 20  #endif...    /* 
32fa0 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  Processing for a
32fb0 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47  ggregates with G
32fc0 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20  ROUP BY is very 
32fd0 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20  different and.  
32fe0 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63    ** much more c
32ff0 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72  omplex than aggr
33000 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61  egates without a
33010 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a   GROUP BY..    *
33020 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
33030 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49  By ){.      KeyI
33040 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
33050 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d  /* Keying inform
33060 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72  ation for the gr
33070 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  oup by clause */
33080 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31  .      int addr1
33090 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d  ;          /* A-
330a0 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e  vs-B comparision
330b0 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69   jump */.      i
330c0 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  nt addrOutputRow
330d0 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73  ;  /* Start of s
330e0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
330f0 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20  utputs a result 
33100 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  row */.      int
33110 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20   regOutputRow;  
33120 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
33130 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
33140 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
33150 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
33160 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f  ddrSetAbort;   /
33170 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20  * Set the abort 
33180 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20  flag and return 
33190 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
331a0 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20  rTopOfLoop;  /* 
331b0 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74  Top of the input
331c0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69   loop */.      i
331d0 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  nt addrSortingId
331e0 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65  x; /* The OP_Ope
331f0 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74  nEphemeral for t
33200 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
33210 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
33220 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  drReset;      /*
33230 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   Subroutine for 
33240 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63  resetting the ac
33250 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20  cumulator */.   
33260 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b     int regReset;
33270 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
33280 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
33290 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72  r for reset subr
332a0 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20  outine */..     
332b0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
332c0 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
332d0 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20  e we might need 
332e0 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
332f0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  to.      ** impl
33300 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63  ement it.  Alloc
33310 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67  ate that sorting
33320 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20   index now.  If 
33330 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20  it turns out.   
33340 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
33350 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74   not need it aft
33360 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53  er all, the OP_S
33370 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75  orterOpen instru
33380 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77  ction.      ** w
33390 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
333a0 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a   into a Noop.  .
333b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
333c0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
333d0 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
333e0 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  b++;.      pKeyI
333f0 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
33400 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
33410 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 73  , pGroupBy, 0, s
33420 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29  AggInfo.nColumn)
33430 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74  ;.      addrSort
33440 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33  ingIdx = sqlite3
33450 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
33460 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20  _SorterOpen, .  
33470 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
33480 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67  .sortingIdx, sAg
33490 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
334a0 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  lumn, .         
334b0 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49   0, (char*)pKeyI
334c0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
334d0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74  ;..      /* Init
334e0 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f  ialize memory lo
334f0 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20  cations used by 
33500 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61  GROUP BY aggrega
33510 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20  te processing.  
33520 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73      */.      iUs
33530 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  eFlag = ++pParse
33540 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41  ->nMem;.      iA
33550 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61  bortFlag = ++pPa
33560 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
33570 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20   regOutputRow = 
33580 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
33590 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
335a0 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
335b0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
335c0 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20       regReset = 
335d0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
335e0 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20        addrReset 
335f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
33600 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
33610 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iAMem = pParse-
33620 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
33630 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
33640 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
33650 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20  ;.      iBMem = 
33660 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
33670 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
33680 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
33690 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->nExpr;.      s
336a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
336b0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
336c0 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  0, iAbortFlag);.
336d0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
336e0 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f  t((v, "clear abo
336f0 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
33700 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
33710 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
33720 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b  r, 0, iUseFlag);
33730 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
33740 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65  nt((v, "indicate
33750 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70   accumulator emp
33760 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ty"));.      sql
33770 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
33780 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41  , OP_Null, 0, iA
33790 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75  Mem, iAMem+pGrou
337a0 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a  pBy->nExpr-1);..
337b0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61        /* Begin a
337c0 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
337d0 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72  extract all sour
337e0 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50  ce rows in GROUP
337f0 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20   BY order..     
33800 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69   ** This might i
33810 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72  nvolve two separ
33820 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61  ate loops with a
33830 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74  n OP_Sort in bet
33840 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a  ween, or.      *
33850 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20  * it might be a 
33860 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74  single loop that
33870 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74   uses an index t
33880 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d  o extract inform
33890 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ation.      ** i
338a0 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65  n the right orde
338b0 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e  r to begin with.
338c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
338d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
338e0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
338f0 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
33900 65 74 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  et);.      SELEC
33910 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
33920 70 2c 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e  p,("WhereBegin\n
33930 22 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  "));.      pWInf
33940 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
33950 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
33960 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
33970 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20  pGroupBy, 0,.   
33980 20 20 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f         WHERE_GRO
33990 55 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47  UPBY | (orderByG
339a0 72 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42  rp ? WHERE_SORTB
339b0 59 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20  YGROUP : 0), 0. 
339c0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
339d0 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
339e0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
339f0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
33a00 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
33a10 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79  WInfo)==pGroupBy
33a20 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
33a30 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69     /* The optimi
33a40 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64  zer is able to d
33a50 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67  eliver rows in g
33a60 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f  roup by order so
33a70 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64  .        ** we d
33a80 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f  o not have to so
33a90 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e  rt.  The OP_Open
33aa0 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  Ephemeral table 
33ab0 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
33ac0 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74  ** cancelled lat
33ad0 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74  er because we st
33ae0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20  ill need to use 
33af0 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20  the pKeyInfo.   
33b00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
33b10 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b  groupBySort = 0;
33b20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
33b30 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72        /* Rows ar
33b40 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20  e coming out in 
33b50 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64  undetermined ord
33b60 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  er.  We have to 
33b70 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  push.        ** 
33b80 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20  each row into a 
33b90 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74  sorting index, t
33ba0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72  erminate the fir
33bb0 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  st loop,.       
33bc0 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76   ** then loop ov
33bd0 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  er the sorting i
33be0 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f  ndex in order to
33bf0 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a   get the output.
33c00 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f          ** in so
33c10 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20  rted order.     
33c20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
33c30 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20  t regBase;.     
33c40 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64     int regRecord
33c50 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  ;.        int nC
33c60 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ol;.        int 
33c70 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20  nGroupBy;..     
33c80 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61     explainTempTa
33c90 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  ble(pParse, .   
33ca0 20 20 20 20 20 20 20 20 20 28 73 44 69 73 74 69           (sDisti
33cb0 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70  nct.isTnct && (p
33cc0 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69  ->selFlags&SF_Di
33cd0 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20  stinct)==0) ?.  
33ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33cf0 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22    "DISTINCT" : "
33d00 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20  GROUP BY");..   
33d10 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
33d20 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47   = 1;.        nG
33d30 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
33d40 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
33d50 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42    nCol = nGroupB
33d60 79 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e  y;.        j = n
33d70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
33d80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
33d90 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
33da0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
33db0 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b  ( sAggInfo.aCol[
33dc0 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  i].iSorterColumn
33dd0 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=j ){.         
33de0 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20     nCol++;.     
33df0 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
33e00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33e10 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73  }.        regBas
33e20 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  e = sqlite3GetTe
33e30 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
33e40 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
33e50 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
33e60 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
33e70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
33e80 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
33e90 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  arse, pGroupBy, 
33ea0 72 65 67 42 61 73 65 2c 20 30 2c 20 30 29 3b 0a  regBase, 0, 0);.
33eb0 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
33ec0 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f  upBy;.        fo
33ed0 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
33ee0 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
33ef0 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
33f00 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
33f10 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e  Col = &sAggInfo.
33f20 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  aCol[i];.       
33f30 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
33f40 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
33f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
33f60 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73   r1 = j + regBas
33f70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e;.            s
33f80 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
33f90 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 70 50 61  tColumnToReg(pPa
33fa0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
33fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33fc0 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c       pCol->pTab,
33fd0 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20   pCol->iColumn, 
33fe0 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31  pCol->iTable, r1
33ff0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
34000 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
34010 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34020 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
34030 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
34040 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
34050 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34060 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
34070 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  ord, regBase, nC
34080 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ol, regRecord);.
34090 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
340a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
340b0 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41  SorterInsert, sA
340c0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
340d0 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  x, regRecord);. 
340e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
340f0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
34100 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
34110 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34120 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
34130 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
34140 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
34150 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
34160 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
34170 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
34180 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74  ngIdxPTab = sort
34190 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  PTab = pParse->n
341a0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73  Tab++;.        s
341b0 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ortOut = sqlite3
341c0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
341d0 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
341e0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
341f0 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
34200 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75  sortPTab, sortOu
34210 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, nCol);.      
34220 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34230 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
34240 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Sort, sAggInfo.s
34250 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45  ortingIdx, addrE
34260 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  nd);.        Vdb
34270 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52  eComment((v, "GR
34280 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 20  OUP BY sort")); 
34290 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
342a0 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
342b0 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20  o.useSortingIdx 
342c0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 1;.        sql
342d0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
342e0 61 72 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20  ar(pParse);..   
342f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
34300 66 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20 74  f the index or t
34310 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 75  emporary table u
34320 73 65 64 20 62 79 20 74 68 65 20 47 52 4f 55 50  sed by the GROUP
34330 20 42 59 20 73 6f 72 74 0a 20 20 20 20 20 20 2a   BY sort.      *
34340 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79  * will naturally
34350 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e   deliver rows in
34360 20 74 68 65 20 6f 72 64 65 72 20 72 65 71 75 69   the order requi
34370 72 65 64 20 62 79 20 74 68 65 20 4f 52 44 45 52  red by the ORDER
34380 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61   BY.      ** cla
34390 75 73 65 2c 20 63 61 6e 63 65 6c 20 74 68 65 20  use, cancel the 
343a0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
343b0 6f 70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c 69  open coded earli
343c0 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  er..      **.   
343d0 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 6e     ** This is an
343e0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20   optimization - 
343f0 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
34400 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74  er should result
34410 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20   regardless..   
34420 20 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51     ** Use the SQ
34430 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65  LITE_GroupByOrde
34440 72 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49  r flag with SQLI
34450 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
34460 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20 20 20 20  MIZER to .      
34470 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 69 73 20  ** disable this 
34480 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
34490 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
344a0 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  s.  */.      if(
344b0 20 6f 72 64 65 72 42 79 47 72 70 20 26 26 20 4f   orderByGrp && O
344c0 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
344d0 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72  ed(db, SQLITE_Gr
344e0 6f 75 70 42 79 4f 72 64 65 72 29 20 0a 20 20 20  oupByOrder) .   
344f0 20 20 20 20 26 26 20 28 67 72 6f 75 70 42 79 53      && (groupByS
34500 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65 33 57 68  ort || sqlite3Wh
34510 65 72 65 49 73 53 6f 72 74 65 64 28 70 57 49 6e  ereIsSorted(pWIn
34520 66 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  fo)).      ){.  
34530 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
34540 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
34550 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
34560 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f  ngeToNoop(v, sSo
34570 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
34580 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
34590 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
345a0 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
345b0 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f  BY terms and sto
345c0 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32  re in b0, b1, b2
345d0 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30  ....      ** (b0
345e0 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74   is memory locat
345f0 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20  ion iBMem+0, b1 
34600 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20  is iBMem+1, and 
34610 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20  so forth).      
34620 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20  ** Then compare 
34630 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
34640 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e  P BY terms again
34650 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  st the GROUP BY 
34660 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66  terms.      ** f
34670 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
34680 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73   row currently s
34690 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c  tored in a0, a1,
346a0 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a   a2....      */.
346b0 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c        addrTopOfL
346c0 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
346d0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
346e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
346f0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
34700 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rse);.      if( 
34710 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
34720 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
34730 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
34740 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67 67 49  orterData, sAggI
34750 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a  nfo.sortingIdx,.
34760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34770 20 20 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75            sortOu
34780 74 2c 20 73 6f 72 74 50 54 61 62 29 3b 0a 20 20  t, sortPTab);.  
34790 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
347a0 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d  j=0; j<pGroupBy-
347b0 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
347c0 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
347d0 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
347e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
347f0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
34800 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20  n, sortPTab, j, 
34810 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20  iBMem+j);.      
34820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34830 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65     sAggInfo.dire
34840 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20  ctMode = 1;.    
34850 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
34860 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47  rCode(pParse, pG
34870 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78  roupBy->a[j].pEx
34880 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20  pr, iBMem+j);.  
34890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
348a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
348b0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
348c0 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42  mpare, iAMem, iB
348d0 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  Mem, pGroupBy->n
348e0 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
348f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34900 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65  (char*)sqlite3Ke
34910 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66  yInfoRef(pKeyInf
34920 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  o), P4_KEYINFO);
34930 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73  .      addr1 = s
34940 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
34950 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
34960 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34970 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
34980 64 72 31 2b 31 2c 20 30 2c 20 61 64 64 72 31 2b  dr1+1, 0, addr1+
34990 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
349a0 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  (v);..      /* G
349b0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
349c0 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20  t runs whenever 
349d0 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 68 61  the GROUP BY cha
349e0 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43  nges..      ** C
349f0 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52  hanges in the GR
34a00 4f 55 50 20 42 59 20 61 72 65 20 64 65 74 65 63  OUP BY are detec
34a10 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69  ted by the previ
34a20 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a  ous code.      *
34a30 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65  * block.  If the
34a40 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67  re were no chang
34a50 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69  es, this block i
34a60 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20  s skipped..     
34a70 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69   **.      ** Thi
34a80 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75  s code copies cu
34a90 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74  rrent group by t
34aa0 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32  erms in b0,b1,b2
34ab0 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76  ,....      ** ov
34ac0 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20  er to a0,a1,a2. 
34ad0 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74   It then calls t
34ae0 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  he output subrou
34af0 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e  tine.      ** an
34b00 64 20 72 65 73 65 74 73 20 74 68 65 20 61 67 67  d resets the agg
34b10 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
34b20 6f 72 20 72 65 67 69 73 74 65 72 73 20 69 6e 20  or registers in 
34b30 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20  preparation.    
34b40 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78    ** for the nex
34b50 74 20 47 52 4f 55 50 20 42 59 20 62 61 74 63 68  t GROUP BY batch
34b60 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
34b70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
34b80 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d  Move(pParse, iBM
34b90 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75  em, iAMem, pGrou
34ba0 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  pBy->nExpr);.   
34bb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34bc0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
34bd0 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20  , regOutputRow, 
34be0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
34bf0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
34c00 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e  t((v, "output on
34c10 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20  e row"));.      
34c20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34c30 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  2(v, OP_IfPos, i
34c40 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45  AbortFlag, addrE
34c50 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  nd); VdbeCoverag
34c60 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
34c70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65  Comment((v, "che
34c80 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  ck abort flag"))
34c90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
34ca0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
34cb0 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c  Gosub, regReset,
34cc0 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20   addrReset);.   
34cd0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
34ce0 76 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d 75  v, "reset accumu
34cf0 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  lator"));..     
34d00 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
34d10 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
34d20 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74  ators based on t
34d30 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20  he content of.  
34d40 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
34d50 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a  nt row.      */.
34d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34d70 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
34d80 72 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74  r1);.      updat
34d90 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
34da0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
34db0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
34dc0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
34dd0 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46  nteger, 1, iUseF
34de0 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
34df0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
34e00 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63  icate data in ac
34e10 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
34e20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74       /* End of t
34e30 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f  he loop.      */
34e40 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70  .      if( group
34e50 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
34e60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34e70 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
34e80 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Next, sAggInfo.s
34e90 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54  ortingIdx, addrT
34ea0 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  opOfLoop);.     
34eb0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
34ec0 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
34ed0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34ee0 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
34ef0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
34f00 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
34f10 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67  p(v, addrSorting
34f20 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Idx);.      }.. 
34f30 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74       /* Output t
34f40 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20  he final row of 
34f50 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a  result.      */.
34f60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34f70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
34f80 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  sub, regOutputRo
34f90 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  w, addrOutputRow
34fa0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
34fb0 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
34fc0 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a   final row"));..
34fd0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76        /* Jump ov
34fe0 65 72 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  er the subroutin
34ff0 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  es.      */.    
35000 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
35010 6f 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a  o(v, addrEnd);..
35020 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
35030 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
35040 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69  hat outputs a si
35050 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
35060 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
35070 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f  set.  This subro
35080 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b  utine first look
35090 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61  s at the iUseFla
350a0 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a  g.  If iUseFlag.
350b0 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73        ** is less
350c0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
350d0 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72  o zero, the subr
350e0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
350f0 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20  p.  If.      ** 
35100 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63  the processing c
35110 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65  alls for the que
35120 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69  ry to abort, thi
35130 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  s subroutine.   
35140 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73     ** increments
35150 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20   the iAbortFlag 
35160 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
35170 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
35180 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64   in.      ** ord
35190 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65  er to signal the
351a0 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74   caller to abort
351b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
351c0 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20   addrSetAbort = 
351d0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
351e0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
351f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
35200 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
35210 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29  , 1, iAbortFlag)
35220 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
35230 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f  ent((v, "set abo
35240 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
35250 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
35260 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
35270 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
35280 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
35290 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
352a0 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
352b0 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70  ;.      addrOutp
352c0 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  utRow = sqlite3V
352d0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
352e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
352f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
35300 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67  _IfPos, iUseFlag
35310 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
35320 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  2);.      VdbeCo
35330 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
35340 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
35350 20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74   "Groupby result
35360 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79   generator entry
35370 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20   point"));.     
35380 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
35390 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
353a0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
353b0 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
353c0 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
353d0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
353e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
353f0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
35400 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74  pHaving, addrOut
35410 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45  putRow+1, SQLITE
35420 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
35430 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
35440 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d  oop(pParse, p, -
35450 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20 20 20  1, &sSort,.     
35460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35470 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65   &sDistinct, pDe
35480 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
35490 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75            addrOu
354a0 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53  tputRow+1, addrS
354b0 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20  etAbort);.      
354c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
354d0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
354e0 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
354f0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
35500 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62  ((v, "end groupb
35510 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
35520 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
35530 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
35540 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
35550 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70   reset the group
35560 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a  -by accumulator.
35570 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
35580 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
35590 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65  eLabel(v, addrRe
355a0 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65  set);.      rese
355b0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
355c0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
355d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
355e0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
355f0 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29  eturn, regReset)
35600 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a  ;.     .    } /*
35610 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e   endif pGroupBy.
35620 20 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74    Begin aggregat
35630 65 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75  e queries withou
35640 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20  t GROUP BY: */. 
35650 20 20 20 65 6c 73 65 20 7b 0a 23 69 66 6e 64 65     else {.#ifnde
35660 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54  f SQLITE_OMIT_BT
35670 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54  REECOUNT.      T
35680 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
35690 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 69 73    if( (pTab = is
356a0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26  SimpleCount(p, &
356b0 73 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b  sAggInfo))!=0 ){
356c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69  .        /* If i
356d0 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72  sSimpleCount() r
356e0 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
356f0 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75   to a Table stru
35700 63 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20  cture, then.    
35710 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73      ** the SQL s
35720 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74  tatement is of t
35730 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20  he form:.       
35740 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
35750 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
35760 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20   FROM <tbl>.    
35770 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
35780 2a 20 77 68 65 72 65 20 74 68 65 20 54 61 62 6c  * where the Tabl
35790 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75  e structure retu
357a0 72 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73 20  rned represents 
357b0 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20  table <tbl>..   
357c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
357d0 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  ** This statemen
357e0 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74  t is so common t
357f0 68 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69  hat it is optimi
35800 7a 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54  zed specially. T
35810 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50  he.        ** OP
35820 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69  _Count instructi
35830 6f 6e 20 69 73 20 65 78 65 63 75 74 65 64 20 65  on is executed e
35840 69 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74  ither on the int
35850 6b 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20  key table that. 
35860 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
35870 6e 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  ns the data for 
35880 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f  table <tbl> or o
35890 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64  n one of its ind
358a0 65 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20  exes. It.       
358b0 20 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f   ** is better to
358c0 20 65 78 65 63 75 74 65 20 74 68 65 20 6f 70 20   execute the op 
358d0 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20  on an index, as 
358e0 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f  indexes are almo
358f0 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  st.        ** al
35900 77 61 79 73 20 73 70 72 65 61 64 20 61 63 72 6f  ways spread acro
35910 73 73 20 6c 65 73 73 20 70 61 67 65 73 20 74 68  ss less pages th
35920 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73 70  an their corresp
35930 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20  onding tables.. 
35940 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
35950 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20    const int iDb 
35960 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
35970 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
35980 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
35990 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  );.        const
359a0 20 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72   int iCsr = pPar
359b0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
359c0 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61  /* Cursor to sca
359d0 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20  n b-tree */.    
359e0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
359f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a00 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
35a10 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
35a20 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
35a30 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20   *pKeyInfo = 0; 
35a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35a50 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61   Keyinfo for sca
35a60 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20  nned index */.  
35a70 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65        Index *pBe
35a80 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
35a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
35aa0 73 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73  st index found s
35ab0 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
35ac0 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61   int iRoot = pTa
35ad0 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  b->tnum;        
35ae0 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
35af0 67 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d  ge of scanned b-
35b00 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  tree */..       
35b10 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
35b20 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
35b30 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   iDb);.        s
35b40 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
35b50 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
35b60 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
35b70 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20  ->zName);..     
35b80 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
35b90 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   the index that 
35ba0 68 61 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73  has the lowest s
35bb0 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20  can cost..      
35bc0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
35bd0 28 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20  (2011-04-15) Do 
35be0 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63  not do a full sc
35bf0 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72  an of an unorder
35c00 65 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ed index..      
35c10 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
35c20 28 32 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20  (2013-10-03) Do 
35c30 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e  not count the en
35c40 74 72 69 65 73 20 69 6e 20 61 20 70 61 72 74 69  tries in a parti
35c50 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  al index..      
35c60 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
35c70 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20  In practice the 
35c80 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
35c90 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  e will not be us
35ca0 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a  ed. It is only .
35cb0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65          ** passe
35cc0 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65  d to keep OP_Ope
35cd0 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20  nRead happy..   
35ce0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
35cf0 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
35d00 61 62 29 20 29 20 70 42 65 73 74 20 3d 20 73 71  ab) ) pBest = sq
35d10 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
35d20 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
35d30 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
35d40 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
35d50 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
35d60 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t){.          if
35d70 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72  ( pIdx->bUnorder
35d80 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ed==0.          
35d90 20 26 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52   && pIdx->szIdxR
35da0 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  ow<pTab->szTabRo
35db0 77 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  w.           && 
35dc0 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
35dd0 65 72 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ere==0.         
35de0 20 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20    && (!pBest || 
35df0 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70  pIdx->szIdxRow<p
35e00 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a  Best->szIdxRow).
35e10 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
35e20 20 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d           pBest =
35e30 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20   pIdx;.         
35e40 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
35e50 20 20 20 20 20 69 66 28 20 70 42 65 73 74 20 29       if( pBest )
35e60 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f  {.          iRoo
35e70 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b  t = pBest->tnum;
35e80 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49  .          pKeyI
35e90 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
35ea0 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72  InfoOfIndex(pPar
35eb0 73 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20  se, pBest);.    
35ec0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
35ed0 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e  * Open a read-on
35ee0 6c 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75  ly cursor, execu
35ef0 74 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c  te the OP_Count,
35f00 20 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f   close the curso
35f10 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  r. */.        sq
35f20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
35f30 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  nt(v, OP_OpenRea
35f40 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20  d, iCsr, iRoot, 
35f50 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  iDb, 1);.       
35f60 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
35f70 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
35f80 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
35f90 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b  , -1, (char *)pK
35fa0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
35fb0 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  FO);.        }. 
35fc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
35fd0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
35fe0 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67  ount, iCsr, sAgg
35ff0 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d  Info.aFunc[0].iM
36000 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
36010 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
36020 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72  , OP_Close, iCsr
36030 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61  );.        expla
36040 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50  inSimpleCount(pP
36050 61 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73  arse, pTab, pBes
36060 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  t);.      }else.
36070 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
36080 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
36090 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20   */.      {.    
360a0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
360b0 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67   runs if the agg
360c0 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52  regate has no GR
360d0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
360e0 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  The.        ** p
360f0 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63  rocessing is muc
36100 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20  h simpler since 
36110 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20  there is only a 
36120 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20  single row.     
36130 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e     ** of output.
36140 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
36150 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
36160 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20  GroupBy==0 );.  
36170 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
36180 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
36190 73 41 67 67 49 6e 66 6f 29 3b 0a 0a 20 20 20 20  sAggInfo);..    
361a0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 71      /* If this q
361b0 75 65 72 79 20 69 73 20 61 20 63 61 6e 64 69 64  uery is a candid
361c0 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f  ate for the min/
361d0 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  max optimization
361e0 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a  , then.        *
361f0 2a 20 6d 69 6e 4d 61 78 46 6c 61 67 20 77 69 6c  * minMaxFlag wil
36200 6c 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 76  l have been prev
36210 69 6f 75 73 6c 79 20 73 65 74 20 74 6f 20 65 69  iously set to ei
36220 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ther.        ** 
36230 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
36240 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52  N or WHERE_ORDER
36250 42 59 5f 4d 41 58 20 61 6e 64 20 70 4d 69 6e 4d  BY_MAX and pMinM
36260 61 78 4f 72 64 65 72 42 79 20 77 69 6c 6c 0a 20  axOrderBy will. 
36270 20 20 20 20 20 20 20 2a 2a 20 62 65 20 61 6e 20         ** be an 
36280 61 70 70 72 6f 70 72 69 61 74 65 20 4f 52 44 45  appropriate ORDE
36290 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20  R BY expression 
362a0 66 6f 72 20 74 68 65 20 6f 70 74 69 6d 69 7a 61  for the optimiza
362b0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tion..        */
362c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
362d0 20 6d 69 6e 4d 61 78 46 6c 61 67 3d 3d 57 48 45   minMaxFlag==WHE
362e0 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
362f0 4c 20 7c 7c 20 70 4d 69 6e 4d 61 78 4f 72 64 65  L || pMinMaxOrde
36300 72 42 79 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy!=0 );.      
36310 20 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61    assert( pMinMa
36320 78 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  xOrderBy==0 || p
36330 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 2d 3e 6e  MinMaxOrderBy->n
36340 45 78 70 72 3d 3d 31 20 29 3b 0a 0a 20 20 20 20  Expr==1 );..    
36350 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
36360 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 57 68 65  1,pParse,p,("Whe
36370 72 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20 20  reBegin\n"));.  
36380 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
36390 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
363a0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
363b0 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d  t, pWhere, pMinM
363c0 61 78 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20  axOrderBy,.     
363d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
363e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
363f0 20 6d 69 6e 4d 61 78 46 6c 61 67 2c 20 30 29 3b   minMaxFlag, 0);
36400 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49  .        if( pWI
36410 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
36420 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
36430 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
36440 20 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63         updateAcc
36450 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
36460 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
36470 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
36480 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
36490 57 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20  WInfo)>0 ){.    
364a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
364b0 65 47 6f 74 6f 28 76 2c 20 73 71 6c 69 74 65 33  eGoto(v, sqlite3
364c0 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28  WhereBreakLabel(
364d0 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20  pWInfo));.      
364e0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
364f0 28 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64  (v, "%s() by ind
36500 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ex",.           
36510 20 20 20 20 20 28 6d 69 6e 4d 61 78 46 6c 61 67       (minMaxFlag
36520 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  ==WHERE_ORDERBY_
36530 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29  MIN?"min":"max")
36540 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
36550 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
36560 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
36570 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41         finalizeA
36580 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
36590 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
365a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
365b0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
365c0 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
365d0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
365e0 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
365f0 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  rEnd, SQLITE_JUM
36600 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
36610 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
36620 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 30  pParse, p, -1, 0
36630 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
36640 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73              pDes
36650 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72  t, addrEnd, addr
36660 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  End);.    }.    
36670 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
36680 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45  veLabel(v, addrE
36690 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a  nd);.    .  } /*
366a0 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65   endif aggregate
366b0 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28   query */..  if(
366c0 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
366d0 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
366e0 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
366f0 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
36700 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22  pTable(pParse, "
36710 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a  DISTINCT");.  }.
36720 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
36730 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
36740 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65  ause, then we ne
36750 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72  ed to sort the r
36760 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20  esults.  ** and 
36770 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65  send them to the
36780 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79   callback one by
36790 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   one..  */.  if(
367a0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
367b0 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65  ){.    explainTe
367c0 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 0a  mpTable(pParse,.
367d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
367e0 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61       sSort.nOBSa
367f0 74 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41 52  t>0 ? "RIGHT PAR
36800 54 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22  T OF ORDER BY":"
36810 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20  ORDER BY");.    
36820 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
36830 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f  (pParse, p, &sSo
36840 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rt, pEList->nExp
36850 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a  r, pDest);.  }..
36860 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
36870 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72  o skip this quer
36880 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
36890 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
368a0 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a  (v, iEnd);..  /*
368b0 20 54 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   The SELECT has 
368c0 62 65 65 6e 20 63 6f 64 65 64 2e 20 49 66 20 74  been coded. If t
368d0 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72  here is an error
368e0 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74   in the Parse st
368f0 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65  ructure,.  ** se
36900 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
36910 65 20 74 6f 20 31 2e 20 4f 74 68 65 72 77 69 73  e to 1. Otherwis
36920 65 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28  e 0. */.  rc = (
36930 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b  pParse->nErr>0);
36940 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
36950 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
36960 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
36970 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
36980 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
36990 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
369a0 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
369b0 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  /.select_end:.  
369c0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
369d0 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  r(pParse->iSelec
369e0 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c  tId, iRestoreSel
369f0 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65  ectId);.  sqlite
36a00 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
36a10 64 62 2c 20 70 4d 69 6e 4d 61 78 4f 72 64 65 72  db, pMinMaxOrder
36a20 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  By);.  sqlite3Db
36a30 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66  Free(db, sAggInf
36a40 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  o.aCol);.  sqlit
36a50 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67  e3DbFree(db, sAg
36a60 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 23 69  gInfo.aFunc);.#i
36a70 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
36a80 41 42 4c 45 44 0a 20 20 53 45 4c 45 43 54 54 52  ABLED.  SELECTTR
36a90 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(1,pParse,p,(
36aa0 22 65 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 5c  "end processing\
36ab0 6e 22 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  n"));.#endif.  r
36ac0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a              eturn rc;.}.