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

Artifact 69ed6ca9d1bf4adb41472b0740b7b90868438dedcdd5ab2fd608070eca30d073:


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 0a 2a 2a 20 54  .  } .}../*.** T
3060: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63  his routine proc
3070: 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69  esses the join i
3080: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
3090: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
30a0: 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49  t..** ON and USI
30b0: 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63  NG clauses are c
30c0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78  onverted into ex
30d0: 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65  tra terms of the
30e0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
30f0: 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20  * NATURAL joins 
3100: 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72  also create extr
3110: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
3120: 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  erms..**.** The 
3130: 74 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20  terms of a FROM 
3140: 63 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61  clause are conta
3150: 69 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65  ined in the Sele
3160: 63 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72  ct.pSrc structur
3170: 65 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d  e..** The left m
3180: 6f 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65  ost table is the
3190: 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
31a0: 53 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68  Select.pSrc.  Th
31b0: 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20  e right-most.** 
31c0: 74 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73  table is the las
31d0: 74 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f  t entry.  The jo
31e0: 69 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68  in operator is h
31f0: 65 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79  eld in the entry
3200: 20 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e   to.** the left.
3210: 20 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63    Thus entry 0 c
3220: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e  ontains the join
3230: 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68   operator for th
3240: 65 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a  e join between.*
3250: 2a 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20  * entries 0 and 
3260: 31 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53  1.  Any ON or US
3270: 49 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f  ING clauses asso
3280: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
3290: 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f  join are.** also
32a0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
32b0: 20 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a   left entry..**.
32c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
32d0: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
32e0: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63  er of errors enc
32f0: 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61  ountered..*/.sta
3300: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72  tic int sqlitePr
3310: 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20  ocessJoin(Parse 
3320: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
3330: 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  *p){.  SrcList *
3340: 70 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  pSrc;           
3350: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61         /* All ta
3360: 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
3370: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
3380: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
3390: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33a0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
33b0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
33c0: 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20  t_item *pLeft;  
33d0: 20 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65     /* Left table
33e0: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
33f0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
3400: 74 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20  t_item *pRight; 
3410: 20 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c     /* Right tabl
3420: 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a  e being joined *
3430: 2f 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  /..  pSrc = p->p
3440: 53 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26  Src;.  pLeft = &
3450: 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52  pSrc->a[0];.  pR
3460: 69 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d  ight = &pLeft[1]
3470: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
3480: 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b  Src->nSrc-1; i++
3490: 2c 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66  , pRight++, pLef
34a0: 74 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  t++){.    Table 
34b0: 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69  *pRightTab = pRi
34c0: 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  ght->pTab;.    i
34d0: 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20  nt isOuter;..   
34e0: 20 69 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74   if( NEVER(pLeft
34f0: 2d 3e 70 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69  ->pTab==0 || pRi
3500: 67 68 74 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e  ghtTab==0) ) con
3510: 74 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f 75 74  tinue;.    isOut
3520: 65 72 20 3d 20 28 70 52 69 67 68 74 2d 3e 66 67  er = (pRight->fg
3530: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
3540: 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f  UTER)!=0;..    /
3550: 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52  * When the NATUR
3560: 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  AL keyword is pr
3570: 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45  esent, add WHERE
3580: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f   clause terms fo
3590: 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63  r.    ** every c
35a0: 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74  olumn that the t
35b0: 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  wo tables have i
35c0: 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f  n common..    */
35d0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
35e0: 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
35f0: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
3600: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3610: 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55  On || pRight->pU
3620: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  sing ){.        
3630: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3640: 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52  pParse, "a NATUR
3650: 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20  AL join may not 
3660: 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20  have ".         
3670: 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e    "an ON or USIN
3680: 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20  G clause", 0);. 
3690: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
36a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
36b0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74  or(j=0; j<pRight
36c0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
36d0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
36e0: 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
36f0: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  of column in the
3700: 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a   right table */.
3710: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
3720: 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69  t;     /* Matchi
3730: 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f  ng left table */
3740: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
3750: 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68  ftCol;  /* Match
3760: 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  ing column in th
3770: 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  e left table */.
3780: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
3790: 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c   pRightTab->aCol
37a0: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
37b0: 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43     if( tableAndC
37c0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c  olumnIndex(pSrc,
37d0: 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c   i+1, zName, &iL
37e0: 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20  eft, &iLeftCol) 
37f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
3800: 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65  WhereTerm(pParse
3810: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
3820: 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c  LeftCol, i+1, j,
3830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3840: 20 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c          isOuter,
3850: 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20   &p->pWhere);.  
3860: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3870: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
3880: 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61  sallow both ON a
3890: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
38a0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
38b0: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  n.    */.    if(
38c0: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20   pRight->pOn && 
38d0: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
38e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
38f0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3900: 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74  "cannot have bot
3910: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22  h ON and USING "
3920: 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65  .        "clause
3930: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
3940: 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  in");.      retu
3950: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
3960: 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63   /* Add the ON c
3970: 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64  lause to the end
3980: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
3990: 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20  ause, connected 
39a0: 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44  by.    ** an AND
39b0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
39c0: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
39d0: 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  ->pOn ){.      i
39e0: 66 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74  f( isOuter ) set
39f0: 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d  JoinExpr(pRight-
3a00: 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43  >pOn, pRight->iC
3a10: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d  ursor);.      p-
3a20: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
3a30: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
3a40: 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  >db, p->pWhere, 
3a50: 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20  pRight->pOn);.  
3a60: 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20      pRight->pOn 
3a70: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
3a80: 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20  /* Create extra 
3a90: 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45  terms on the WHE
3aa0: 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61  RE clause for ea
3ab0: 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a  ch column named.
3ac0: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53      ** in the US
3ad0: 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61  ING clause.  Exa
3ae0: 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f  mple: If the two
3af0: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3b00: 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a  ined are .    **
3b10: 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65   A and B and the
3b20: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61   USING clause na
3b30: 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c  mes X, Y, and Z,
3b40: 20 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20   then add this. 
3b50: 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45     ** to the WHE
3b60: 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e  RE clause:    A.
3b70: 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e  X=B.X AND A.Y=B.
3b80: 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20  Y AND A.Z=B.Z.  
3b90: 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65    ** Report an e
3ba0: 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75  rror if any colu
3bb0: 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  mn mentioned in 
3bc0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3bd0: 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63   is.    ** not c
3be0: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68  ontained in both
3bf0: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3c00: 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ined..    */.   
3c10: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73   if( pRight->pUs
3c20: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c  ing ){.      IdL
3c30: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69  ist *pList = pRi
3c40: 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20  ght->pUsing;.   
3c50: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
3c60: 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a  ist->nId; j++){.
3c70: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
3c80: 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame;     /* Name
3c90: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20   of the term in 
3ca0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3cb0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3cc0: 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20  iLeft;       /* 
3cd0: 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66  Table on the lef
3ce0: 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20  t with matching 
3cf0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
3d00: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
3d10: 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col;    /* Colum
3d20: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  n number of matc
3d30: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74  hing column on t
3d40: 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20  he left */.     
3d50: 20 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c     int iRightCol
3d60: 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75  ;   /* Column nu
3d70: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67  mber of matching
3d80: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72   column on the r
3d90: 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ight */..       
3da0: 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e   zName = pList->
3db0: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
3dc0: 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20      iRightCol = 
3dd0: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67  columnIndex(pRig
3de0: 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  htTab, zName);. 
3df0: 20 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68         if( iRigh
3e00: 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20  tCol<0.         
3e10: 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75  || !tableAndColu
3e20: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b  mnIndex(pSrc, i+
3e30: 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74  1, zName, &iLeft
3e40: 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20  , &iLeftCol).   
3e50: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
3e60: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3e70: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
3e80: 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c  t join using col
3e90: 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20  umn %s - column 
3ea0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e  ".            "n
3eb0: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f  ot present in bo
3ec0: 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d  th tables", zNam
3ed0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
3ee0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
3ef0: 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65  }.        addWhe
3f00: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  reTerm(pParse, p
3f10: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66  Src, iLeft, iLef
3f20: 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68  tCol, i+1, iRigh
3f30: 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tCol,.          
3f40: 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74             isOut
3f50: 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b  er, &p->pWhere);
3f60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3f70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
3f80: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
3f90: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
3fa0: 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66   KeyInfo *keyInf
3fb0: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  oFromExprList(. 
3fc0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
3fd0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
3fe0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
3ff0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
4000: 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b     /* Form the K
4010: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72  eyInfo object fr
4020: 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74  om this ExprList
4030: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
4040: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
4050: 67 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f  gin with this co
4060: 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f  lumn of pList */
4070: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20  .  int nExtra   
4080: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
4090: 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63  his many extra c
40a0: 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e  olumns to the en
40b0: 64 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47  d */.);../*.** G
40c0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
40d0: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
40e0: 72 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74  record in regist
40f0: 65 72 73 20 72 65 67 44 61 74 61 0a 2a 2a 20 74  ers regData.** t
4100: 68 72 6f 75 67 68 20 72 65 67 44 61 74 61 2b 6e  hrough regData+n
4110: 44 61 74 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20  Data-1 onto the 
4120: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
4130: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
4140: 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a  orter(.  Parse *
4150: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
4160: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
4170: 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  t */.  SortCtx *
4180: 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 2f 2a  pSort,        /*
4190: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
41a0: 75 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ut the ORDER BY 
41b0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65  clause */.  Sele
41c0: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20  ct *pSelect,    
41d0: 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20     /* The whole 
41e0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
41f0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74   */.  int regDat
4200: 61 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a,           /* 
4210: 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68  First register h
4220: 6f 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62  olding data to b
4230: 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e  e sorted */.  in
4240: 74 20 72 65 67 4f 72 69 67 44 61 74 61 2c 20 20  t regOrigData,  
4250: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65       /* First re
4260: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
4270: 61 74 61 20 62 65 66 6f 72 65 20 70 61 63 6b 69  ata before packi
4280: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74  ng */.  int nDat
4290: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a,             /
42a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
42b0: 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61  ents in the data
42c0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
42d0: 6e 50 72 65 66 69 78 52 65 67 20 20 20 20 20 20  nPrefixReg      
42e0: 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67     /* No. of reg
42f0: 20 70 72 69 6f 72 20 74 6f 20 72 65 67 44 61 74   prior to regDat
4300: 61 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  a available for 
4310: 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  use */.){.  Vdbe
4320: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
4330: 64 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  dbe;            
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4350: 53 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  Stmt under const
4360: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
4370: 20 62 53 65 71 20 3d 20 28 28 70 53 6f 72 74 2d   bSeq = ((pSort-
4380: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
4390: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29  TFLAG_UseSorter)
43a0: 3d 3d 30 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70  ==0);.  int nExp
43b0: 72 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65  r = pSort->pOrde
43c0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20  rBy->nExpr;     
43d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20           /* No. 
43e0: 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
43f0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65  s */.  int nBase
4400: 20 3d 20 6e 45 78 70 72 20 2b 20 62 53 65 71 20   = nExpr + bSeq 
4410: 2b 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20  + nData;        
4420: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64          /* Field
4430: 73 20 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f  s in sorter reco
4440: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42  rd */.  int regB
4450: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4470: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 73           /* Regs
4480: 20 66 6f 72 20 73 6f 72 74 65 72 20 72 65 63 6f   for sorter reco
4490: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  rd */.  int regR
44a0: 65 63 6f 72 64 20 3d 20 2b 2b 70 50 61 72 73 65  ecord = ++pParse
44b0: 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  ->nMem;         
44c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65           /* Asse
44d0: 6d 62 6c 65 64 20 73 6f 72 74 65 72 20 72 65 63  mbled sorter rec
44e0: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42  ord */.  int nOB
44f0: 53 61 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42  Sat = pSort->nOB
4500: 53 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sat;            
4510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44            /* ORD
4520: 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 73  ER BY terms to s
4530: 6b 69 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  kip */.  int op;
4540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4550: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4560: 70 63 6f 64 65 20 74 6f 20 61 64 64 20 73 6f 72  pcode to add sor
4570: 74 65 72 20 72 65 63 6f 72 64 20 74 6f 20 73 6f  ter record to so
4580: 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rter */.  int iL
4590: 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  imit;           
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
45b0: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f  LIMIT counter */
45c0: 0a 0a 20 20 61 73 73 65 72 74 28 20 62 53 65 71  ..  assert( bSeq
45d0: 3d 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31 20 29  ==0 || bSeq==1 )
45e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 44 61 74  ;.  assert( nDat
45f0: 61 3d 3d 31 20 7c 7c 20 72 65 67 44 61 74 61 3d  a==1 || regData=
4600: 3d 72 65 67 4f 72 69 67 44 61 74 61 20 7c 7c 20  =regOrigData || 
4610: 72 65 67 4f 72 69 67 44 61 74 61 3d 3d 30 20 29  regOrigData==0 )
4620: 3b 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 52  ;.  if( nPrefixR
4630: 65 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  eg ){.    assert
4640: 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 6e 45  ( nPrefixReg==nE
4650: 78 70 72 2b 62 53 65 71 20 29 3b 0a 20 20 20 20  xpr+bSeq );.    
4660: 72 65 67 42 61 73 65 20 3d 20 72 65 67 44 61 74  regBase = regDat
4670: 61 20 2d 20 6e 45 78 70 72 20 2d 20 62 53 65 71  a - nExpr - bSeq
4680: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
4690: 65 67 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d  egBase = pParse-
46a0: 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 70  >nMem + 1;.    p
46b0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
46c0: 42 61 73 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Base;.  }.  asse
46d0: 72 74 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66  rt( pSelect->iOf
46e0: 66 73 65 74 3d 3d 30 20 7c 7c 20 70 53 65 6c 65  fset==0 || pSele
46f0: 63 74 2d 3e 69 4c 69 6d 69 74 21 3d 30 20 29 3b  ct->iLimit!=0 );
4700: 0a 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c  .  iLimit = pSel
4710: 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70  ect->iOffset ? p
4720: 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b  Select->iOffset+
4730: 31 20 3a 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69  1 : pSelect->iLi
4740: 6d 69 74 3b 0a 20 20 70 53 6f 72 74 2d 3e 6c 61  mit;.  pSort->la
4750: 62 65 6c 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65  belDone = sqlite
4760: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
4770: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
4780: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
4790: 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64  rse, pSort->pOrd
47a0: 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c 20 72  erBy, regBase, r
47b0: 65 67 4f 72 69 67 44 61 74 61 2c 0a 20 20 20 20  egOrigData,.    
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47d0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45        SQLITE_ECE
47e0: 4c 5f 44 55 50 20 7c 20 28 72 65 67 4f 72 69 67  L_DUP | (regOrig
47f0: 44 61 74 61 3f 20 53 51 4c 49 54 45 5f 45 43 45  Data? SQLITE_ECE
4800: 4c 5f 52 45 46 20 3a 20 30 29 29 3b 0a 20 20 69  L_REF : 0));.  i
4810: 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20 73  f( bSeq ){.    s
4820: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4830: 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c  (v, OP_Sequence,
4840: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
4850: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29  , regBase+nExpr)
4860: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 72 65  ;.  }.  if( nPre
4870: 66 69 78 52 65 67 3d 3d 30 20 26 26 20 6e 44 61  fixReg==0 && nDa
4880: 74 61 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ta>0 ){.    sqli
4890: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
48a0: 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61 2c  pParse, regData,
48b0: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b 62   regBase+nExpr+b
48c0: 53 65 71 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d  Seq, nData);.  }
48d0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
48e0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
48f0: 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2b 6e  ecord, regBase+n
4900: 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42  OBSat, nBase-nOB
4910: 53 61 74 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Sat, regRecord);
4920: 0a 20 20 69 66 28 20 6e 4f 42 53 61 74 3e 30 20  .  if( nOBSat>0 
4930: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 50 72  ){.    int regPr
4940: 65 76 4b 65 79 3b 20 20 20 2f 2a 20 54 68 65 20  evKey;   /* The 
4950: 66 69 72 73 74 20 6e 4f 42 53 61 74 20 63 6f 6c  first nOBSat col
4960: 75 6d 6e 73 20 6f 66 20 74 68 65 20 70 72 65 76  umns of the prev
4970: 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20  ious row */.    
4980: 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b 20 20  int addrFirst;  
4990: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
49a0: 74 68 65 20 4f 50 5f 49 66 4e 6f 74 20 6f 70 63  the OP_IfNot opc
49b0: 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  ode */.    int a
49c0: 64 64 72 4a 6d 70 3b 20 20 20 20 20 20 2f 2a 20  ddrJmp;      /* 
49d0: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  Address of the O
49e0: 50 5f 4a 75 6d 70 20 6f 70 63 6f 64 65 20 2a 2f  P_Jump opcode */
49f0: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
4a00: 3b 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65  ;      /* Opcode
4a10: 20 74 68 61 74 20 6f 70 65 6e 73 20 74 68 65 20   that opens the 
4a20: 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  sorter */.    in
4a30: 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20  t nKey;         
4a40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6f 72  /* Number of sor
4a50: 74 69 6e 67 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  ting key columns
4a60: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 4f 50 5f 53  , including OP_S
4a70: 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 4b  equence */.    K
4a80: 65 79 49 6e 66 6f 20 2a 70 4b 49 3b 20 20 20 20  eyInfo *pKI;    
4a90: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 4b 65 79   /* Original Key
4aa0: 49 6e 66 6f 20 6f 6e 20 74 68 65 20 73 6f 72 74  Info on the sort
4ab0: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  er table */..   
4ac0: 20 72 65 67 50 72 65 76 4b 65 79 20 3d 20 70 50   regPrevKey = pP
4ad0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
4ae0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
4af0: 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  = pSort->nOBSat;
4b00: 0a 20 20 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70  .    nKey = nExp
4b10: 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  r - pSort->nOBSa
4b20: 74 20 2b 20 62 53 65 71 3b 0a 20 20 20 20 69 66  t + bSeq;.    if
4b30: 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20 20 20  ( bSeq ){.      
4b40: 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
4b50: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
4b60: 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61   OP_IfNot, regBa
4b70: 73 65 2b 6e 45 78 70 72 29 3b 20 0a 20 20 20 20  se+nExpr); .    
4b80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64  }else{.      add
4b90: 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
4ba0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
4bb0: 5f 53 65 71 75 65 6e 63 65 54 65 73 74 2c 20 70  _SequenceTest, p
4bc0: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
4bd0: 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65 43  .    }.    VdbeC
4be0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
4bf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4c00: 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  3(v, OP_Compare,
4c10: 20 72 65 67 50 72 65 76 4b 65 79 2c 20 72 65 67   regPrevKey, reg
4c20: 42 61 73 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42  Base, pSort->nOB
4c30: 53 61 74 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20  Sat);.    pOp = 
4c40: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
4c50: 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64 64 72 53  (v, pSort->addrS
4c60: 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 69  ortIndex);.    i
4c70: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
4c80: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
4c90: 74 75 72 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  turn;.    pOp->p
4ca0: 32 20 3d 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61  2 = nKey + nData
4cb0: 3b 0a 20 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d  ;.    pKI = pOp-
4cc0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  >p4.pKeyInfo;.  
4cd0: 20 20 6d 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53    memset(pKI->aS
4ce0: 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49  ortOrder, 0, pKI
4cf0: 2d 3e 6e 4b 65 79 46 69 65 6c 64 29 3b 20 2f 2a  ->nKeyField); /*
4d00: 20 4d 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 74   Makes OP_Jump t
4d10: 65 73 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73  estable */.    s
4d20: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4d30: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
4d40: 29 70 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  )pKI, P4_KEYINFO
4d50: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4d60: 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20   pKI->nAllField 
4d70: 3e 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64  > pKI->nKeyField
4d80: 2b 32 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  +2 );.    pOp->p
4d90: 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79  4.pKeyInfo = key
4da0: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
4db0: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e  (pParse, pSort->
4dc0: 70 4f 72 64 65 72 42 79 2c 20 6e 4f 42 53 61 74  pOrderBy, nOBSat
4dd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 49               pKI
4e00: 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2d 70 4b 49 2d  ->nAllField-pKI-
4e10: 3e 6e 4b 65 79 46 69 65 6c 64 2d 31 29 3b 0a 20  >nKeyField-1);. 
4e20: 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c     addrJmp = sql
4e30: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
4e40: 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
4e50: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4e60: 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d   OP_Jump, addrJm
4e70: 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b  p+1, 0, addrJmp+
4e80: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
4e90: 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e  (v);.    pSort->
4ea0: 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c  labelBkOut = sql
4eb0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
4ec0: 6c 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d  l(v);.    pSort-
4ed0: 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
4ee0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
4ef0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4f00: 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
4f10: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
4f20: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
4f30: 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
4f40: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
4f50: 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70  P_ResetSorter, p
4f60: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
4f70: 0a 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 20  .    if( iLimit 
4f80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4f90: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4fa0: 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20  _IfNot, iLimit, 
4fb0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65  pSort->labelDone
4fc0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
4fd0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
4fe0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
4ff0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 46  umpHere(v, addrF
5000: 69 72 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  irst);.    sqlit
5010: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
5020: 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
5030: 72 65 67 50 72 65 76 4b 65 79 2c 20 70 53 6f 72  regPrevKey, pSor
5040: 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20  t->nOBSat);.    
5050: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
5060: 65 72 65 28 76 2c 20 61 64 64 72 4a 6d 70 29 3b  ere(v, addrJmp);
5070: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74  .  }.  if( pSort
5080: 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f  ->sortFlags & SO
5090: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
50a0: 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f   ){.    op = OP_
50b0: 53 6f 72 74 65 72 49 6e 73 65 72 74 3b 0a 20 20  SorterInsert;.  
50c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20  }else{.    op = 
50d0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a 20 20  OP_IdxInsert;.  
50e0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
50f0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20  ddOp4Int(v, op, 
5100: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c  pSort->iECursor,
5110: 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20 20 20   regRecord,.    
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5130: 20 20 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61     regBase+nOBSa
5140: 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74 29  t, nBase-nOBSat)
5150: 3b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 20 29  ;.  if( iLimit )
5160: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  {.    int addr;.
5170: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 30 3b 0a      int r1 = 0;.
5180: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20      /* Fill the 
5190: 73 6f 72 74 65 72 20 75 6e 74 69 6c 20 69 74 20  sorter until it 
51a0: 63 6f 6e 74 61 69 6e 73 20 4c 49 4d 49 54 2b 4f  contains LIMIT+O
51b0: 46 46 53 45 54 20 65 6e 74 72 69 65 73 2e 20 20  FFSET entries.  
51c0: 28 54 68 65 20 69 4c 69 6d 69 74 0a 20 20 20 20  (The iLimit.    
51d0: 2a 2a 20 72 65 67 69 73 74 65 72 20 69 73 20 69  ** register is i
51e0: 6e 69 74 69 61 6c 69 7a 65 64 20 77 69 74 68 20  nitialized with 
51f0: 76 61 6c 75 65 20 6f 66 20 4c 49 4d 49 54 2b 4f  value of LIMIT+O
5200: 46 46 53 45 54 2e 29 20 20 41 66 74 65 72 20 74  FFSET.)  After t
5210: 68 65 20 73 6f 72 74 65 72 0a 20 20 20 20 2a 2a  he sorter.    **
5220: 20 66 69 6c 6c 73 20 75 70 2c 20 64 65 6c 65 74   fills up, delet
5230: 65 20 74 68 65 20 6c 65 61 73 74 20 65 6e 74 72  e the least entr
5240: 79 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 20  y in the sorter 
5250: 61 66 74 65 72 20 65 61 63 68 20 69 6e 73 65 72  after each inser
5260: 74 2e 0a 20 20 20 20 2a 2a 20 54 68 75 73 20 77  t..    ** Thus w
5270: 65 20 6e 65 76 65 72 20 68 6f 6c 64 20 6d 6f 72  e never hold mor
5280: 65 20 74 68 61 6e 20 74 68 65 20 4c 49 4d 49 54  e than the LIMIT
5290: 2b 4f 46 46 53 45 54 20 72 6f 77 73 20 69 6e 20  +OFFSET rows in 
52a0: 6d 65 6d 6f 72 79 20 61 74 20 6f 6e 63 65 20 2a  memory at once *
52b0: 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  /.    addr = sql
52c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
52d0: 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20  , OP_IfNotZero, 
52e0: 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76  iLimit); VdbeCov
52f0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
5300: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
5310: 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 53 6f 72  v, OP_Last, pSor
5320: 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20  t->iECursor);.  
5330: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 62 4f 72    if( pSort->bOr
5340: 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 29  deredInnerLoop )
5350: 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 2b 2b 70  {.      r1 = ++p
5360: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
5370: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5380: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
5390: 6e 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  n, pSort->iECurs
53a0: 6f 72 2c 20 6e 45 78 70 72 2c 20 72 31 29 3b 0a  or, nExpr, r1);.
53b0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
53c0: 74 28 28 76 2c 20 22 73 65 71 22 29 29 3b 0a 20  t((v, "seq"));. 
53d0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
53e0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
53f0: 5f 44 65 6c 65 74 65 2c 20 70 53 6f 72 74 2d 3e  _Delete, pSort->
5400: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69  iECursor);.    i
5410: 66 28 20 70 53 6f 72 74 2d 3e 62 4f 72 64 65 72  f( pSort->bOrder
5420: 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 29 7b 0a 20  edInnerLoop ){. 
5430: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69       /* If the i
5440: 6e 6e 65 72 20 6c 6f 6f 70 20 69 73 20 64 72 69  nner loop is dri
5450: 76 65 6e 20 62 79 20 61 6e 20 69 6e 64 65 78 20  ven by an index 
5460: 73 75 63 68 20 74 68 61 74 20 76 61 6c 75 65 73  such that values
5470: 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 74   from.      ** t
5480: 68 65 20 73 61 6d 65 20 69 74 65 72 61 74 69 6f  he same iteratio
5490: 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  n of the inner l
54a0: 6f 6f 70 20 61 72 65 20 69 6e 20 73 6f 72 74 65  oop are in sorte
54b0: 64 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20  d order, then.  
54c0: 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
54d0: 6c 79 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e  ly jump to the n
54e0: 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
54f0: 20 61 6e 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69   an inner loop i
5500: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65  f the.      ** e
5510: 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 63 75  ntry from the cu
5520: 72 72 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 20  rrent iteration 
5530: 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 69 6e 74  does not fit int
5540: 6f 20 74 68 65 20 74 6f 70 0a 20 20 20 20 20 20  o the top.      
5550: 2a 2a 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20  ** LIMIT+OFFSET 
5560: 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73  entries of the s
5570: 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  orter. */.      
5580: 69 6e 74 20 69 42 72 6b 20 3d 20 73 71 6c 69 74  int iBrk = sqlit
5590: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
55a0: 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20 20 20  r(v) + 2;.      
55b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
55c0: 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 42  3(v, OP_Eq, regB
55d0: 61 73 65 2b 6e 45 78 70 72 2c 20 69 42 72 6b 2c  ase+nExpr, iBrk,
55e0: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
55f0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
5600: 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  v, SQLITE_NULLEQ
5610: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
5620: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
5630: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
5640: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
5650: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
5660: 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  dd code to imple
5670: 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a  ment the OFFSET.
5680: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
5690: 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62  odeOffset(.  Vdb
56a0: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f  e *v,          /
56b0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
56c0: 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  into this VM */.
56d0: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 2c 20 20    int iOffset,  
56e0: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
56f0: 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 66 66 73  holding the offs
5700: 65 74 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  et counter */.  
5710: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20 20  int iContinue   
5720: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
5730: 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72 65  o skip the curre
5740: 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a  nt record */.){.
5750: 20 20 69 66 28 20 69 4f 66 66 73 65 74 3e 30 20    if( iOffset>0 
5760: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
5770: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
5780: 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 2c 20 69  fPos, iOffset, i
5790: 43 6f 6e 74 69 6e 75 65 2c 20 31 29 3b 20 56 64  Continue, 1); Vd
57a0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
57b0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
57c0: 76 2c 20 22 4f 46 46 53 45 54 22 29 29 3b 0a 20  v, "OFFSET"));. 
57d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
57e0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63  code that will c
57f0: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
5800: 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72  e the N register
5810: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d  s starting at iM
5820: 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73  em.** form a dis
5830: 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54  tinct entry.  iT
5840: 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20  ab is a sorting 
5850: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
5860: 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73   previously.** s
5870: 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  een combinations
5880: 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73   of the N values
5890: 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
58a0: 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a  s made in iTab.*
58b0: 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  * if the current
58c0: 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65   N values are ne
58d0: 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20  w..**.** A jump 
58e0: 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73  to addrRepeat is
58f0: 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b   made and the N+
5900: 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70  1 values are pop
5910: 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ped from the.** 
5920: 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70  stack if the top
5930: 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20   N elements are 
5940: 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f  not distinct..*/
5950: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
5960: 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72  eDistinct(.  Par
5970: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5980: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
5990: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
59a0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
59b0: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
59c0: 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  * A sorting inde
59d0: 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66  x used to test f
59e0: 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20  or distinctness 
59f0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70  */.  int addrRep
5a00: 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20  eat,    /* Jump 
5a10: 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64  to here if not d
5a20: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
5a30: 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
5a40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
5a50: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ments */.  int i
5a60: 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem           /*
5a70: 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a   First element *
5a80: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  /.){.  Vdbe *v;.
5a90: 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d    int r1;..  v =
5aa0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
5ab0: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
5ac0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
5ad0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
5ae0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
5af0: 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64 72  ound, iTab, addr
5b00: 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e 29  Repeat, iMem, N)
5b10: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
5b20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5b30: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
5b40: 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e  eRecord, iMem, N
5b50: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
5b60: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
5b70: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
5b80: 54 61 62 2c 20 72 31 2c 20 69 4d 65 6d 2c 20 4e  Tab, r1, iMem, N
5b90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5ba0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
5bb0: 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
5bc0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
5bd0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5be0: 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e, r1);.}../*.**
5bf0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
5c00: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
5c10: 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20   for the inside 
5c20: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
5c30: 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54  p.** of a SELECT
5c40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61  ..**.** If srcTa
5c50: 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  b is negative, t
5c60: 68 65 6e 20 74 68 65 20 70 2d 3e 70 45 4c 69 73  hen the p->pELis
5c70: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
5c80: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
5c90: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
5ca0: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
5cb0: 20 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62   row.  If srcTab
5cc0: 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d   is.** zero or m
5cd0: 6f 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69  ore, then data i
5ce0: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72  s pulled from sr
5cf0: 63 54 61 62 20 61 6e 64 20 70 2d 3e 70 45 4c 69  cTab and p->pELi
5d00: 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  st is used only 
5d10: 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 6e  .** to get the n
5d20: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
5d30: 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c 61 74 69   and the collati
5d40: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
5d50: 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  each column..*/.
5d60: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
5d70: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50  ctInnerLoop(.  P
5d80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5d90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
5da0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
5db0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
5dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5dd0: 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74   complete select
5de0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
5df0: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
5e00: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
5e10: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
5e20: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
5e30: 20 69 66 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   if non-negative
5e40: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
5e50: 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  Sort,         /*
5e60: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
5e70: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
5e80: 63 65 73 73 20 4f 52 44 45 52 20 42 59 20 2a 2f  cess ORDER BY */
5e90: 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a  .  DistinctCtx *
5ea0: 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66  pDistinct, /* If
5eb0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
5ec0: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
5ed0: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
5ee0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
5ef0: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
5f00: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
5f10: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
5f20: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
5f30: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
5f40: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
5f50: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
5f60: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
5f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
5f80: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
5f90: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
5fa0: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
5fb0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
5fc0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
5fd0: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
5fe0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
5ff0: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
6000: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
6010: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
6020: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
6030: 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77  >eDest;   /* How
6040: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72   to dispose of r
6050: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
6060: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
6070: 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74  SDParm; /* First
6080: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73   argument to dis
6090: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
60a0: 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c    int nResultCol
60b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
60c0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
60d0: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
60e0: 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20  nt nPrefixReg = 
60f0: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  0;         /* Nu
6100: 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
6110: 67 69 73 74 65 72 73 20 62 65 66 6f 72 65 20 72  gisters before r
6120: 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 2f  egResult */..  /
6130: 2a 20 55 73 75 61 6c 6c 79 2c 20 72 65 67 52 65  * Usually, regRe
6140: 73 75 6c 74 20 69 73 20 74 68 65 20 66 69 72 73  sult is the firs
6150: 74 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61 72 72  t cell in an arr
6160: 61 79 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  ay of memory cel
6170: 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  ls.  ** containi
6180: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ng the current r
6190: 65 73 75 6c 74 20 72 6f 77 2e 20 49 6e 20 74 68  esult row. In th
61a0: 69 73 20 63 61 73 65 20 72 65 67 4f 72 69 67 20  is case regOrig 
61b0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20  is set to the.  
61c0: 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 48  ** same value. H
61d0: 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 72  owever, if the r
61e0: 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67  esults are being
61f0: 20 73 65 6e 74 20 74 6f 20 74 68 65 20 73 6f 72   sent to the sor
6200: 74 65 72 2c 20 74 68 65 0a 20 20 2a 2a 20 76 61  ter, the.  ** va
6210: 6c 75 65 73 20 66 6f 72 20 61 6e 79 20 65 78 70  lues for any exp
6220: 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
6230: 65 20 61 6c 73 6f 20 70 61 72 74 20 6f 66 20 74  e also part of t
6240: 68 65 20 73 6f 72 74 2d 6b 65 79 20 61 72 65 20  he sort-key are 
6250: 6f 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66 72 6f  omitted.  ** fro
6260: 6d 20 74 68 69 73 20 61 72 72 61 79 2e 20 49 6e  m this array. In
6270: 20 74 68 69 73 20 63 61 73 65 20 72 65 67 4f 72   this case regOr
6280: 69 67 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ig is set to zer
6290: 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  o.  */.  int reg
62a0: 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
62b0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
62c0: 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20   memory holding 
62d0: 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 73 20  current results 
62e0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67  */.  int regOrig
62f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6300: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d   /* Start of mem
6310: 6f 72 79 20 68 6f 6c 64 69 6e 67 20 66 75 6c 6c  ory holding full
6320: 20 72 65 73 75 6c 74 20 28 6f 72 20 30 29 20 2a   result (or 0) *
6330: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20 29  /..  assert( v )
6340: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
6350: 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61  EList!=0 );.  ha
6360: 73 44 69 73 74 69 6e 63 74 20 3d 20 70 44 69 73  sDistinct = pDis
6370: 74 69 6e 63 74 20 3f 20 70 44 69 73 74 69 6e 63  tinct ? pDistinc
6380: 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 3a 20 57  t->eTnctType : W
6390: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f  HERE_DISTINCT_NO
63a0: 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 20  OP;.  if( pSort 
63b0: 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72  && pSort->pOrder
63c0: 42 79 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d 20  By==0 ) pSort = 
63d0: 30 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d  0;.  if( pSort==
63e0: 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63  0 && !hasDistinc
63f0: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
6400: 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b   iContinue!=0 );
6410: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
6420: 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69  v, p->iOffset, i
6430: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a  Continue);.  }..
6440: 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65    /* Pull the re
6450: 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e  quested columns.
6460: 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43  .  */.  nResultC
6470: 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
6480: 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 44  nExpr;..  if( pD
6490: 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b  est->iSdst==0 ){
64a0: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29  .    if( pSort )
64b0: 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69 78 52  {.      nPrefixR
64c0: 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  eg = pSort->pOrd
64d0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
64e0: 20 20 20 69 66 28 20 21 28 70 53 6f 72 74 2d 3e     if( !(pSort->
64f0: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
6500: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 20  FLAG_UseSorter) 
6510: 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b 0a  ) nPrefixReg++;.
6520: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
6530: 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52 65 67  em += nPrefixReg
6540: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 65 73  ;.    }.    pDes
6550: 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73  t->iSdst = pPars
6560: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
6570: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
6580: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c  ResultCol;.  }el
6590: 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53  se if( pDest->iS
65a0: 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e  dst+nResultCol >
65b0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b   pParse->nMem ){
65c0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
65d0: 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  an error conditi
65e0: 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65 73 75  on that can resu
65f0: 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  lt, for example,
6600: 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 0a 20   when a SELECT. 
6610: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67     ** on the rig
6620: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
6630: 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74 61 69  an INSERT contai
6640: 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63  ns more result c
6650: 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20  olumns than.    
6660: 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c  ** there are col
6670: 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
6680: 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 20  e on the left.  
6690: 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  The error will b
66a0: 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a 2a 20  e caught.    ** 
66b0: 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74  and reported lat
66c0: 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  er.  But we need
66d0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 65 6e   to make sure en
66e0: 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73 20 61  ough memory is a
66f0: 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20  llocated.    ** 
6700: 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72 20 73  to avoid other s
6710: 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73 20 69  purious errors i
6720: 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20  n the meantime. 
6730: 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
6740: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
6750: 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e  l;.  }.  pDest->
6760: 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43  nSdst = nResultC
6770: 6f 6c 3b 0a 20 20 72 65 67 4f 72 69 67 20 3d 20  ol;.  regOrig = 
6780: 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65 73  regResult = pDes
6790: 74 2d 3e 69 53 64 73 74 3b 0a 20 20 69 66 28 20  t->iSdst;.  if( 
67a0: 73 72 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20 20  srcTab>=0 ){.   
67b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73   for(i=0; i<nRes
67c0: 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ultCol; i++){.  
67d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
67e0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
67f0: 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20 72  mn, srcTab, i, r
6800: 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20  egResult+i);.   
6810: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
6820: 76 2c 20 22 25 73 22 2c 20 70 2d 3e 70 45 4c 69  v, "%s", p->pELi
6830: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 29  st->a[i].zName))
6840: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
6850: 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45  if( eDest!=SRT_E
6860: 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20  xists ){.    /* 
6870: 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  If the destinati
6880: 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53 28  on is an EXISTS(
6890: 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c  ...) expression,
68a0: 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20   the actual.    
68b0: 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e  ** values return
68c0: 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
68d0: 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65   are not require
68e0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 38  d..    */.    u8
68f0: 20 65 63 65 6c 46 6c 61 67 73 3b 0a 20 20 20 20   ecelFlags;.    
6900: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d  if( eDest==SRT_M
6910: 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
6920: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
6930: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
6940: 29 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61  ){.      ecelFla
6950: 67 73 20 3d 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs = SQLITE_ECEL
6960: 5f 44 55 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  _DUP;.    }else{
6970: 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73  .      ecelFlags
6980: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
6990: 69 66 28 20 70 53 6f 72 74 20 26 26 20 68 61 73  if( pSort && has
69a0: 44 69 73 74 69 6e 63 74 3d 3d 30 20 26 26 20 65  Distinct==0 && e
69b0: 44 65 73 74 21 3d 53 52 54 5f 45 70 68 65 6d 54  Dest!=SRT_EphemT
69c0: 61 62 20 26 26 20 65 44 65 73 74 21 3d 53 52 54  ab && eDest!=SRT
69d0: 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  _Table ){.      
69e0: 2f 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  /* For each expr
69f0: 65 73 73 69 6f 6e 20 69 6e 20 70 2d 3e 70 45 4c  ession in p->pEL
6a00: 69 73 74 20 74 68 61 74 20 69 73 20 61 20 63 6f  ist that is a co
6a10: 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  py of an express
6a20: 69 6f 6e 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ion in.      ** 
6a30: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
6a40: 75 73 65 20 28 70 53 6f 72 74 2d 3e 70 4f 72 64  use (pSort->pOrd
6a50: 65 72 42 79 29 2c 20 73 65 74 20 74 68 65 20 61  erBy), set the a
6a60: 73 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20 20  ssociated .     
6a70: 20 2a 2a 20 69 4f 72 64 65 72 42 79 43 6f 6c 20   ** iOrderByCol 
6a80: 76 61 6c 75 65 20 74 6f 20 6f 6e 65 20 6d 6f 72  value to one mor
6a90: 65 20 74 68 61 6e 20 74 68 65 20 69 6e 64 65 78  e than the index
6aa0: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
6ab0: 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65   .      ** expre
6ac0: 73 73 69 6f 6e 20 77 69 74 68 69 6e 20 74 68 65  ssion within the
6ad0: 20 73 6f 72 74 2d 6b 65 79 20 74 68 61 74 20 70   sort-key that p
6ae0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20  ushOntoSorter() 
6af0: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20  will generate.. 
6b00: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 61 6c 6c       ** This all
6b10: 6f 77 73 20 74 68 65 20 70 2d 3e 70 45 4c 69 73  ows the p->pELis
6b20: 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 6f 6d  t field to be om
6b30: 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  itted from the s
6b40: 6f 72 74 65 64 20 72 65 63 6f 72 64 2c 0a 20 20  orted record,.  
6b50: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 73 70      ** saving sp
6b60: 61 63 65 20 61 6e 64 20 43 50 55 20 63 79 63 6c  ace and CPU cycl
6b70: 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 65 63  es.  */.      ec
6b80: 65 6c 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49  elFlags |= (SQLI
6b90: 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 7c  TE_ECEL_OMITREF|
6ba0: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29  SQLITE_ECEL_REF)
6bb0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53  ;.      for(i=pS
6bc0: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 69 3c 70  ort->nOBSat; i<p
6bd0: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
6be0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
6bf0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
6c00: 20 20 20 20 69 66 28 20 28 6a 20 3d 20 70 53 6f      if( (j = pSo
6c10: 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b  rt->pOrderBy->a[
6c20: 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
6c30: 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ol)>0 ){.       
6c40: 20 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b     p->pEList->a[
6c50: 6a 2d 31 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  j-1].u.x.iOrderB
6c60: 79 43 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f 72 74  yCol = i+1-pSort
6c70: 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 20 20  ->nOBSat;.      
6c80: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6c90: 20 20 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20    regOrig = 0;. 
6ca0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
6cb0: 73 74 3d 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65  st==SRT_Set || e
6cc0: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20  Dest==SRT_Mem . 
6cd0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 44 65            || eDe
6ce0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
6cf0: 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  e || eDest==SRT_
6d00: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a  Output );.    }.
6d10: 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d      nResultCol =
6d20: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
6d30: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
6d40: 70 2d 3e 70 45 4c 69 73 74 2c 72 65 67 52 65 73  p->pEList,regRes
6d50: 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ult,.           
6d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
6d80: 65 63 65 6c 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  ecelFlags);.  }.
6d90: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53  .  /* If the DIS
6da0: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61  TINCT keyword wa
6db0: 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65  s present on the
6dc0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6dd0: 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20  t.  ** and this 
6de0: 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65  row has been see
6df0: 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64  n before, then d
6e00: 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20  o not make this 
6e10: 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66  row.  ** part of
6e20: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
6e30: 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69  /.  if( hasDisti
6e40: 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69 74 63  nct ){.    switc
6e50: 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54  h( pDistinct->eT
6e60: 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20 20  nctType ){.     
6e70: 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
6e80: 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a  INCT_ORDERED: {.
6e90: 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a          VdbeOp *
6ea0: 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  pOp;            
6eb0: 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71  /* No longer req
6ec0: 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d 65  uired OpenEpheme
6ed0: 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20  ral instr. */.  
6ee0: 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b        int iJump;
6ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6f00: 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   Jump destinatio
6f10: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  n */.        int
6f20: 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20   regPrev;       
6f30: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
6f40: 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a   row content */.
6f50: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f  .        /* Allo
6f60: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
6f70: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
6f80: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50 72  */.        regPr
6f90: 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ev = pParse->nMe
6fa0: 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  m+1;.        pPa
6fb0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
6fc0: 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20 20  sultCol;..      
6fd0: 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20    /* Change the 
6fe0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
6ff0: 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74   coded earlier t
7000: 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20  o an OP_Null.   
7010: 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65       ** sets the
7020: 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69 74   MEM_Cleared bit
7030: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72 65   on the first re
7040: 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20 20  gister of the.  
7050: 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
7060: 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 77  s value.  This w
7070: 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f 50  ill cause the OP
7080: 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77  _Ne below to alw
7090: 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  ays.        ** f
70a0: 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73 74  ail on the first
70b0: 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
70c0: 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20 74  e loop even if t
70d0: 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20  he first.       
70e0: 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e   ** row is all N
70f0: 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ULLs..        */
7100: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7110: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
7120: 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61  (v, pDistinct->a
7130: 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20  ddrTnct);.      
7140: 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
7150: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69 73  dbeGetOp(v, pDis
7160: 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29  tinct->addrTnct)
7170: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f  ;.        pOp->o
7180: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b  pcode = OP_Null;
7190: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31  .        pOp->p1
71a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f   = 1;.        pO
71b0: 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76 3b  p->p2 = regPrev;
71c0: 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20  ..        iJump 
71d0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
71e0: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 52  rentAddr(v) + nR
71f0: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20 20  esultCol;.      
7200: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
7210: 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  sultCol; i++){. 
7220: 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71           CollSeq
7230: 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
7240: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
7250: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
7260: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
7270: 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65         if( i<nRe
7280: 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20  sultCol-1 ){.   
7290: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
72a0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
72b0: 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  _Ne, regResult+i
72c0: 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76  , iJump, regPrev
72d0: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
72e0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
72f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
7300: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
7310: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7320: 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65  (v, OP_Eq, regRe
7330: 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75  sult+i, iContinu
7340: 65 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20  e, regPrev+i);. 
7350: 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
7360: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
7370: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7380: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
7390: 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
73a0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c  onst char *)pCol
73b0: 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
73c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
73d0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
73e0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b   SQLITE_NULLEQ);
73f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7400: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
7410: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
7420: 72 28 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70  r(v)==iJump || p
7430: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
7440: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
7450: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7460: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
7470: 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50   regResult, regP
7480: 72 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d  rev, nResultCol-
7490: 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
74a0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
74b0: 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
74c0: 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a  TINCT_UNIQUE: {.
74d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
74e0: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
74f0: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
7500: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
7510: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
7520: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
7530: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
7540: 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ( pDistinct->eTn
7550: 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49  ctType==WHERE_DI
7560: 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
7570: 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   );.        code
7580: 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
7590: 20 70 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54   pDistinct->tabT
75a0: 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  nct, iContinue, 
75b0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20  nResultCol,.    
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75d0: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
75e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
75f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
7600: 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20  ( pSort==0 ){.  
7610: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
7620: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
7630: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a  ontinue);.    }.
7640: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65    }..  switch( e
7650: 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Dest ){.    /* I
7660: 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69  n this mode, wri
7670: 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65  te each query re
7680: 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20  sult to the key 
7690: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
76a0: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50  .    ** table iP
76b0: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  arm..    */.#ifn
76c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
76d0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
76e0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
76f0: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  on: {.      int 
7700: 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  r1;.      r1 = s
7710: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
7720: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
7730: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7740: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
7750: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
7760: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a  ResultCol, r1);.
7770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7780: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
7790: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
77a0: 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74  m, r1, regResult
77b0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
77c0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
77d0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
77e0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
77f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
7800: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
7810: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
7820: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
7830: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
7840: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
7850: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
7860: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
7870: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
7880: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
7890: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
78a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
78b0: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
78c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
78d0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
78e0: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72  Delete, iParm, r
78f0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
7900: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  tCol);.      bre
7910: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
7920: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
7930: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
7940: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65  */..    /* Store
7950: 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
7960: 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
7970: 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
7980: 20 20 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f     case SRT_Fifo
7990: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44  :.    case SRT_D
79a0: 69 73 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73  istFifo:.    cas
79b0: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
79c0: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
79d0: 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab: {.      int 
79e0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
79f0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
7a00: 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a   nPrefixReg+1);.
7a10: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7a20: 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65  eDest==SRT_Table
7a30: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7a40: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45  se( eDest==SRT_E
7a50: 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
7a60: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
7a70: 3d 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20  ==SRT_Fifo );.  
7a80: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7a90: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66  est==SRT_DistFif
7aa0: 6f 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  o );.      sqlit
7ab0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7ac0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
7ad0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
7ae0: 74 43 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78  tCol, r1+nPrefix
7af0: 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Reg);.#ifndef SQ
7b00: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
7b10: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
7b20: 52 54 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20  RT_DistFifo ){. 
7b30: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
7b40: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
7b50: 44 69 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63  DistFifo, then c
7b60: 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20  ursor (iParm+1) 
7b70: 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20  is open.        
7b80: 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72  ** on an ephemer
7b90: 61 6c 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65  al index. If the
7ba0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20   current row is 
7bb0: 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a  already present.
7bc0: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
7bd0: 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20  e index, do not 
7be0: 77 72 69 74 65 20 69 74 20 74 6f 20 74 68 65 20  write it to the 
7bf0: 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20  output. If not, 
7c00: 61 64 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  add the.        
7c10: 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74  ** current row t
7c20: 6f 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  o the index and 
7c30: 70 72 6f 63 65 65 64 20 77 69 74 68 20 77 72 69  proceed with wri
7c40: 74 69 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20  ting it to the. 
7c50: 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74         ** output
7c60: 20 74 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20   table as well. 
7c70: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
7c80: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
7c90: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
7ca0: 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71   + 4;.        sq
7cb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
7cc0: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
7cd0: 69 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72  iParm+1, addr, r
7ce0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56  1, 0);.        V
7cf0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
7d00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7d10: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
7d20: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
7d30: 61 72 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65 73  arm+1, r1,regRes
7d40: 75 6c 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  ult,nResultCol);
7d50: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7d60: 20 70 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20   pSort==0 );.   
7d70: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
7d80: 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20    if( pSort ){. 
7d90: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
7da0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53  orter(pParse, pS
7db0: 6f 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66  ort, p, r1+nPref
7dc0: 69 78 52 65 67 2c 72 65 67 52 65 73 75 6c 74 2c  ixReg,regResult,
7dd0: 31 2c 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  1,nPrefixReg);. 
7de0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7df0: 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
7e00: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
7e10: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
7e20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7e30: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
7e40: 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20  , iParm, r2);.  
7e50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7e60: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
7e70: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c  sert, iParm, r1,
7e80: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r2);.        sq
7e90: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7ea0: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
7eb0: 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ND);.        sql
7ec0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
7ed0: 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
7ee0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
7ef0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
7f00: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  Range(pParse, r1
7f10: 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b  , nPrefixReg+1);
7f20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7f30: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
7f40: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
7f50: 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
7f60: 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
7f70: 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
7f80: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
7f90: 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
7fa0: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
7fb0: 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
7fc0: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
7fd0: 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
7fe0: 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
7ff0: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
8000: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
8010: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
8020: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
8030: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
8040: 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74       /* At first
8050: 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c   glance you woul
8060: 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64  d think we could
8070: 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68   optimize out th
8080: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44  e.        ** ORD
8090: 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63 61  ER BY in this ca
80a0: 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64  se since the ord
80b0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
80c0: 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20   the set.       
80d0: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74   ** does not mat
80e0: 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65 20  ter.  But there 
80f0: 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54  might be a LIMIT
8100: 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63   clause, in whic
8110: 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73  h.        ** cas
8120: 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73  e the order does
8130: 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20   matter */.     
8140: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
8150: 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r(.            p
8160: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c  Parse, pSort, p,
8170: 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f   regResult, regO
8180: 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  rig, nResultCol,
8190: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
81a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
81b0: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
81c0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
81d0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61  arse);.        a
81e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 74  ssert( sqlite3St
81f0: 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41  rlen30(pDest->zA
8200: 66 66 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74  ffSdst)==nResult
8210: 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73  Col );.        s
8220: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
8230: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
8240: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
8250: 65 73 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20  esultCol, .     
8260: 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73 74         r1, pDest
8270: 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 52 65 73  ->zAffSdst, nRes
8280: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
8290: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
82a0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
82b0: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
82c0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
82d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
82e0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
82f0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
8300: 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75  arm, r1, regResu
8310: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
8320: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8330: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
8340: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
8350: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
8360: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
8370: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
8380: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
8390: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
83a0: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
83b0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
83c0: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
83d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
83e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
83f0: 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20  er, 1, iParm);. 
8400: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
8410: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
8420: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
8430: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
8440: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
8450: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
8460: 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
8470: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
8480: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
8490: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
84a0: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
84b0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
84c0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20   memory cell or 
84d0: 61 72 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a  array of .    **
84e0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e   memory cells an
84f0: 64 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  d break out of t
8500: 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
8510: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
8520: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69  T_Mem: {.      i
8530: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
8540: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
8550: 75 6c 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e  ultCol<=pDest->n
8560: 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Sdst );.        
8570: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a  pushOntoSorter(.
8580: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
8590: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65  se, pSort, p, re
85a0: 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67  gResult, regOrig
85b0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50  , nResultCol, nP
85c0: 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20  refixReg);.     
85d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
85e0: 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43  assert( nResultC
85f0: 6f 6c 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74  ol==pDest->nSdst
8600: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
8610: 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69  rt( regResult==i
8620: 50 61 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  Parm );.        
8630: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
8640: 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
8650: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
8660: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r us */.      }.
8670: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8680: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
8690: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
86a0: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
86b0: 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
86c0: 74 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53  tine:       /* S
86d0: 65 6e 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f  end data to a co
86e0: 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  -routine */.    
86f0: 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a  case SRT_Output:
8700: 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74   {        /* Ret
8710: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  urn the results 
8720: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
8730: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  e( eDest==SRT_Co
8740: 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20  routine );.     
8750: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
8760: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
8770: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
8780: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
8790: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
87a0: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
87b0: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
87c0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20  nResultCol,.    
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87e0: 20 20 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a     nPrefixReg);.
87f0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8800: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
8810: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tine ){.        
8820: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8830: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
8840: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
8850: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8860: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8870: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
8880: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
8890: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
88a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
88b0: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
88c0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
88d0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
88e0: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tCol);.      }. 
88f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8900: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
8910: 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f  E_OMIT_CTE.    /
8920: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73 75  * Write the resu
8930: 6c 74 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72  lts into a prior
8940: 69 74 79 20 71 75 65 75 65 20 74 68 61 74 20 69  ity queue that i
8950: 73 20 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e  s order accordin
8960: 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73  g to.    ** pDes
8970: 74 2d 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20  t->pOrderBy (in 
8980: 70 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53  pSO).  pDest->iS
8990: 44 50 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29  DParm (in iParm)
89a0: 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66   is the cursor f
89b0: 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64  or an.    ** ind
89c0: 65 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78  ex with pSO->nEx
89d0: 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42  pr+2 columns.  B
89e0: 75 69 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67  uild a key using
89f0: 20 70 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72   pSO for the fir
8a00: 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e  st.    ** pSO->n
8a10: 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  Expr columns, th
8a20: 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  en make sure all
8a30: 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75 65   keys are unique
8a40: 20 62 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20   by adding a.   
8a50: 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71   ** final OP_Seq
8a60: 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54  uence column.  T
8a70: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
8a80: 73 20 74 68 65 20 72 65 63 6f 72 64 20 61 73 20  s the record as 
8a90: 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20  a blob..    */. 
8aa0: 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74     case SRT_Dist
8ab0: 51 75 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20  Queue:.    case 
8ac0: 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20  SRT_Queue: {.   
8ad0: 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20     int nKey;.   
8ae0: 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
8af0: 33 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  3;.      int add
8b00: 72 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  rTest = 0;.     
8b10: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a   ExprList *pSO;.
8b20: 20 20 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73        pSO = pDes
8b30: 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  t->pOrderBy;.   
8b40: 20 20 20 61 73 73 65 72 74 28 20 70 53 4f 20 29     assert( pSO )
8b50: 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70  ;.      nKey = p
8b60: 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  SO->nExpr;.     
8b70: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
8b80: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
8b90: 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
8ba0: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
8bb0: 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b  pParse, nKey+2);
8bc0: 0a 20 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e  .      r3 = r2+n
8bd0: 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28  Key+1;.      if(
8be0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
8bf0: 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Queue ){.       
8c00: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
8c10: 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75  nation is DistQu
8c20: 65 75 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72  eue, then cursor
8c30: 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70   (iParm+1) is op
8c40: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  en.        ** on
8c50: 20 61 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65   a second epheme
8c60: 72 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68  ral index that h
8c70: 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20  olds all values 
8c80: 65 76 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79  every previously
8c90: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65  .        ** adde
8ca0: 64 20 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20  d to the queue. 
8cb0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72 54  */.        addrT
8cc0: 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  est = sqlite3Vdb
8cd0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
8ce0: 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c  _Found, iParm+1,
8cf0: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
8d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
8d20: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
8d30: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  ol);.        Vdb
8d40: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
8d50: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
8d60: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8d70: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
8d80: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
8d90: 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20  ltCol, r3);.    
8da0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
8db0: 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20  _DistQueue ){.  
8dc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8dd0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
8de0: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31  xInsert, iParm+1
8df0: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73  , r3);.        s
8e00: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8e10: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
8e20: 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20  SEEKRESULT);.   
8e30: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
8e40: 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29  =0; i<nKey; i++)
8e50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8e60: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8e70: 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20  P_SCopy,.       
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e90: 20 20 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70     regResult + p
8ea0: 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  SO->a[i].u.x.iOr
8eb0: 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20  derByCol - 1,.  
8ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ed0: 20 20 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20          r2+i);. 
8ee0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
8ef0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8f00: 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69  , OP_Sequence, i
8f10: 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a  Parm, r2+nKey);.
8f20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8f30: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
8f40: 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b  keRecord, r2, nK
8f50: 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20  ey+2, r1);.     
8f60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8f70: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
8f80: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
8f90: 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  , r2, nKey+2);. 
8fa0: 20 20 20 20 20 69 66 28 20 61 64 64 72 54 65 73       if( addrTes
8fb0: 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  t ) sqlite3VdbeJ
8fc0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
8fd0: 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
8fe0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
8ff0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
9000: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
9010: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
9020: 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29  rse, r2, nKey+2)
9030: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9040: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
9050: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a  QLITE_OMIT_CTE *
9060: 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  /....#if !define
9070: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
9080: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
9090: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
90a0: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
90b0: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
90c0: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
90d0: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
90e0: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
90f0: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
9100: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
9110: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
9120: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
9130: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
9140: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
9150: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
9160: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
9170: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
9180: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
9190: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
91a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
91b0: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
91c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
91d0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
91e0: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
91f0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
9200: 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
9210: 69 73 20 72 65 61 63 68 65 64 2e 20 20 45 78 63  is reached.  Exc
9220: 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65  ept, if.  ** the
9230: 72 65 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20  re is a sorter, 
9240: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
9250: 65 20 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72  e sorter has alr
9260: 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a  eady limited.  *
9270: 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72  * the output for
9280: 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   us..  */.  if( 
9290: 70 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69  pSort==0 && p->i
92a0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
92b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
92c0: 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
92d0: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
92e0: 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
92f0: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  age(v);.  }.}../
9300: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
9310: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73  KeyInfo object s
9320: 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e  ufficient for an
9330: 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20   index of N key 
9340: 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58  columns and.** X
9350: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a   extra columns..
9360: 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
9370: 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
9380: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
9390: 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e   N, int X){.  in
93a0: 74 20 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29  t nExtra = (N+X)
93b0: 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
93c0: 2a 29 2b 31 29 20 2d 20 73 69 7a 65 6f 66 28 43  *)+1) - sizeof(C
93d0: 6f 6c 6c 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49  ollSeq*);.  KeyI
93e0: 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  nfo *p = sqlite3
93f0: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
9400: 2c 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f  , sizeof(KeyInfo
9410: 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  ) + nExtra);.  i
9420: 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  f( p ){.    p->a
9430: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
9440: 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b  )&p->aColl[N+X];
9450: 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 46 69 65 6c  .    p->nKeyFiel
9460: 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20  d = (u16)N;.    
9470: 70 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 3d 20 28  p->nAllField = (
9480: 75 31 36 29 28 4e 2b 58 29 3b 0a 20 20 20 20 70  u16)(N+X);.    p
9490: 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
94a0: 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  .    p->db = db;
94b0: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31  .    p->nRef = 1
94c0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 5b  ;.    memset(&p[
94d0: 31 5d 2c 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a  1], 0, nExtra);.
94e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
94f0: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
9500: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
9510: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
9520: 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  ocate a KeyInfo 
9530: 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73  object.*/.void s
9540: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
9550: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
9560: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
9570: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
9580: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d   );.    p->nRef-
9590: 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  -;.    if( p->nR
95a0: 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44  ef==0 ) sqlite3D
95b0: 62 46 72 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70  bFreeNN(p->db, p
95c0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
95d0: 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74  Make a new point
95e0: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
95f0: 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66  object.*/.KeyInf
9600: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
9610: 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29  oRef(KeyInfo *p)
9620: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
9630: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
9640: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  >0 );.    p->nRe
9650: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  f++;.  }.  retur
9660: 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n p;.}..#ifdef S
9670: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
9680: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
9690: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
96a0: 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e  t can be change.
96b0: 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62    The KeyInfo ob
96c0: 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79  ject.** can only
96d0: 20 62 65 20 63 68 61 6e 67 65 64 20 69 66 20 74   be changed if t
96e0: 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73 69  his is just a si
96f0: 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74  ngle reference t
9700: 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a  o the object..**
9710: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9720: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e   is used only in
9730: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
9740: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
9750: 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  int sqlite3KeyIn
9760: 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65  foIsWriteable(Ke
9770: 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72  yInfo *p){ retur
9780: 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a  n p->nRef==1; }.
9790: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
97a0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
97b0: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
97c0: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
97d0: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
97e0: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
97f0: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
9800: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
9810: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
9820: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
9830: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
9840: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
9850: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
9860: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
9870: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
9880: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
9890: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
98a0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
98b0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
98c0: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
98d0: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
98e0: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
98f0: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
9900: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
9910: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
9920: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
9930: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
9940: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
9950: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
9960: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
9970: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
9980: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
9990: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
99a0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
99b0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
99c0: 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63  m malloc.  The c
99d0: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
99e0: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
99f0: 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61  e for seeing tha
9a00: 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
9a10: 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
9a20: 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74  * freed..*/.stat
9a30: 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49  ic KeyInfo *keyI
9a40: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
9a50: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9a60: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
9a70: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
9a80: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
9a90: 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65       /* Form the
9aa0: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
9ab0: 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69  from this ExprLi
9ac0: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  st */.  int iSta
9ad0: 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rt,          /* 
9ae0: 42 65 67 69 6e 20 77 69 74 68 20 74 68 69 73 20  Begin with this 
9af0: 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20  column of pList 
9b00: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
9b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
9b20: 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61   this many extra
9b30: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
9b40: 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  end */.){.  int 
9b50: 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f  nExpr;.  KeyInfo
9b60: 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   *pInfo;.  struc
9b70: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
9b80: 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
9b90: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9ba0: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  db;.  int i;..  
9bb0: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
9bc0: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
9bd0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
9be0: 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53  loc(db, nExpr-iS
9bf0: 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b  tart, nExtra+1);
9c00: 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a  .  if( pInfo ){.
9c10: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
9c20: 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
9c30: 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a  eable(pInfo) );.
9c40: 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74      for(i=iStart
9c50: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
9c60: 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72  +iStart; i<nExpr
9c70: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
9c80: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43  .      pInfo->aC
9c90: 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20  oll[i-iStart] = 
9ca0: 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c  sqlite3ExprNNCol
9cb0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
9cc0: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
9cd0: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
9ce0: 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20  der[i-iStart] = 
9cf0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
9d00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
9d10: 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f  turn pInfo;.}../
9d20: 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  *.** Name of the
9d30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72   connection oper
9d40: 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65  ator, used for e
9d50: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a  rror messages..*
9d60: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
9d70: 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d  har *selectOpNam
9d80: 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61  e(int id){.  cha
9d90: 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20  r *z;.  switch( 
9da0: 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  id ){.    case T
9db0: 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d  K_ALL:       z =
9dc0: 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20   "UNION ALL";   
9dd0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9de0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20  TK_INTERSECT: z 
9df0: 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20  = "INTERSECT";  
9e00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9e10: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a   TK_EXCEPT:    z
9e20: 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20   = "EXCEPT";    
9e30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
9e40: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
9e50: 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20  z = "UNION";    
9e60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
9e70: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66  return z;.}..#if
9e80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9e90: 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55  _EXPLAIN./*.** U
9ea0: 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49  nless an "EXPLAI
9eb0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f  N QUERY PLAN" co
9ec0: 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70  mmand is being p
9ed0: 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66  rocessed, this f
9ee0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20  unction.** is a 
9ef0: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
9f00: 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67  , it adds a sing
9f10: 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  le row of output
9f20: 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75   to the EQP resu
9f30: 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65  lt,.** where the
9f40: 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74   caption is of t
9f50: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
9f60: 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   "USE TEMP B-TRE
9f70: 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a  E FOR xxx".**.**
9f80: 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e   where xxx is on
9f90: 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c  e of "DISTINCT",
9fa0: 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22   "ORDER BY" or "
9fb0: 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74  GROUP BY". Exact
9fc0: 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ly which.** is d
9fd0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
9fe0: 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74   zUsage argument
9ff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a000: 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
a010: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
a020: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73   const char *zUs
a030: 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72  age){.  if( pPar
a040: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
a050: 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
a060: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
a070: 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
a080: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
a090: 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20  Parse->db, "USE 
a0a0: 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20  TEMP B-TREE FOR 
a0b0: 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20  %s", zUsage);.  
a0c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a0d0: 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
a0e0: 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  n, pParse->iSele
a0f0: 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67  ctId, 0, 0, zMsg
a100: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
a110: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69   }.}../*.** Assi
a120: 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20  gn expression b 
a130: 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73  to lvalue a. A s
a140: 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65  econd, no-op, ve
a150: 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61  rsion of this ma
a160: 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64  cro.** is provid
a170: 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f  ed when SQLITE_O
a180: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64  MIT_EXPLAIN is d
a190: 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c  efined. This all
a1a0: 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20  ows the code.** 
a1b0: 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  in sqlite3Select
a1c0: 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c  () to assign val
a1d0: 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72 65  ues to structure
a1e0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
a1f0: 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65  s that.** only e
a200: 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f  xist if SQLITE_O
a210: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e  MIT_EXPLAIN is n
a220: 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f  ot defined witho
a230: 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65  ut polluting the
a240: 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69  .** code with #i
a250: 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65 73  fndef directives
a260: 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  ..*/.# define ex
a270: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
a280: 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c  a, b) a = b..#el
a290: 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73  se./* No-op vers
a2a0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c  ions of the expl
a2b0: 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f  ainXXX() functio
a2c0: 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a  ns and macros. *
a2d0: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
a2e0: 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29  inTempTable(y,z)
a2f0: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
a300: 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29  nSetInteger(y,z)
a310: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
a320: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
a330: 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64  T_EXPLAIN) && !d
a340: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a350: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
a360: 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  CT)./*.** Unless
a370: 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45   an "EXPLAIN QUE
a380: 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64  RY PLAN" command
a390: 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73   is being proces
a3a0: 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  sed, this functi
a3b0: 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  on.** is a no-op
a3c0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
a3d0: 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  adds a single ro
a3e0: 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74  w of output to t
a3f0: 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a  he EQP result,.*
a400: 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74  * where the capt
a410: 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66  ion is of one of
a420: 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a   the two forms:.
a430: 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49  **.**   "COMPOSI
a440: 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53  TE SUBQUERIES iS
a450: 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f  ub1 and iSub2 (o
a460: 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53  p)".**   "COMPOS
a470: 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69  ITE SUBQUERIES i
a480: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 55  Sub1 and iSub2 U
a490: 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45  SING TEMP B-TREE
a4a0: 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65   (op)".**.** whe
a4b0: 72 65 20 69 53 75 62 31 20 61 6e 64 20 69 53 75  re iSub1 and iSu
a4c0: 62 32 20 61 72 65 20 74 68 65 20 69 6e 74 65 67  b2 are the integ
a4d0: 65 72 73 20 70 61 73 73 65 64 20 61 73 20 74 68  ers passed as th
a4e0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
a4f0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61  ** function para
a500: 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69  meters, and op i
a510: 73 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65  s the text repre
a520: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
a530: 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66   parameter.** of
a540: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
a550: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f  The parameter "o
a560: 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  p" must be one o
a570: 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  f TK_UNION, TK_E
a580: 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54  XCEPT,.** TK_INT
a590: 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c  ERSECT or TK_ALL
a5a0: 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  . The first form
a5b0: 20 69 73 20 75 73 65 64 20 69 66 20 61 72 67 75   is used if argu
a5c0: 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20  ment bUseTmp is 
a5d0: 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68  .** false, or th
a5e0: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66  e second form if
a5f0: 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a   it is true..*/.
a600: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
a610: 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20  ainComposite(.  
a620: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
a630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a640: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
a650: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
a660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a670: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
a680: 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
a690: 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e  EPT etc. */.  in
a6a0: 74 20 69 53 75 62 31 2c 20 20 20 20 20 20 20 20  t iSub1,        
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a6c0: 20 53 75 62 71 75 65 72 79 20 69 64 20 31 20 2a   Subquery id 1 *
a6d0: 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20  /.  int iSub2,  
a6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6f0: 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20      /* Subquery 
a700: 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55  id 2 */.  int bU
a710: 73 65 54 6d 70 20 20 20 20 20 20 20 20 20 20 20  seTmp           
a720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
a730: 65 20 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c  e if a temp tabl
a740: 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b  e was used */.){
a750: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
a760: 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54  K_UNION || op==T
a770: 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d  K_EXCEPT || op==
a780: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20  TK_INTERSECT || 
a790: 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20  op==TK_ALL );.  
a7a0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
a7b0: 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64  ain==2 ){.    Vd
a7c0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
a7d0: 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20  pVdbe;.    char 
a7e0: 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
a7f0: 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
a800: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d  pParse->db, "COM
a810: 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45 53  POUND SUBQUERIES
a820: 20 25 64 20 41 4e 44 20 25 64 20 25 73 28 25 73   %d AND %d %s(%s
a830: 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  )", iSub1, iSub2
a840: 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65 54 6d  ,.        bUseTm
a850: 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d  p?"USING TEMP B-
a860: 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63  TREE ":"", selec
a870: 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20  tOpName(op).    
a880: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a890: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
a8a0: 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e  xplain, pParse->
a8b0: 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c  iSelectId, 0, 0,
a8c0: 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
a8d0: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  C);.  }.}.#else.
a8e0: 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e  /* No-op version
a8f0: 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e  s of the explain
a900: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  XXX() functions 
a910: 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23  and macros. */.#
a920: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43   define explainC
a930: 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79  omposite(v,w,x,y
a940: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,z).#endif../*.*
a950: 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  * If the inner l
a960: 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65  oop was generate
a970: 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75  d using a non-nu
a980: 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75  ll pOrderBy argu
a990: 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ment,.** then th
a9a0: 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70  e results were p
a9b0: 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65  laced in a sorte
a9c0: 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f  r.  After the lo
a9d0: 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  op is terminated
a9e0: 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72  .** we need to r
a9f0: 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e  un the sorter an
aa00: 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73  d output the res
aa10: 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ults.  The follo
aa20: 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  wing.** routine 
aa30: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
aa40: 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20  de needed to do 
aa50: 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  that..*/.static 
aa60: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72  void generateSor
aa70: 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a  tTail(.  Parse *
aa80: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
aa90: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
aaa0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
aab0: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
aac0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
aad0: 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74    SortCtx *pSort
aae0: 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69  ,   /* Informati
aaf0: 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20  on on the ORDER 
ab00: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
ab10: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
ab20: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
ab30: 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f  lumns of data */
ab40: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
ab50: 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68  Dest /* Write th
ab60: 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73  e sorted results
ab70: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64   here */.){.  Vd
ab80: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
ab90: 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20 20  pVdbe;          
aba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
abb0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
abc0: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ment */.  int ad
abd0: 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72 74 2d  drBreak = pSort-
abe0: 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20  >labelDone;     
abf0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
ac00: 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70  ere to exit loop
ac10: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
ac20: 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
ac30: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
ac40: 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  ;  /* Jump here 
ac50: 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  for next cycle *
ac60: 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  /.  int addr;.  
ac70: 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30  int addrOnce = 0
ac80: 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
ac90: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
aca0: 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  By = pSort->pOrd
acb0: 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65 73  erBy;.  int eDes
acc0: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
acd0: 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  ;.  int iParm = 
ace0: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a  pDest->iSDParm;.
acf0: 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20    int regRow;.  
ad00: 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20 20  int regRowid;.  
ad10: 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20  int iCol;.  int 
ad20: 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 53 6f 72  nKey;.  int iSor
ad30: 74 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  tTab;           
ad40: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65          /* Sorte
ad50: 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61 64  r cursor to read
ad60: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e   from */.  int n
ad70: 53 6f 72 74 44 61 74 61 3b 20 20 20 20 20 20 20  SortData;       
ad80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
ad90: 61 69 6c 69 6e 67 20 76 61 6c 75 65 73 20 74 6f  ailing values to
ada0: 20 72 65 61 64 20 66 72 6f 6d 20 73 6f 72 74 65   read from sorte
adb0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20  r */.  int i;.  
adc0: 69 6e 74 20 62 53 65 71 3b 20 20 20 20 20 20 20  int bSeq;       
add0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ade0: 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 72 74 65  /* True if sorte
adf0: 72 20 72 65 63 6f 72 64 20 69 6e 63 6c 75 64 65  r record include
ae00: 73 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 20 20  s seq. no. */.  
ae10: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
ae20: 69 74 65 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70  item *aOutEx = p
ae30: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 0a 20 20  ->pEList->a;..  
ae40: 61 73 73 65 72 74 28 20 61 64 64 72 42 72 65 61  assert( addrBrea
ae50: 6b 3c 30 20 29 3b 0a 20 20 69 66 28 20 70 53 6f  k<0 );.  if( pSo
ae60: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29  rt->labelBkOut )
ae70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
ae80: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
ae90: 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  sub, pSort->regR
aea0: 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61  eturn, pSort->la
aeb0: 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73  belBkOut);.    s
aec0: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
aed0: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
aee0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
aef0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f  olveLabel(v, pSo
af00: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
af10: 0a 20 20 7d 0a 20 20 69 54 61 62 20 3d 20 70 53  .  }.  iTab = pS
af20: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20  ort->iECursor;. 
af30: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
af40: 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d  Output || eDest=
af50: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 7c  =SRT_Coroutine |
af60: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  | eDest==SRT_Mem
af70: 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64   ){.    regRowid
af80: 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 52 6f 77   = 0;.    regRow
af90: 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b   = pDest->iSdst;
afa0: 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d  .    nSortData =
afb0: 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73   nColumn;.  }els
afc0: 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20  e{.    regRowid 
afd0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
afe0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
aff0: 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65   regRow = sqlite
b000: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
b010: 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  arse, nColumn);.
b020: 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d 20      nSortData = 
b030: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 0a 20 20 6e  nColumn;.  }.  n
b040: 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  Key = pOrderBy->
b050: 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e  nExpr - pSort->n
b060: 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70 53 6f  OBSat;.  if( pSo
b070: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
b080: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
b090: 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  er ){.    int re
b0a0: 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61  gSortOut = ++pPa
b0b0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69  rse->nMem;.    i
b0c0: 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72 73 65  SortTab = pParse
b0d0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66  ->nTab++;.    if
b0e0: 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  ( pSort->labelBk
b0f0: 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61 64 64  Out ){.      add
b100: 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 56  rOnce = sqlite3V
b110: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
b120: 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Once); VdbeCover
b130: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
b140: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b150: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
b160: 65 75 64 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20  eudo, iSortTab, 
b170: 72 65 67 53 6f 72 74 4f 75 74 2c 20 6e 4b 65 79  regSortOut, nKey
b180: 2b 31 2b 6e 53 6f 72 74 44 61 74 61 29 3b 0a 20  +1+nSortData);. 
b190: 20 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20     if( addrOnce 
b1a0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
b1b0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63  pHere(v, addrOnc
b1c0: 65 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31  e);.    addr = 1
b1d0: 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
b1e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
b1f0: 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64  rSort, iTab, add
b200: 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  rBreak);.    Vdb
b210: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b220: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
b230: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
b240: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73  Continue);.    s
b250: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b260: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
b270: 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74  a, iTab, regSort
b280: 4f 75 74 2c 20 69 53 6f 72 74 54 61 62 29 3b 0a  Out, iSortTab);.
b290: 20 20 20 20 62 53 65 71 20 3d 20 30 3b 0a 20 20      bSeq = 0;.  
b2a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20  }else{.    addr 
b2b0: 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
b2c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
b2d0: 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72  rt, iTab, addrBr
b2e0: 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
b2f0: 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f  ge(v);.    codeO
b300: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
b310: 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  set, addrContinu
b320: 65 29 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62  e);.    iSortTab
b330: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 62 53 65   = iTab;.    bSe
b340: 71 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72  q = 1;.  }.  for
b350: 28 69 3d 30 2c 20 69 43 6f 6c 3d 6e 4b 65 79 2b  (i=0, iCol=nKey+
b360: 62 53 65 71 2d 31 3b 20 69 3c 6e 53 6f 72 74 44  bSeq-1; i<nSortD
b370: 61 74 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ata; i++){.    i
b380: 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78  f( aOutEx[i].u.x
b390: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20  .iOrderByCol==0 
b3a0: 29 20 69 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20  ) iCol++;.  }.  
b3b0: 66 6f 72 28 69 3d 6e 53 6f 72 74 44 61 74 61 2d  for(i=nSortData-
b3c0: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
b3d0: 20 20 20 69 6e 74 20 69 52 65 61 64 3b 0a 20 20     int iRead;.  
b3e0: 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e    if( aOutEx[i].
b3f0: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
b400: 29 7b 0a 20 20 20 20 20 20 69 52 65 61 64 20 3d  ){.      iRead =
b410: 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69   aOutEx[i].u.x.i
b420: 4f 72 64 65 72 42 79 43 6f 6c 2d 31 3b 0a 20 20  OrderByCol-1;.  
b430: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
b440: 52 65 61 64 20 3d 20 69 43 6f 6c 2d 2d 3b 0a 20  Read = iCol--;. 
b450: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
b460: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b470: 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61  _Column, iSortTa
b480: 62 2c 20 69 52 65 61 64 2c 20 72 65 67 52 6f 77  b, iRead, regRow
b490: 2b 69 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  +i);.    VdbeCom
b4a0: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 61  ment((v, "%s", a
b4b0: 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3f  OutEx[i].zName ?
b4c0: 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65   aOutEx[i].zName
b4d0: 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53 70   : aOutEx[i].zSp
b4e0: 61 6e 29 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74  an));.  }.  swit
b4f0: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
b500: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
b510: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
b520: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
b530: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b540: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
b550: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
b560: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
b570: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b580: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
b590: 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69   regRow, regRowi
b5a0: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
b5b0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
b5c0: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
b5d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b5e0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
b5f0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
b600: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
b610: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
b620: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71 6c 69  t( nColumn==sqli
b630: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 65 73  te3Strlen30(pDes
b640: 74 2d 3e 7a 41 66 66 53 64 73 74 29 20 29 3b 0a  t->zAffSdst) );.
b650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b660: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
b670: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77  keRecord, regRow
b680: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f  , nColumn, regRo
b690: 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  wid,.           
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
b6b0: 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 43  st->zAffSdst, nC
b6c0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71  olumn);.      sq
b6d0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
b6e0: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
b6f0: 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f  rse, regRow, nCo
b700: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  lumn);.      sql
b710: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
b720: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
b730: 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  t, iParm, regRow
b740: 69 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c  id, regRow, nCol
b750: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  umn);.      brea
b760: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
b770: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
b780: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
b790: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
b7a0: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
b7b0: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
b7c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
b7d0: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
b7e0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b7f0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
b800: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
b810: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20  Coroutine ); .  
b820: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
b830: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
b840: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
b850: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  e( eDest==SRT_Co
b860: 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20  routine );.     
b870: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
b880: 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
b890: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b8a0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
b8b0: 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73  Row, pDest->iSds
b8c0: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
b8d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b8e0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
b8f0: 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73  nge(pParse, pDes
b900: 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d  t->iSdst, nColum
b910: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
b920: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b930: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
b940: 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
b950: 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d  SDParm);.      }
b960: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b970: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65    }.  }.  if( re
b980: 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66  gRowid ){.    if
b990: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74  ( eDest==SRT_Set
b9a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b9b0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
b9c0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  e(pParse, regRow
b9d0: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
b9e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
b9f0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
ba00: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
ba10: 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  w);.    }.    sq
ba20: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
ba30: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
ba40: 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  owid);.  }.  /* 
ba50: 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  The bottom of th
ba60: 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
ba70: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
ba80: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e  Label(v, addrCon
ba90: 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70 53  tinue);.  if( pS
baa0: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
bab0: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
bac0: 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ter ){.    sqlit
bad0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
bae0: 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69  OP_SorterNext, i
baf0: 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65  Tab, addr); Vdbe
bb00: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
bb10: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
bb20: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
bb30: 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
bb40: 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  dr); VdbeCoverag
bb50: 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  e(v);.  }.  if( 
bb60: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
bb70: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
bb80: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
bb90: 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74  n, pSort->regRet
bba0: 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  urn);.  sqlite3V
bbb0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
bbc0: 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 7d  v, addrBreak);.}
bbd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
bbe0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
bbf0: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
bc00: 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e  the 'declaration
bc10: 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a   type' of the.**
bc20: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
bc30: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61  r. The string ma
bc40: 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20  y be treated as 
bc50: 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61  static by the ca
bc60: 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  ller..**.** Also
bc70: 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65   try to estimate
bc80: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
bc90: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
bca0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74 0a  and return that.
bcb0: 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a 70 45  ** result in *pE
bcc0: 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54  stWidth..**.** T
bcd0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
bce0: 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74  ype is the exact
bcf0: 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69   datatype defini
bd00: 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66  tion extracted f
bd10: 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69  rom the.** origi
bd20: 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45  nal CREATE TABLE
bd30: 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68   statement if th
bd40: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
bd50: 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a  a column. The.**
bd60: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
bd70: 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69  e for a ROWID fi
bd80: 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20  eld is INTEGER. 
bd90: 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20  Exactly when an 
bda0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
bdb0: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f   considered a co
bdc0: 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70  lumn can be comp
bdd0: 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65 73 65  lex in the prese
bde0: 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72 69 65  nce of subquerie
bdf0: 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74  s. The.** result
be00: 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20  -set expression 
be10: 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  in all of the fo
be20: 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73  llowing SELECT s
be30: 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a  tatements is .**
be40: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f   considered a co
be50: 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e  lumn by this fun
be60: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53  ction..**.**   S
be70: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
be80: 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  bl;.**   SELECT 
be90: 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d  (SELECT col FROM
bea0: 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43   tbl;.**   SELEC
beb0: 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52  T (SELECT col FR
bec0: 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45  OM tbl);.**   SE
bed0: 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53  LECT abc FROM (S
bee0: 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63  ELECT col AS abc
bef0: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a   FROM tbl);.** .
bf00: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
bf10: 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20  on type for any 
bf20: 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72  expression other
bf30: 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69   than a column i
bf40: 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
bf50: 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 65  is routine has e
bf60: 69 74 68 65 72 20 33 20 6f 72 20 36 20 70 61 72  ither 3 or 6 par
bf70: 61 6d 65 74 65 72 73 20 64 65 70 65 6e 64 69 6e  ameters dependin
bf80: 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
bf90: 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  not.** the SQLIT
bfa0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
bfb0: 4d 45 54 41 44 41 54 41 20 63 6f 6d 70 69 6c 65  METADATA compile
bfc0: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
bfd0: 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  used..*/.#ifdef 
bfe0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
bff0: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 23 20  LUMN_METADATA.# 
c000: 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70  define columnTyp
c010: 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20 63 6f 6c  e(A,B,C,D,E) col
c020: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c  umnTypeImpl(A,B,
c030: 43 2c 44 2c 45 29 0a 23 65 6c 73 65 20 2f 2a 20  C,D,E).#else /* 
c040: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
c050: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
c060: 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23 20  _METADATA) */.# 
c070: 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70  define columnTyp
c080: 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20 63 6f 6c  e(A,B,C,D,E) col
c090: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 29  umnTypeImpl(A,B)
c0a0: 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 63  .#endif.static c
c0b0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d  onst char *colum
c0c0: 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d  nTypeImpl(.  Nam
c0d0: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a  eContext *pNC, .
c0e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
c0f0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
c100: 41 44 41 54 41 0a 20 20 45 78 70 72 20 2a 70 45  ADATA.  Expr *pE
c110: 78 70 72 0a 23 65 6c 73 65 0a 20 20 45 78 70 72  xpr.#else.  Expr
c120: 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74   *pExpr,.  const
c130: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62   char **pzOrigDb
c140: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
c150: 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f  *pzOrigTab,.  co
c160: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
c170: 67 43 6f 6c 0a 23 65 6e 64 69 66 0a 29 7b 0a 20  gCol.#endif.){. 
c180: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79   char const *zTy
c190: 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b  pe = 0;.  int j;
c1a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c1b0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
c1c0: 41 44 41 54 41 0a 20 20 63 68 61 72 20 63 6f 6e  ADATA.  char con
c1d0: 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b  st *zOrigDb = 0;
c1e0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
c1f0: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63  OrigTab = 0;.  c
c200: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
c210: 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Col = 0;.#endif.
c220: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
c230: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
c240: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d   pNC->pSrcList!=
c250: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
c260: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
c270: 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20 54  _COLUMN );  /* T
c280: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 65  his routine rune
c290: 73 20 62 65 66 6f 72 65 20 61 67 67 72 65 67 61  s before aggrega
c2a0: 74 65 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  tes.            
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2c0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72             ** ar
c2d0: 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  e processed */. 
c2e0: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
c2f0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
c300: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
c310: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
c320: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
c330: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
c340: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  e the column is 
c350: 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65  being.      ** e
c360: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e  xtracted from in
c370: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72   NameContext.pSr
c380: 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c  cList. This tabl
c390: 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20  e may be real.  
c3a0: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
c3b0: 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75  table or a subqu
c3c0: 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ery..      */.  
c3d0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
c3e0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
c3f0: 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  /* Table structu
c400: 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  re column is ext
c410: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
c420: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
c430: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
c440: 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63   /* Select the c
c450: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
c460: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
c470: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
c480: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20  r->iColumn;  /* 
c490: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
c4a0: 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20  in pTab */.     
c4b0: 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21   while( pNC && !
c4c0: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
c4d0: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
c4e0: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
c4f0: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  t;.        for(j
c500: 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  =0;j<pTabList->n
c510: 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d  Src && pTabList-
c520: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70  >a[j].iCursor!=p
c530: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b  Expr->iTable;j++
c540: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
c550: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
c560: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
c570: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
c580: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  j].pTab;.       
c590: 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74     pS = pTabList
c5a0: 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[j].pSelect;.
c5b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c5c0: 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70           pNC = p
c5d0: 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  NC->pNext;.     
c5e0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
c5f0: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
c600: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
c610: 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20   one time, code 
c620: 73 75 63 68 20 61 73 20 22 53 45 4c 45 43 54 20  such as "SELECT 
c630: 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20  new.x" within a 
c640: 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20  trigger would.  
c650: 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74        ** cause t
c660: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f  his condition to
c670: 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65   run.  Since the
c680: 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73 74 72  n, we have restr
c690: 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20  uctured how.    
c6a0: 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63      ** trigger c
c6b0: 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
c6c0: 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e   and so this con
c6d0: 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e  dition is no lon
c6e0: 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ger .        ** 
c6f0: 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65  possible. Howeve
c700: 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20  r, it can still 
c710: 62 65 20 74 72 75 65 20 66 6f 72 20 73 74 61 74  be true for stat
c720: 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20  ements like.    
c730: 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
c740: 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a  wing:.        **
c750: 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52  .        **   CR
c760: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f  EATE TABLE t1(co
c770: 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20  l INTEGER);.    
c780: 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
c790: 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20  (SELECT t1.col) 
c7a0: 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20  FROM FROM t1;.  
c7b0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
c7c0: 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54   ** when columnT
c7d0: 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ype() is called 
c7e0: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
c7f0: 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68  n "t1.col" in th
c800: 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75  e .        ** su
c810: 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69  b-select. In thi
c820: 73 20 63 61 73 65 2c 20 73 65 74 20 74 68 65 20  s case, set the 
c830: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e  column type to N
c840: 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20  ULL, even.      
c850: 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73    ** though it s
c860: 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20  hould really be 
c870: 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20  "INTEGER"..     
c880: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
c890: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70   This is not a p
c8a0: 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63  roblem, as the c
c8b0: 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74  olumn type of "t
c8c0: 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a  1.col" is never.
c8d0: 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e          ** used.
c8e0: 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65   When columnType
c8f0: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
c900: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a  the expression .
c910: 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c          ** "(SEL
c920: 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68  ECT t1.col)", th
c930: 65 20 63 6f 72 72 65 63 74 20 74 79 70 65 20 69  e correct type i
c940: 73 20 72 65 74 75 72 6e 65 64 20 28 73 65 65 20  s returned (see 
c950: 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20  the TK_SELECT.  
c960: 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20        ** branch 
c970: 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20  below.  */.     
c980: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c990: 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
c9a0: 20 70 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e   pTab && pExpr->
c9b0: 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20  pTab==pTab );.  
c9c0: 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20      if( pS ){.  
c9d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61        /* The "ta
c9e0: 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79  ble" is actually
c9f0: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72   a sub-select or
ca00: 20 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46   a view in the F
ca10: 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20  ROM clause.     
ca20: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c     ** of the SEL
ca30: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52  ECT statement. R
ca40: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
ca50: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f  ation type and o
ca60: 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  rigin.        **
ca70: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65   data for the re
ca80: 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20  sult-set column 
ca90: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
caa0: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
cab0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
cac0: 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45  0 && iCol<pS->pE
cad0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
cae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69           /* If i
caf0: 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  Col is less than
cb00: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
cb10: 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65  expression reque
cb20: 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  sts the.        
cb30: 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68    ** rowid of th
cb40: 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  e sub-select or 
cb50: 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65  view. This expre
cb60: 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28  ssion is legal (
cb70: 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  see .          *
cb80: 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63  * test case misc
cb90: 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61  2.2.2) - it alwa
cba0: 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  ys evaluates to 
cbb0: 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20  NULL..          
cbc0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d  */.          Nam
cbd0: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
cbe0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20          Expr *p 
cbf0: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
cc00: 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20  iCol].pExpr;.   
cc10: 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c         sNC.pSrcL
cc20: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
cc30: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e            sNC.pN
cc40: 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20  ext = pNC;.     
cc50: 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20       sNC.pParse 
cc60: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
cc70: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
cc80: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
cc90: 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f  , p,&zOrigDb,&zO
cca0: 72 69 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c  rigTab,&zOrigCol
ccb0: 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ); .        }.  
ccc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ccd0: 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62     /* A real tab
cce0: 6c 65 20 6f 72 20 61 20 43 54 45 20 74 61 62 6c  le or a CTE tabl
ccf0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
cd00: 65 72 74 28 20 21 70 53 20 29 3b 0a 23 69 66 64  ert( !pS );.#ifd
cd10: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
cd20: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
cd30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
cd40: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
cd50: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
cd60: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
cd70: 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43 6f  XN_ROWID || (iCo
cd80: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
cd90: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
cda0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
cdb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
cdc0: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
cdd0: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
cde0: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
cdf0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ce00: 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d        zOrigCol =
ce10: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
ce20: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
ce30: 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74     zType = sqlit
ce40: 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54  e3ColumnType(&pT
ce50: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30  ab->aCol[iCol],0
ce60: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
ce70: 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20       zOrigTab = 
ce80: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
ce90: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50       if( pNC->pP
cea0: 61 72 73 65 20 26 26 20 70 54 61 62 2d 3e 70 53  arse && pTab->pS
ceb0: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
cec0: 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
ced0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
cee0: 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  x(pNC->pParse->d
cef0: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
cf00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  );.          zOr
cf10: 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72  igDb = pNC->pPar
cf20: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
cf30: 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 20  .zDbSName;.     
cf40: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20     }.#else.     
cf50: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
cf60: 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43  =XN_ROWID || (iC
cf70: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
cf80: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
cf90: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
cfa0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
cfb0: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
cfc0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
cfd0: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
cfe0: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79   sqlite3ColumnTy
cff0: 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  pe(&pTab->aCol[i
d000: 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20  Col],0);.       
d010: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
d020: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
d030: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
d040: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
d050: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  Y.    case TK_SE
d060: 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LECT: {.      /*
d070: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
d080: 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e  is a sub-select.
d090: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
d0a0: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
d0b0: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e  .      ** origin
d0c0: 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69   info for the si
d0d0: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ngle column in t
d0e0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
d0f0: 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
d100: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a    ** statement..
d110: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e        */.      N
d120: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
d130: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
d140: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
d150: 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ect;.      Expr 
d160: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
d170: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
d180: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
d190: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
d1a0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
d1b0: 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72  );.      sNC.pSr
d1c0: 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63  cList = pS->pSrc
d1d0: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78  ;.      sNC.pNex
d1e0: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73  t = pNC;.      s
d1f0: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  NC.pParse = pNC-
d200: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a  >pParse;.      z
d210: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
d220: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
d230: 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20  gDb, &zOrigTab, 
d240: 26 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20  &zOrigCol); .   
d250: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d260: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64  #endif.  }..#ifd
d270: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d280: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
d290: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44    .  if( pzOrigD
d2a0: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
d2b0: 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a   pzOrigTab && pz
d2c0: 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a  OrigCol );.    *
d2d0: 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67  pzOrigDb = zOrig
d2e0: 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54  Db;.    *pzOrigT
d2f0: 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20  ab = zOrigTab;. 
d300: 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20     *pzOrigCol = 
d310: 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65  zOrigCol;.  }.#e
d320: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 7a 54  ndif.  return zT
d330: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ype;.}../*.** Ge
d340: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
d350: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
d360: 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74  DBE the declarat
d370: 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c  ion types of col
d380: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
d390: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
d3a0: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
d3b0: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20  teColumnTypes(. 
d3c0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d3d0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
d3e0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
d3f0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
d400: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
d410: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
d420: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
d430: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
d440: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
d450: 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  t */.){.#ifndef 
d460: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
d470: 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d  TYPE.  Vdbe *v =
d480: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
d490: 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
d4a0: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e  ontext sNC;.  sN
d4b0: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61  C.pSrcList = pTa
d4c0: 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61  bList;.  sNC.pPa
d4d0: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
d4e0: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  sNC.pNext = 0;. 
d4f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
d500: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
d510: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
d520: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
d530: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  r;.    const cha
d540: 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66  r *zType;.#ifdef
d550: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
d560: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
d570: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
d580: 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20  OrigDb = 0;.    
d590: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
d5a0: 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  gTab = 0;.    co
d5b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43  nst char *zOrigC
d5c0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70  ol = 0;.    zTyp
d5d0: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
d5e0: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
d5f0: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
d600: 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a  rigCol);..    /*
d610: 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d   The vdbe must m
d620: 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79  ake its own copy
d630: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74   of the column-t
d640: 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20  ype and other . 
d650: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65     ** column spe
d660: 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69  cific strings, i
d670: 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d  n case the schem
d680: 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72  a is reset befor
d690: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69  e this.    ** vi
d6a0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73  rtual machine is
d6b0: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
d6c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d6d0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
d6e0: 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53   COLNAME_DATABAS
d6f0: 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49  E, zOrigDb, SQLI
d700: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
d710: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d720: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
d730: 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f  OLNAME_TABLE, zO
d740: 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54  rigTab, SQLITE_T
d750: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
d760: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
d770: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
d780: 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67  ME_COLUMN, zOrig
d790: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
d7a0: 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20  SIENT);.#else.  
d7b0: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
d7c0: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
d7d0: 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
d7e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d7f0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
d800: 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c  OLNAME_DECLTYPE,
d810: 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54   zType, SQLITE_T
d820: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23  RANSIENT);.  }.#
d830: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
d840: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  d(SQLITE_OMIT_DE
d850: 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f  CLTYPE) */.}.../
d860: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
d870: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f   column names fo
d880: 72 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  r a SELECT state
d890: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
d8a0: 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74  only guarantee t
d8b0: 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73  hat SQLite makes
d8c0: 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61   about column na
d8d0: 6d 65 73 20 69 73 20 74 68 61 74 20 69 66 20 74  mes is that if t
d8e0: 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73  he.** column has
d8f0: 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73   an AS clause as
d900: 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d  signing it a nam
d910: 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  e, that will be 
d920: 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a  the name used..*
d930: 2a 20 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e  * That is the on
d940: 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75  ly documented gu
d950: 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65  arantee.  Howeve
d960: 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70  r, countless app
d970: 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76  lications.** dev
d980: 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20  eloped over the 
d990: 79 65 61 72 73 20 68 61 76 65 20 6d 61 64 65 20  years have made 
d9a0: 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74  baseless assumpt
d9b0: 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d  ions about colum
d9c0: 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77  n names.** and w
d9d0: 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f  ill break if tho
d9e0: 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63  se assumptions c
d9f0: 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20  hanges.  Hence, 
da00: 75 73 65 20 65 78 74 72 65 6d 65 20 63 61 75 74  use extreme caut
da10: 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69  ion.** when modi
da20: 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  fying this routi
da30: 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61  ne to avoid brea
da40: 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a  king legacy..**.
da50: 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 73 71 6c  ** See Also: sql
da60: 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
da70: 78 70 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a 2a 20  xprList().**.** 
da80: 54 68 65 20 50 52 41 47 4d 41 20 73 68 6f 72 74  The PRAGMA short
da90: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 61 6e  _column_names an
daa0: 64 20 50 52 41 47 4d 41 20 66 75 6c 6c 5f 63 6f  d PRAGMA full_co
dab0: 6c 75 6d 6e 5f 6e 61 6d 65 73 20 73 65 74 74 69  lumn_names setti
dac0: 6e 67 73 20 61 72 65 0a 2a 2a 20 64 65 70 72 65  ngs are.** depre
dad0: 63 61 74 65 64 2e 20 20 54 68 65 20 64 65 66 61  cated.  The defa
dae0: 75 6c 74 20 73 65 74 74 69 6e 67 20 69 73 20 73  ult setting is s
daf0: 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46  hort=ON, full=OF
db00: 46 2e 20 20 39 39 2e 39 25 20 6f 66 20 61 6c 6c  F.  99.9% of all
db10: 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  .** applications
db20: 20 73 68 6f 75 6c 64 20 6f 70 65 72 61 74 65 20   should operate 
db30: 74 68 69 73 20 77 61 79 2e 20 20 4e 65 76 65 72  this way.  Never
db40: 74 68 65 6c 65 73 73 2c 20 77 65 20 6e 65 65 64  theless, we need
db50: 20 74 6f 20 73 75 70 70 6f 72 74 20 74 68 65 0a   to support the.
db60: 2a 2a 20 6f 74 68 65 72 20 6d 6f 64 65 73 20 66  ** other modes f
db70: 6f 72 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a 2a 2a  or legacy:.**.**
db80: 20 20 20 20 73 68 6f 72 74 3d 4f 46 46 2c 20 66      short=OFF, f
db90: 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20 43 6f  ull=OFF:      Co
dba0: 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 74 68 65  lumn name is the
dbb0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 65 78 70   text of the exp
dbc0: 72 65 73 73 69 6f 6e 20 68 61 73 20 69 74 0a 2a  ression has it.*
dbd0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
dbf0: 72 69 67 69 6e 61 6c 6c 79 20 61 70 70 65 61 72  riginally appear
dc00: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  s in the SELECT 
dc10: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 0a 2a  statement.  In.*
dc20: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
dc40: 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
dc50: 7a 53 70 61 6e 20 6f 66 20 74 68 65 20 72 65 73  zSpan of the res
dc60: 75 6c 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ult expression..
dc70: 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f  **.**    short=O
dc80: 4e 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20  N, full=OFF:    
dc90: 20 20 20 28 54 68 69 73 20 69 73 20 74 68 65 20     (This is the 
dca0: 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 29  default setting)
dcb0: 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74  .  If the result
dcc0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dce0: 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
dcf0: 20 74 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75   to a table colu
dd00: 6d 6e 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  mn, then the.** 
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
dd30: 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ult column name 
dd40: 69 73 20 6a 75 73 74 20 74 68 65 20 74 61 62 6c  is just the tabl
dd50: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 20 20  e column.**     
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd70: 20 20 20 20 20 20 20 20 20 6e 61 6d 65 3a 20 43           name: C
dd80: 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73  OLUMN.  Otherwis
dd90: 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2a 0a  e use zSpan..**.
dda0: 2a 2a 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c 20 73  **    full=ON, s
ddb0: 68 6f 72 74 3d 41 4e 59 3a 20 20 20 20 20 20 20  hort=ANY:       
ddc0: 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65  If the result re
ddd0: 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f  fers directly to
dde0: 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c   a table column,
ddf0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de10: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
de20: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 69 74   column name wit
de30: 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
de40: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de60: 20 70 72 65 66 69 78 2c 20 65 78 3a 20 54 41 42   prefix, ex: TAB
de70: 4c 45 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65  LE.COLUMN.  Othe
de80: 72 77 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e  rwise use zSpan.
de90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
dea0: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
deb0: 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
dec0: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
ded0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
dee0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
def0: 74 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  t     /* Generat
df00: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
df10: 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 73  or this SELECT s
df20: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  tatement */.){. 
df30: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
df40: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
df50: 69 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  i;.  Table *pTab
df60: 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
df70: 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
df80: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c  t *pEList;.  sql
df90: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
dfa0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c  e->db;.  int ful
dfb0: 6c 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 54 41 42  lName;    /* TAB
dfc0: 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20  LE.COLUMN if no 
dfd0: 41 53 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73  AS clause and is
dfe0: 20 61 20 64 69 72 65 63 74 20 74 61 62 6c 65 20   a direct table 
dff0: 72 65 66 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63  ref */.  int src
e000: 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 43 4f 4c  Name;     /* COL
e010: 55 4d 4e 20 6f 72 20 54 41 42 4c 45 2e 43 4f 4c  UMN or TABLE.COL
e020: 55 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61  UMN if no AS cla
e030: 75 73 65 20 61 6e 64 20 69 73 20 64 69 72 65 63  use and is direc
e040: 74 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  t */..#ifndef SQ
e050: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
e060: 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  N.  /* If this i
e070: 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b  s an EXPLAIN, sk
e080: 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a  ip this step */.
e090: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
e0a0: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74  plain ){.    ret
e0b0: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
e0c0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
e0d0: 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 64 62  olNamesSet || db
e0e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e0f0: 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 43 6f   return;.  /* Co
e100: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 64  lumn names are d
e110: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
e120: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20   left-most term 
e130: 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
e140: 6c 65 63 74 20 2a 2f 0a 20 20 77 68 69 6c 65 28  lect */.  while(
e150: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
e160: 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65   ) pSelect = pSe
e170: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  lect->pPrior;.  
e180: 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
e190: 61 72 73 65 2c 70 53 65 6c 65 63 74 2c 28 22 67  arse,pSelect,("g
e1a0: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6c 75 6d 6e  enerating column
e1b0: 20 6e 61 6d 65 73 5c 6e 22 29 29 3b 0a 20 20 70   names\n"));.  p
e1c0: 54 61 62 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  TabList = pSelec
e1d0: 74 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  t->pSrc;.  pELis
e1e0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
e1f0: 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 76  ist;.  assert( v
e200: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e210: 20 70 54 61 62 4c 69 73 74 21 3d 30 20 29 3b 0a   pTabList!=0 );.
e220: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
e230: 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c  esSet = 1;.  ful
e240: 6c 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66 6c 61  lName = (db->fla
e250: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
e260: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
e270: 73 72 63 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66  srcName = (db->f
e280: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
e290: 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 20  ortColNames)!=0 
e2a0: 7c 7c 20 66 75 6c 6c 4e 61 6d 65 3b 0a 20 20 73  || fullName;.  s
e2b0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
e2c0: 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e  Cols(v, pEList->
e2d0: 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d  nExpr);.  for(i=
e2e0: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
e2f0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
e300: 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
e310: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a 20 20 20  a[i].pExpr;..   
e320: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
e330: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
e340: 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op!=TK_AGG_COLUM
e350: 4e 20 29 3b 20 20 2f 2a 20 41 67 67 20 70 72 6f  N );  /* Agg pro
e360: 63 65 73 73 69 6e 67 20 68 61 73 20 6e 6f 74 20  cessing has not 
e370: 72 75 6e 20 79 65 74 20 2a 2f 0a 20 20 20 20 61  run yet */.    a
e380: 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
e390: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 70 54  _COLUMN || p->pT
e3a0: 61 62 21 3d 30 20 29 3b 20 2f 2a 20 43 6f 76 65  ab!=0 ); /* Cove
e3b0: 72 69 6e 67 20 69 64 78 20 6e 6f 74 20 79 65 74  ring idx not yet
e3c0: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 20 20 69 66   coded */.    if
e3d0: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
e3e0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Name ){.      /*
e3f0: 20 41 6e 20 41 53 20 63 6c 61 75 73 65 20 61 6c   An AS clause al
e400: 77 61 79 73 20 74 61 6b 65 73 20 66 69 72 73 74  ways takes first
e410: 20 70 72 69 6f 72 69 74 79 20 2a 2f 0a 20 20 20   priority */.   
e420: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
e430: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
e440: 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ame;.      sqlit
e450: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
e460: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
e470: 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  AME, zName, SQLI
e480: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
e490: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 72 63     }else if( src
e4a0: 4e 61 6d 65 20 26 26 20 70 2d 3e 6f 70 3d 3d 54  Name && p->op==T
e4b0: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
e4c0: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20    char *zCol;.  
e4d0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
e4e0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
e4f0: 20 70 54 61 62 20 3d 20 70 2d 3e 70 54 61 62 3b   pTab = p->pTab;
e500: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
e510: 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab!=0 );.      
e520: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
e530: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
e540: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
e550: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
e560: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
e570: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
e580: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
e590: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72         zCol = "r
e5a0: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
e5b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  se{.        zCol
e5c0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
e5d0: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
e5e0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66 75 6c   }.      if( ful
e5f0: 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  lName ){.       
e600: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
e610: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
e620: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
e630: 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54  (db, "%s.%s", pT
e640: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  ab->zName, zCol)
e650: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
e660: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
e670: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
e680: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54  ME, zName, SQLIT
e690: 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  E_DYNAMIC);.    
e6a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e6b0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
e6c0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
e6d0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c  NAME_NAME, zCol,
e6e0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
e6f0: 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T);.      }.    
e700: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e  }else{.      con
e710: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c  st char *z = pEL
e720: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b  ist->a[i].zSpan;
e730: 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20  .      z = z==0 
e740: 3f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  ? sqlite3MPrintf
e750: 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c  (db, "column%d",
e760: 20 69 2b 31 29 20 3a 20 73 71 6c 69 74 65 33 44   i+1) : sqlite3D
e770: 62 53 74 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a  bStrDup(db, z);.
e780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e790: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
e7a0: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
e7b0: 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  z, SQLITE_DYNAMI
e7c0: 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  C);.    }.  }.  
e7d0: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
e7e0: 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  pes(pParse, pTab
e7f0: 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d  List, pEList);.}
e800: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
e810: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
e820: 20 28 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c   (which is reall
e830: 79 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78  y the list of ex
e840: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
e850: 74 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c  t form the resul
e860: 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
e870: 54 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d  T statement) com
e880: 70 75 74 65 20 61 70 70 72 6f 70 72 69 61 74 65  pute appropriate
e890: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  .** column names
e8a0: 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61   for a table tha
e8b0: 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  t would hold the
e8c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
e8d0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75  ..**.** All colu
e8e0: 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65  mn names will be
e8f0: 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f   unique..**.** O
e900: 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
e910: 61 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65  ames are compute
e920: 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  d.  Column.zType
e930: 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a  , Column.zColl,.
e940: 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65  ** and other fie
e950: 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72  lds of Column ar
e960: 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20  e zeroed..**.** 
e970: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
e980: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
e990: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
e9a0: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
e9b0: 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c  s,.** store NULL
e9c0: 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30   in *paCol and 0
e9d0: 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72   in *pnCol and r
e9e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
e9f0: 45 4d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e  EM..**.** The on
ea00: 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ly guarantee tha
ea10: 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61  t SQLite makes a
ea20: 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  bout column name
ea30: 73 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65  s is that if the
ea40: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61  .** column has a
ea50: 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73 73 69  n AS clause assi
ea60: 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c  gning it a name,
ea70: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68   that will be th
ea80: 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20  e name used..** 
ea90: 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79  That is the only
eaa0: 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72   documented guar
eab0: 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c  antee.  However,
eac0: 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69   countless appli
ead0: 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c  cations.** devel
eae0: 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20 79 65  oped over the ye
eaf0: 61 72 73 20 68 61 76 65 20 6d 61 64 65 20 62 61  ars have made ba
eb00: 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f  seless assumptio
eb10: 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  ns about column 
eb20: 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c  names.** and wil
eb30: 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65  l break if those
eb40: 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61   assumptions cha
eb50: 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73  nges.  Hence, us
eb60: 65 20 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f  e extreme cautio
eb70: 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79  n.** when modify
eb80: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
eb90: 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69   to avoid breaki
eba0: 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a  ng legacy..**.**
ebb0: 20 53 65 65 20 41 6c 73 6f 3a 20 67 65 6e 65 72   See Also: gener
ebc0: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29  ateColumnNames()
ebd0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
ebe0: 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
ebf0: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
ec00: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
ec10: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
ec20: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
ec30: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
ec40: 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20   Expr list from 
ec50: 77 68 69 63 68 20 74 6f 20 64 65 72 69 76 65 20  which to derive 
ec60: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
ec70: 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20    i16 *pnCol,   
ec80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
ec90: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
eca0: 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f   columns here */
ecb0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f  .  Column **paCo
ecc0: 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  l          /* Wr
ecd0: 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75  ite the new colu
ece0: 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a  mn list here */.
ecf0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
ed00: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
ed10: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
ed20: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
ed30: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
ed40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
ed50: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75   counters */.  u
ed60: 33 32 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  32 cnt;         
ed70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
ed80: 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b  dex added to mak
ed90: 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75  e the name uniqu
eda0: 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  e */.  Column *a
edb0: 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20  Col, *pCol;     
edc0: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
edd0: 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f  g over result co
ede0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
edf0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
ee00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ee10: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
ee20: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
ee30: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ee50: 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  * Column name */
ee60: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
ee70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ee80: 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69  * Size of name i
ee90: 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 20 20 48  n zName[] */.  H
eea0: 61 73 68 20 68 74 3b 20 20 20 20 20 20 20 20 20  ash ht;         
eeb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
eec0: 73 68 20 74 61 62 6c 65 20 6f 66 20 63 6f 6c 75  sh table of colu
eed0: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 73  mn names */..  s
eee0: 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
eef0: 68 74 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  ht);.  if( pELis
ef00: 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  t ){.    nCol = 
ef10: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
ef20: 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65     aCol = sqlite
ef30: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
ef40: 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d  , sizeof(aCol[0]
ef50: 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73  )*nCol);.    tes
ef60: 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29  tcase( aCol==0 )
ef70: 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 33  ;.    if( nCol>3
ef80: 32 37 36 37 20 29 20 6e 43 6f 6c 20 3d 20 33 32  2767 ) nCol = 32
ef90: 37 36 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  767;.  }else{.  
efa0: 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20    nCol = 0;.    
efb0: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  aCol = 0;.  }.  
efc0: 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 28 69  assert( nCol==(i
efd0: 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70 6e  16)nCol );.  *pn
efe0: 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70  Col = nCol;.  *p
eff0: 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20  aCol = aCol;..  
f000: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43  for(i=0, pCol=aC
f010: 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 21 64  ol; i<nCol && !d
f020: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b  b->mallocFailed;
f030: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
f040: 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70     /* Get an app
f050: 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f  ropriate name fo
f060: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20  r the column.   
f070: 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 7a 4e 61   */.    if( (zNa
f080: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
f090: 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ].zName)!=0 ){. 
f0a0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
f0b0: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
f0c0: 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68  n "AS <name>" ph
f0d0: 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e  rase, use <name>
f0e0: 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a   as the name */.
f0f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f100: 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20   Expr *pColExpr 
f110: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
f120: 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d  pCollate(pEList-
f130: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
f140: 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45      while( pColE
f150: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  xpr->op==TK_DOT 
f160: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45  ){.        pColE
f170: 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  xpr = pColExpr->
f180: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
f190: 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72  assert( pColExpr
f1a0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  !=0 );.      }. 
f1b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
f1c0: 6c 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  lExpr->op!=TK_AG
f1d0: 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
f1e0: 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e    if( pColExpr->
f1f0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
f200: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  .        /* For 
f210: 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20  columns use the 
f220: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65  column name name
f230: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
f240: 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d  iCol = pColExpr-
f250: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
f260: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
f270: 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 3b 0a  pColExpr->pTab;.
f280: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f290: 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20  pTab!=0 );.     
f2a0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
f2b0: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
f2c0: 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ey;.        zNam
f2d0: 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54  e = iCol>=0 ? pT
f2e0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
f2f0: 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 3b 0a  Name : "rowid";.
f300: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f310: 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
f320: 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _ID ){.        a
f330: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
f340: 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72  roperty(pColExpr
f350: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
f360: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
f370: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54  = pColExpr->u.zT
f380: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73  oken;.      }els
f390: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73  e{.        /* Us
f3a0: 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  e the original t
f3b0: 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ext of the colum
f3c0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20  n expression as 
f3d0: 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  its name */.    
f3e0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69      zName = pELi
f3f0: 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a  st->a[i].zSpan;.
f400: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f410: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
f420: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
f430: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
f440: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
f450: 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20  se{.      zName 
f460: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
f470: 28 64 62 2c 22 63 6f 6c 75 6d 6e 25 64 22 2c 69  (db,"column%d",i
f480: 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  +1);.    }..    
f490: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
f4a0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
f4b0: 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20  unique.  If the 
f4c0: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71  name is not uniq
f4d0: 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e  ue,.    ** appen
f4e0: 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74 6f 20  d an integer to 
f4f0: 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74  the name so that
f500: 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71   it becomes uniq
f510: 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ue..    */.    c
f520: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  nt = 0;.    whil
f530: 65 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69  e( zName && sqli
f540: 74 65 33 48 61 73 68 46 69 6e 64 28 26 68 74 2c  te3HashFind(&ht,
f550: 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20   zName)!=0 ){.  
f560: 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69      nName = sqli
f570: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
f580: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e  e);.      if( nN
f590: 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ame>0 ){.       
f5a0: 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20   for(j=nName-1; 
f5b0: 6a 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49 73  j>0 && sqlite3Is
f5c0: 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b  digit(zName[j]);
f5d0: 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20   j--){}.        
f5e0: 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a  if( zName[j]==':
f5f0: 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20  ' ) nName = j;. 
f600: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61       }.      zNa
f610: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
f620: 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a 3a 25 75  ntf(db, "%.*z:%u
f630: 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  ", nName, zName,
f640: 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 69   ++cnt);.      i
f650: 66 28 20 63 6e 74 3e 33 20 29 20 73 71 6c 69 74  f( cnt>3 ) sqlit
f660: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
f670: 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63 6e 74 29  zeof(cnt), &cnt)
f680: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c  ;.    }.    pCol
f690: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
f6a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
f6b0: 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d  mnPropertiesFrom
f6c0: 4e 61 6d 65 28 30 2c 20 70 43 6f 6c 29 3b 0a 20  Name(0, pCol);. 
f6d0: 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20     if( zName && 
f6e0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
f6f0: 74 28 26 68 74 2c 20 7a 4e 61 6d 65 2c 20 70 43  t(&ht, zName, pC
f700: 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20 20 20  ol)==pCol ){.   
f710: 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
f720: 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  lt(db);.    }.  
f730: 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43  }.  sqlite3HashC
f740: 6c 65 61 72 28 26 68 74 29 3b 0a 20 20 69 66 28  lear(&ht);.  if(
f750: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
f760: 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  d ){.    for(j=0
f770: 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
f780: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
f790: 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  (db, aCol[j].zNa
f7a0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  me);.    }.    s
f7b0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
f7c0: 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43   aCol);.    *paC
f7d0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43  ol = 0;.    *pnC
f7e0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  ol = 0;.    retu
f7f0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
f800: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
f810: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f820: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20  ./*.** Add type 
f830: 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e  and collation in
f840: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63  formation to a c
f850: 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64  olumn list based
f860: 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20   on.** a SELECT 
f870: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a  statement..** .*
f880: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
f890: 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d  t presumably cam
f8a0: 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c  e from selectCol
f8b0: 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72  umnNamesFromExpr
f8c0: 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63  List()..** The c
f8d0: 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f  olumn list has o
f8e0: 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74  nly names, not t
f8f0: 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f  ypes or collatio
f900: 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ns.  This.** rou
f910: 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67  tine goes throug
f920: 68 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74  h and adds the t
f930: 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69  ypes and collati
f940: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
f950: 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73  routine requires
f960: 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69   that all identi
f970: 66 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c  fiers in the SEL
f980: 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ECT.** statement
f990: 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f   be resolved..*/
f9a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
f9b0: 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
f9c0: 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  AndCollation(.  
f9d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
f9e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
f9f0: 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54   contexts */.  T
fa00: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
fa10: 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75       /* Add colu
fa20: 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74  mn type informat
fa30: 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ion to this tabl
fa40: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
fa50: 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20  Select       /* 
fa60: 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64  SELECT used to d
fa70: 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61  etermine types a
fa80: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f  nd collations */
fa90: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
faa0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
fab0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
fac0: 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  C;.  Column *pCo
fad0: 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  l;.  CollSeq *pC
fae0: 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  oll;.  int i;.  
faf0: 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63  Expr *p;.  struc
fb00: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
fb10: 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *a;..  assert( p
fb20: 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61  Select!=0 );.  a
fb30: 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d  ssert( (pSelect-
fb40: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
fb50: 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20  esolved)!=0 );. 
fb60: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
fb70: 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45  Col==pSelect->pE
fb80: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64  List->nExpr || d
fb90: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
fba0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
fbb0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
fbc0: 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e  rn;.  memset(&sN
fbd0: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
fbe0: 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  ));.  sNC.pSrcLi
fbf0: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
fc00: 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63  rc;.  a = pSelec
fc10: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20  t->pEList->a;.  
fc20: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(i=0, pCol=pT
fc30: 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62  ab->aCol; i<pTab
fc40: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
fc50: 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  l++){.    const 
fc60: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20  char *zType;.   
fc70: 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20 20 70   int n, m;.    p
fc80: 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20   = a[i].pExpr;. 
fc90: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
fca0: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
fcb0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20  , 0, 0);.    /* 
fcc0: 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 2e 2e  pCol->szEst = ..
fcd0: 2e 20 2f 2f 20 43 6f 6c 75 6d 6e 20 73 69 7a 65  . // Column size
fce0: 20 65 73 74 20 66 6f 72 20 53 45 4c 45 43 54 20   est for SELECT 
fcf0: 74 61 62 6c 65 73 20 6e 65 76 65 72 20 75 73 65  tables never use
fd00: 64 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61  d */.    pCol->a
fd10: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
fd20: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29  3ExprAffinity(p)
fd30: 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 20  ;.    if( zType 
fd40: 29 7b 0a 20 20 20 20 20 20 6d 20 3d 20 73 71 6c  ){.      m = sql
fd50: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79  ite3Strlen30(zTy
fd60: 70 65 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  pe);.      n = s
fd70: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
fd80: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
fd90: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
fda0: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
fdb0: 63 4f 72 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  cOrFree(db, pCol
fdc0: 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b 32 29 3b  ->zName, n+m+2);
fdd0: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d  .      if( pCol-
fde0: 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  >zName ){.      
fdf0: 20 20 6d 65 6d 63 70 79 28 26 70 43 6f 6c 2d 3e    memcpy(&pCol->
fe00: 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a 54 79 70  zName[n+1], zTyp
fe10: 65 2c 20 6d 2b 31 29 3b 0a 20 20 20 20 20 20 20  e, m+1);.       
fe20: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
fe30: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59  |= COLFLAG_HASTY
fe40: 50 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PE;.      }.    
fe50: 7d 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e  }.    if( pCol->
fe60: 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43  affinity==0 ) pC
fe70: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
fe80: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
fe90: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
fea0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
feb0: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
fec0: 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c  f( pColl && pCol
fed0: 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ->zColl==0 ){.  
fee0: 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20      pCol->zColl 
fef0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
ff00: 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p(db, pColl->zNa
ff10: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
ff20: 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
ff30: 3d 20 31 3b 20 2f 2a 20 41 6e 79 20 6e 6f 6e 2d  = 1; /* Any non-
ff40: 7a 65 72 6f 20 76 61 6c 75 65 20 77 6f 72 6b 73  zero value works
ff50: 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   */.}../*.** Giv
ff60: 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
ff70: 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
ff80: 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
ff90: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
ffa0: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
ffb0: 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
ffc0: 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
ffd0: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
ffe0: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
fff0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
10000 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
10010 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  pTab;.  sqlite3 
10020 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
10030 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61  ;.  int savedFla
10040 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67  gs;..  savedFlag
10050 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  s = db->flags;. 
10060 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
10070 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
10080 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  es;.  db->flags 
10090 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43  |= SQLITE_ShortC
100a0 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74  olNames;.  sqlit
100b0 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
100c0 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29  rse, pSelect, 0)
100d0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
100e0 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b  nErr ) return 0;
100f0 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63  .  while( pSelec
10100 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  t->pPrior ) pSel
10110 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ect = pSelect->p
10120 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61  Prior;.  db->fla
10130 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b  gs = savedFlags;
10140 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
10150 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
10160 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  , sizeof(Table) 
10170 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
10180 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
10190 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
101a0 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
101b0 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c  fSelect() is onl
101c0 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74  y used n context
101d0 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64  s where lookasid
101e0 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c  e.  ** is disabl
101f0 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
10200 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
10210 69 73 61 62 6c 65 20 29 3b 0a 20 20 70 54 61 62  isable );.  pTab
10220 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20  ->nTabRef = 1;. 
10230 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30   pTab->zName = 0
10240 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  ;.  pTab->nRowLo
10250 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
10260 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
10270 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
10280 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  );.  sqlite3Colu
10290 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
102a0 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d  pParse, pSelect-
102b0 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e  >pEList, &pTab->
102c0 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
102d0 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  l);.  sqlite3Sel
102e0 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
102f0 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
10300 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 65  rse, pTab, pSele
10310 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b  ct);.  pTab->iPK
10320 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64  ey = -1;.  if( d
10330 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
10340 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
10350 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
10360 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ab);.    return 
10370 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
10380 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pTab;.}../*.** G
10390 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
103a0 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
103b0 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
103c0 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
103d0 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
103e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
103f0 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
10400 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
10410 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62  n pParse..*/.Vdb
10420 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62  e *sqlite3GetVdb
10430 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
10440 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
10450 70 56 64 62 65 20 29 7b 0a 20 20 20 20 72 65 74  pVdbe ){.    ret
10460 75 72 6e 20 70 50 61 72 73 65 2d 3e 70 56 64 62  urn pParse->pVdb
10470 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
10480 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d  rse->pToplevel==
10490 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61  0.   && Optimiza
104a0 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72  tionEnabled(pPar
104b0 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46 61  se->db,SQLITE_Fa
104c0 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20 20  ctorOutConst).  
104d0 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6f  ){.    pParse->o
104e0 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20 31  kConstFactor = 1
104f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
10500 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65  qlite3VdbeCreate
10510 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a  (pParse);.}.../*
10520 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
10530 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
10540 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  et fields of the
10550 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e   SELECT based on
10560 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 65   the.** pLimit e
10570 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69  xpressions.  pLi
10580 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  mit->pLeft and p
10590 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20 68 6f  Limit->pRight ho
105a0 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
105b0 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61  ns.** that appea
105c0 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  r in the origina
105d0 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
105e0 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20  after the LIMIT 
105f0 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65  and OFFSET.** ke
10600 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c  ywords.  Or NULL
10610 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72   if those keywor
10620 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20  ds are omitted. 
10630 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
10640 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69  et .** are the i
10650 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65  nteger memory re
10660 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66  gister numbers f
10670 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  or counters used
10680 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20   to compute .** 
10690 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  the limit and of
106a0 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20  fset.  If there 
106b0 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f  is no limit and/
106c0 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20  or offset, then 
106d0 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  .** iLimit and i
106e0 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74  Offset are negat
106f0 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ive..**.** This 
10700 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20  routine changes 
10710 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c  the values of iL
10720 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
10730 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69   only if.** a li
10740 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73  mit or offset is
10750 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d   defined by pLim
10760 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4c  it->pLeft and pL
10770 69 6d 69 74 2d 3e 70 52 69 67 68 74 2e 20 20 69  imit->pRight.  i
10780 4c 69 6d 69 74 0a 2a 2a 20 61 6e 64 20 69 4f 66  Limit.** and iOf
10790 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65  fset should have
107a0 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20   been preset to 
107b0 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61  appropriate defa
107c0 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72 6f  ult values (zero
107d0 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
107e0 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
107f0 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f  ne..**.** The iO
10800 66 66 73 65 74 20 72 65 67 69 73 74 65 72 20 28  ffset register (
10810 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
10820 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
10830 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  the value.** of 
10840 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68 65  the OFFSET.  The
10850 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72   iLimit register
10860 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
10870 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69 73  to LIMIT.  Regis
10880 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b 31  ter.** iOffset+1
10890 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
108a0 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e  to LIMIT+OFFSET.
108b0 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70  .**.** Only if p
108c0 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30 20  Limit->pLeft!=0 
108d0 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67  do the limit reg
108e0 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65  isters get.** re
108f0 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e  defined.  The UN
10900 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
10910 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70 65   uses this prope
10920 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20  rty to force.** 
10930 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68 65  the reuse of the
10940 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20   same limit and 
10950 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 73  offset registers
10960 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65   across multiple
10970 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
10980 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ments..*/.static
10990 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d   void computeLim
109a0 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72 73  itRegisters(Pars
109b0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
109c0 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b  t *p, int iBreak
109d0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30  ){.  Vdbe *v = 0
109e0 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d  ;.  int iLimit =
109f0 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65   0;.  int iOffse
10a00 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 45 78  t;.  int n;.  Ex
10a10 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  pr *pLimit = p->
10a20 70 4c 69 6d 69 74 3b 0a 0a 20 20 69 66 28 20 70  pLimit;..  if( p
10a30 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->iLimit ) retur
10a40 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22  n;..  /* .  ** "
10a50 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73  LIMIT -1" always
10a60 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e   shows all rows.
10a70 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a    There is some.
10a80 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79    ** controversy
10a90 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20   about what the 
10aa0 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72  correct behavior
10ab0 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a   should be..  **
10ac0 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   The current imp
10ad0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65  lementation inte
10ae0 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22  rprets "LIMIT 0"
10af0 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f   to mean.  ** no
10b00 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71   rows..  */.  sq
10b10 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
10b20 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69  ear(pParse);.  i
10b30 66 28 20 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  f( pLimit ){.   
10b40 20 61 73 73 65 72 74 28 20 70 4c 69 6d 69 74 2d   assert( pLimit-
10b50 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d 49 54 20 29 3b  >op==TK_LIMIT );
10b60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
10b70 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b  mit->pLeft!=0 );
10b80 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  .    p->iLimit =
10b90 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72   iLimit = ++pPar
10ba0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20  se->nMem;.    v 
10bb0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
10bc0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61 73  (pParse);.    as
10bd0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
10be0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
10bf0 72 49 73 49 6e 74 65 67 65 72 28 70 4c 69 6d 69  rIsInteger(pLimi
10c00 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 29 20 29 7b  t->pLeft, &n) ){
10c10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10c20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
10c30 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69  nteger, n, iLimi
10c40 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
10c50 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
10c60 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
10c70 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
10c80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10c90 62 65 47 6f 74 6f 28 76 2c 20 69 42 72 65 61 6b  beGoto(v, iBreak
10ca0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
10cb0 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e 53  f( n>=0 && p->nS
10cc0 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69 74 65 33  electRow>sqlite3
10cd0 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29 20 29  LogEst((u64)n) )
10ce0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65  {.        p->nSe
10cf0 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
10d00 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29 3b  3LogEst((u64)n);
10d10 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46  .        p->selF
10d20 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69 78 65 64  lags |= SF_Fixed
10d30 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Limit;.      }. 
10d40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10d50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
10d60 70 50 61 72 73 65 2c 20 70 4c 69 6d 69 74 2d 3e  pParse, pLimit->
10d70 70 4c 65 66 74 2c 20 69 4c 69 6d 69 74 29 3b 0a  pLeft, iLimit);.
10d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10d90 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
10da0 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29  stBeInt, iLimit)
10db0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
10dc0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
10dd0 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20  ment((v, "LIMIT 
10de0 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
10df0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10e00 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op2(v, OP_IfNot,
10e10 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29   iLimit, iBreak)
10e20 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
10e30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
10e40 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20   pLimit->pRight 
10e50 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  ){.      p->iOff
10e60 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20  set = iOffset = 
10e70 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
10e80 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
10e90 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63  em++;   /* Alloc
10ea0 61 74 65 20 61 6e 20 65 78 74 72 61 20 72 65 67  ate an extra reg
10eb0 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b  ister for limit+
10ec0 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  offset */.      
10ed0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
10ee0 70 50 61 72 73 65 2c 20 70 4c 69 6d 69 74 2d 3e  pParse, pLimit->
10ef0 70 52 69 67 68 74 2c 20 69 4f 66 66 73 65 74 29  pRight, iOffset)
10f00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10f10 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
10f20 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73  MustBeInt, iOffs
10f30 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  et); VdbeCoverag
10f40 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
10f50 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46  Comment((v, "OFF
10f60 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  SET counter"));.
10f70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10f80 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66  eAddOp3(v, OP_Of
10f90 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c 69 6d 69  fsetLimit, iLimi
10fa0 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c 20 69 4f  t, iOffset+1, iO
10fb0 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  ffset);.      Vd
10fc0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
10fd0 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a  IMIT+OFFSET"));.
10fe0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
10ff0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11000 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
11010 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
11020 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
11030 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
11040 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68   for the iCol-th
11050 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
11060 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72  e result set for
11070 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65   the compound-se
11080 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22  lect statement "
11090 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  p".  Return NULL
110a0 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   if.** the colum
110b0 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74  n has no default
110c0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
110d0 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  nce..**.** The c
110e0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
110f0 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  e for the compou
11100 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b  nd select is tak
11110 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c  en from the.** l
11120 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
11130 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74   the select that
11140 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
11150 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74   sequence..*/.st
11160 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75  atic CollSeq *mu
11170 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
11180 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11190 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
111a0 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  Col){.  CollSeq 
111b0 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e  *pRet;.  if( p->
111c0 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52  pPrior ){.    pR
111d0 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  et = multiSelect
111e0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
111f0 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29  p->pPrior, iCol)
11200 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
11210 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  Ret = 0;.  }.  a
11220 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29  ssert( iCol>=0 )
11230 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d 75 73 74  ;.  /* iCol must
11240 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 70 2d   be less than p-
11250 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2e 20  >pEList->nExpr. 
11260 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   Otherwise an er
11270 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 68  ror would.  ** h
11280 61 76 65 20 62 65 65 6e 20 74 68 72 6f 77 6e 20  ave been thrown 
11290 64 75 72 69 6e 67 20 6e 61 6d 65 20 72 65 73 6f  during name reso
112a0 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65 20 77 6f  lution and we wo
112b0 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 67 6f 74  uld not have got
112c0 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66 61  ten.  ** this fa
112d0 72 20 2a 2f 0a 20 20 69 66 28 20 70 52 65 74 3d  r */.  if( pRet=
112e0 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f  =0 && ALWAYS(iCo
112f0 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  l<p->pEList->nEx
11300 70 72 29 20 29 7b 0a 20 20 20 20 70 52 65 74 20  pr) ){.    pRet 
11310 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
11320 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
11330 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
11340 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
11350 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
11360 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73  .** The select s
11370 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
11380 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
11390 72 61 6d 65 74 65 72 20 69 73 20 61 20 63 6f 6d  rameter is a com
113a0 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20  pound SELECT.** 
113b0 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
113c0 20 63 6c 61 75 73 65 2e 20 54 68 69 73 20 66 75   clause. This fu
113d0 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
113e0 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 4b   and returns a K
113f0 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  eyInfo.** struct
11400 75 72 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ure suitable for
11410 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
11420 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a  e ORDER BY..**.*
11430 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
11440 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
11450 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65  cture is obtaine
11460 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54  d from malloc. T
11470 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
11480 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
11490 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69  sible for ensuri
114a0 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
114b0 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
114c0 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a  ally.** freed..*
114d0 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
114e0 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64   *multiSelectOrd
114f0 65 72 42 79 4b 65 79 49 6e 66 6f 28 50 61 72 73  erByKeyInfo(Pars
11500 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
11510 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72 61  t *p, int nExtra
11520 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
11530 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
11540 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72  derBy;.  int nOr
11550 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
11560 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71  rBy->nExpr;.  sq
11570 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
11580 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66  se->db;.  KeyInf
11590 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65  o *pRet = sqlite
115a0 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
115b0 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74 72  , nOrderBy+nExtr
115c0 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 52 65  a, 1);.  if( pRe
115d0 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
115e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
115f0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
11600 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
11610 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
11620 20 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b   = &pOrderBy->a[
11630 69 5d 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  i];.      Expr *
11640 70 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70  pTerm = pItem->p
11650 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  Expr;.      Coll
11660 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20  Seq *pColl;..   
11670 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c     if( pTerm->fl
11680 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
11690 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
116a0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
116b0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
116c0 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Term);.      }el
116d0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  se{.        pCol
116e0 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
116f0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
11700 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  , pItem->u.x.iOr
11710 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20  derByCol-1);.   
11720 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
11730 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  0 ) pColl = db->
11740 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
11750 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
11760 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20 20  ].pExpr =.      
11770 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
11780 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28  ddCollateString(
11790 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
117a0 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
117b0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
117c0 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
117d0 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 52  foIsWriteable(pR
117e0 65 74 29 20 29 3b 0a 20 20 20 20 20 20 70 52 65  et) );.      pRe
117f0 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43  t->aColl[i] = pC
11800 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  oll;.      pRet-
11810 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
11820 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
11830 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
11840 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
11850 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Ret;.}..#ifndef 
11860 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
11870 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
11880 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56 44 42  ne generates VDB
11890 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74  E code to comput
118a0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
118b0 20 61 20 57 49 54 48 20 52 45 43 55 52 53 49 56   a WITH RECURSIV
118c0 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68  E.** query of th
118d0 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
118e0 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65  <recursive-table
118f0 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75 65  > AS (<setup-que
11900 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20  ry> UNION [ALL] 
11910 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79  <recursive-query
11920 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  >).**           
11930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
11940 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
11950 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
11960 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20  ________/.**    
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119a0 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a        p.**.**.**
119b0 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74 6c   There is exactl
119c0 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20  y one reference 
119d0 74 6f 20 74 68 65 20 72 65 63 75 72 73 69 76 65  to the recursive
119e0 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52  -table in the FR
119f0 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20  OM clause.** of 
11a00 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 2c  recursive-query,
11a10 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68 65   marked with the
11a20 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 66 67   SrcList->a[].fg
11a30 2e 69 73 52 65 63 75 72 73 69 76 65 20 66 6c 61  .isRecursive fla
11a40 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74  g..**.** The set
11a50 75 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f 6e  up-query runs on
11a60 63 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ce to generate a
11a70 6e 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f 66  n initial set of
11a80 20 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a   rows that go.**
11a90 20 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74 61   into a Queue ta
11aa0 62 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20 65  ble.  Rows are e
11ab0 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
11ac0 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f 6e  e Queue table on
11ad0 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61  e by.** one.  Ea
11ae0 63 68 20 72 6f 77 20 65 78 74 72 61 63 74 65 64  ch row extracted
11af0 20 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20 6f   from Queue is o
11b00 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20  utput to pDest. 
11b10 20 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c 65   Then the single
11b20 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72 6f  .** extracted ro
11b30 77 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69 43  w (now in the iC
11b40 75 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62 65  urrent table) be
11b50 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  comes the conten
11b60 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 75  t of the.** recu
11b70 72 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72 20  rsive-table for 
11b80 61 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72  a recursive-quer
11b90 79 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74 70  y run.  The outp
11ba0 75 74 20 6f 66 20 74 68 65 20 72 65 63 75 72 73  ut of the recurs
11bb0 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20  ive-query.** is 
11bc0 61 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  added back into 
11bd0 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e  the Queue table.
11be0 20 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20 72    Then another r
11bf0 6f 77 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ow is extracted 
11c00 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e  from Queue.** an
11c10 64 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20  d the iteration 
11c20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c 20  continues until 
11c30 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
11c40 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  is empty..**.** 
11c50 49 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  If the compound 
11c60 71 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20 69  query operator i
11c70 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20  s UNION then no 
11c80 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 61  duplicate rows a
11c90 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72  re ever.** inser
11ca0 74 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75 65  ted into the Que
11cb0 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 69  ue table.  The i
11cc0 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6b  Distinct table k
11cd0 65 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20 61  eeps a copy of a
11ce0 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20  ll rows.** that 
11cf0 68 61 76 65 20 65 76 65 72 20 62 65 65 6e 20 69  have ever been i
11d00 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75 65  nserted into Que
11d10 75 65 20 61 6e 64 20 63 61 75 73 65 73 20 64 75  ue and causes du
11d20 70 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a 2a  plicates to be.*
11d30 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66  * discarded.  If
11d40 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73   the operator is
11d50 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e   UNION ALL, then
11d60 20 64 75 70 6c 69 63 61 74 65 73 20 61 72 65 20   duplicates are 
11d70 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20  allowed..** .** 
11d80 49 66 20 74 68 65 20 71 75 65 72 79 20 68 61 73  If the query has
11d90 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68   an ORDER BY, th
11da0 65 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  en entries in th
11db0 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 61 72  e Queue table ar
11dc0 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44  e kept in.** ORD
11dd0 45 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64 20  ER BY order and 
11de0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
11df0 69 73 20 65 78 74 72 61 63 74 65 64 20 66 6f 72  is extracted for
11e00 20 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57 69   each cycle.  Wi
11e10 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45  thout.** an ORDE
11e20 52 20 42 59 2c 20 74 68 65 20 51 75 65 75 65 20  R BY, the Queue 
11e30 74 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61 20  table is just a 
11e40 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  FIFO..**.** If a
11e50 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69 73   LIMIT clause is
11e60 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e 20   provided, then 
11e70 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73 74  the iteration st
11e80 6f 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54 20  ops after LIMIT 
11e90 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65 65  rows.** have bee
11ea0 6e 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  n output to pDes
11eb0 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a  t.  A LIMIT of z
11ec0 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74  ero means to out
11ed0 70 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20  put no rows and 
11ee0 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c 49  a.** negative LI
11ef0 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74  MIT means to out
11f00 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49  put all rows.  I
11f10 66 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f 20  f there is also 
11f20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  an OFFSET clause
11f30 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69 74  .** with a posit
11f40 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  ive value, then 
11f50 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54  the first OFFSET
11f60 20 6f 75 74 70 75 74 73 20 61 72 65 20 64 69 73   outputs are dis
11f70 63 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a 2a  carded rather.**
11f80 20 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e 74   than being sent
11f90 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 20   to pDest.  The 
11fa0 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65 73  LIMIT count does
11fb0 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69 6c   not begin until
11fc0 20 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a   after OFFSET.**
11fd0 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
11fe0 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  skipped..*/.stat
11ff0 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
12000 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65  WithRecursiveQue
12010 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ry(.  Parse *pPa
12020 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
12030 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
12040 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
12050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12060 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43   recursive SELEC
12070 54 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  T to be coded */
12080 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
12090 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
120a0 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
120b0 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
120c0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
120d0 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20 20  = p->pSrc;      
120e0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
120f0 73 65 20 6f 66 20 74 68 65 20 72 65 63 75 72 73  se of the recurs
12100 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ive query */.  i
12110 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c  nt nCol = p->pEL
12120 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20  ist->nExpr;  /* 
12130 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
12140 73 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69  s in the recursi
12150 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64  ve table */.  Vd
12160 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
12170 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54  pVdbe;      /* T
12180 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
12190 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
121a0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  truction */.  Se
121b0 6c 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20 70  lect *pSetup = p
121c0 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54  ->pPrior;   /* T
121d0 68 65 20 73 65 74 75 70 20 71 75 65 72 79 20 2a  he setup query *
121e0 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b  /.  int addrTop;
121f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12200 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
12210 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
12220 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61  drCont, addrBrea
12230 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49  k;      /* CONTI
12240 4e 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61 64  NUE and BREAK ad
12250 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74  dresses */.  int
12260 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20   iCurrent = 0;  
12270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12280 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e Current table 
12290 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72 72  */.  int regCurr
122a0 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
122b0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
122c0 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20 74  olding Current t
122d0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51  able */.  int iQ
122e0 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 20 20  ueue;           
122f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 51          /* The Q
12300 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ueue table */.  
12310 69 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d 20  int iDistinct = 
12320 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
12330 20 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71 75   To ensure uniqu
12340 65 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e 49  e results if UNI
12350 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ON */.  int eDes
12360 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20 20  t = SRT_Fifo;   
12370 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
12380 77 72 69 74 65 20 74 6f 20 51 75 65 75 65 20 2a  write to Queue *
12390 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
123a0 65 73 74 51 75 65 75 65 3b 20 20 20 20 20 20 20  estQueue;       
123b0 20 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74 20    /* SelectDest 
123c0 74 61 72 67 65 74 74 69 6e 67 20 74 68 65 20 51  targetting the Q
123d0 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ueue table */.  
123e0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
123f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12400 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
12410 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12430 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12440 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
12450 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
12460 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
12470 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
12480 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20  xpr *pLimit;    
12490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
124a0 53 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64 20  Saved LIMIT and 
124b0 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20  OFFSET */.  int 
124c0 72 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66  regLimit, regOff
124d0 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65 67  set;      /* Reg
124e0 69 73 74 65 72 73 20 75 73 65 64 20 62 79 20 4c  isters used by L
124f0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
12500 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  */..  /* Obtain 
12510 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f  authorization to
12520 20 64 6f 20 61 20 72 65 63 75 72 73 69 76 65 20   do a recursive 
12530 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 73  query */.  if( s
12540 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
12550 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52  pParse, SQLITE_R
12560 45 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c 20  ECURSIVE, 0, 0, 
12570 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
12580 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 4c  /* Process the L
12590 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
125a0 63 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65 79  clauses, if they
125b0 20 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64 72   exist */.  addr
125c0 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
125d0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
125e0 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  .  p->nSelectRow
125f0 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20 62 69   = 320;  /* 4 bi
12600 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20 20  llion rows */.  
12610 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
12620 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
12630 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 70   addrBreak);.  p
12640 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
12650 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20  t;.  regLimit = 
12660 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67  p->iLimit;.  reg
12670 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
12680 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  set;.  p->pLimit
12690 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69   = 0;.  p->iLimi
126a0 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  t = p->iOffset =
126b0 20 30 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d   0;.  pOrderBy =
126c0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20   p->pOrderBy;.. 
126d0 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63   /* Locate the c
126e0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
126f0 74 68 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c  the Current tabl
12700 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  e */.  for(i=0; 
12710 41 4c 57 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e  ALWAYS(i<pSrc->n
12720 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Src); i++){.    
12730 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 66  if( pSrc->a[i].f
12740 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 29 7b  g.isRecursive ){
12750 0a 20 20 20 20 20 20 69 43 75 72 72 65 6e 74 20  .      iCurrent 
12760 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75  = pSrc->a[i].iCu
12770 72 73 6f 72 3b 0a 20 20 20 20 20 20 62 72 65 61  rsor;.      brea
12780 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
12790 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73  /* Allocate curs
127a0 6f 72 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  ors numbers for 
127b0 51 75 65 75 65 20 61 6e 64 20 44 69 73 74 69 6e  Queue and Distin
127c0 63 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  ct.  The cursor 
127d0 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20  number for.  ** 
127e0 74 68 65 20 44 69 73 74 69 6e 63 74 20 74 61 62  the Distinct tab
127f0 6c 65 20 6d 75 73 74 20 62 65 20 65 78 61 63 74  le must be exact
12800 6c 79 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74  ly one greater t
12810 68 61 6e 20 51 75 65 75 65 20 69 6e 20 6f 72 64  han Queue in ord
12820 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
12830 53 52 54 5f 44 69 73 74 46 69 66 6f 20 61 6e 64  SRT_DistFifo and
12840 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 64   SRT_DistQueue d
12850 65 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77  estinations to w
12860 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65  ork. */.  iQueue
12870 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
12880 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  +;.  if( p->op==
12890 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
128a0 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79  eDest = pOrderBy
128b0 20 3f 20 53 52 54 5f 44 69 73 74 51 75 65 75 65   ? SRT_DistQueue
128c0 20 3a 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3b   : SRT_DistFifo;
128d0 0a 20 20 20 20 69 44 69 73 74 69 6e 63 74 20 3d  .    iDistinct =
128e0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
128f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 44  .  }else{.    eD
12900 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f  est = pOrderBy ?
12910 20 53 52 54 5f 51 75 65 75 65 20 3a 20 53 52 54   SRT_Queue : SRT
12920 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20 73 71 6c  _Fifo;.  }.  sql
12930 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
12940 69 74 28 26 64 65 73 74 51 75 65 75 65 2c 20 65  it(&destQueue, e
12950 44 65 73 74 2c 20 69 51 75 65 75 65 29 3b 0a 0a  Dest, iQueue);..
12960 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75    /* Allocate cu
12970 72 73 6f 72 73 20 66 6f 72 20 43 75 72 72 65 6e  rsors for Curren
12980 74 2c 20 51 75 65 75 65 2c 20 61 6e 64 20 44 69  t, Queue, and Di
12990 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72 65 67  stinct. */.  reg
129a0 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50 61 72  Current = ++pPar
129b0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
129c0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
129d0 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
129e0 69 43 75 72 72 65 6e 74 2c 20 72 65 67 43 75 72  iCurrent, regCur
129f0 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69  rent, nCol);.  i
12a00 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
12a10 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
12a20 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Info = multiSele
12a30 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f  ctOrderByKeyInfo
12a40 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a  (pParse, p, 1);.
12a50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12a60 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
12a70 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75  Ephemeral, iQueu
12a80 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  e, pOrderBy->nEx
12a90 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20  pr+2, 0,.       
12aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
12ab0 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
12ac0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
12ad0 20 64 65 73 74 51 75 65 75 65 2e 70 4f 72 64 65   destQueue.pOrde
12ae0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
12af0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
12b00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12b10 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
12b20 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43 6f 6c  al, iQueue, nCol
12b30 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43 6f 6d  );.  }.  VdbeCom
12b40 6d 65 6e 74 28 28 76 2c 20 22 51 75 65 75 65 20  ment((v, "Queue 
12b50 74 61 62 6c 65 22 29 29 3b 0a 20 20 69 66 28 20  table"));.  if( 
12b60 69 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  iDistinct ){.   
12b70 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
12b80 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62  [0] = sqlite3Vdb
12b90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
12ba0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 44 69  enEphemeral, iDi
12bb0 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20 20  stinct, 0);.    
12bc0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
12bd0 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
12be0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 61 63  .  }..  /* Detac
12bf0 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  h the ORDER BY c
12c00 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 63  lause from the c
12c10 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a  ompound SELECT *
12c20 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  /.  p->pOrderBy 
12c30 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72 65  = 0;..  /* Store
12c40 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
12c50 74 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20  the setup-query 
12c60 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20 20 70  in Queue. */.  p
12c70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 30  Setup->pNext = 0
12c80 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
12c90 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
12ca0 53 65 74 75 70 2c 20 26 64 65 73 74 51 75 65 75  Setup, &destQueu
12cb0 65 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e  e);.  pSetup->pN
12cc0 65 78 74 20 3d 20 70 3b 0a 20 20 69 66 28 20 72  ext = p;.  if( r
12cd0 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f  c ) goto end_of_
12ce0 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79 3b  recursive_query;
12cf0 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
12d00 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65 20  next row in the 
12d10 51 75 65 75 65 20 61 6e 64 20 6f 75 74 70 75 74  Queue and output
12d20 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61   that row */.  a
12d30 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
12d40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12d50 5f 52 65 77 69 6e 64 2c 20 69 51 75 65 75 65 2c  _Rewind, iQueue,
12d60 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62   addrBreak); Vdb
12d70 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
12d80 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65   /* Transfer the
12d90 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 51 75 65   next row in Que
12da0 75 65 20 6f 76 65 72 20 74 6f 20 43 75 72 72 65  ue over to Curre
12db0 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  nt */.  sqlite3V
12dc0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
12dd0 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e  NullRow, iCurren
12de0 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74 20  t); /* To reset 
12df0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a  column cache */.
12e00 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
12e10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
12e20 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
12e30 6c 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f  lumn, iQueue, pO
12e40 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c  rderBy->nExpr+1,
12e50 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20   regCurrent);.  
12e60 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
12e70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12e80 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 51 75 65  OP_RowData, iQue
12e90 75 65 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b  ue, regCurrent);
12ea0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
12eb0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44  beAddOp1(v, OP_D
12ec0 65 6c 65 74 65 2c 20 69 51 75 65 75 65 29 3b 0a  elete, iQueue);.
12ed0 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65  .  /* Output the
12ee0 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43   single row in C
12ef0 75 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72  urrent */.  addr
12f00 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
12f10 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
12f20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
12f30 72 65 67 4f 66 66 73 65 74 2c 20 61 64 64 72 43  regOffset, addrC
12f40 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e  ont);.  selectIn
12f50 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
12f60 70 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20 20  p, iCurrent,.   
12f70 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20     0, 0, pDest, 
12f80 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72  addrCont, addrBr
12f90 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67 4c  eak);.  if( regL
12fa0 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
12fb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12fc0 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
12fd0 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61 64 64 72  , regLimit, addr
12fe0 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65  Break);.    Vdbe
12ff0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
13000 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
13010 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
13020 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45  drCont);..  /* E
13030 78 65 63 75 74 65 20 74 68 65 20 72 65 63 75 72  xecute the recur
13040 73 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b 69  sive SELECT taki
13050 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f  ng the single ro
13060 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73 0a  w in Current as.
13070 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66    ** the value f
13080 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65  or the recursive
13090 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74 68  -table. Store th
130a0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
130b0 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 69   Queue..  */.  i
130c0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
130d0 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b   SF_Aggregate ){
130e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
130f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 65  rMsg(pParse, "re
13100 63 75 72 73 69 76 65 20 61 67 67 72 65 67 61 74  cursive aggregat
13110 65 20 71 75 65 72 69 65 73 20 6e 6f 74 20 73 75  e queries not su
13120 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 7d 65 6c  pported");.  }el
13130 73 65 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f  se{.    p->pPrio
13140 72 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  r = 0;.    sqlit
13150 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
13160 20 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b   p, &destQueue);
13170 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
13180 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 20  pPrior==0 );.   
13190 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 53 65   p->pPrior = pSe
131a0 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4b  tup;.  }..  /* K
131b0 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  eep running the 
131c0 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65 20 51  loop until the Q
131d0 75 65 75 65 20 69 73 20 65 6d 70 74 79 20 2a 2f  ueue is empty */
131e0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f  .  sqlite3VdbeGo
131f0 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a  to(v, addrTop);.
13200 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
13210 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
13220 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66  rBreak);..end_of
13230 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79  _recursive_query
13240 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  :.  sqlite3ExprL
13250 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
13260 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  ->db, p->pOrderB
13270 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42  y);.  p->pOrderB
13280 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
13290 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
132a0 69 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  it;.  return;.}.
132b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
132c0 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a  _OMIT_CTE */../*
132d0 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
132e0 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ces */.static in
132f0 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
13300 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
13310 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
13320 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
13330 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
13340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13350 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
13360 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
13370 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
13380 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
13390 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
133a0 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
133b0 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61   */.);../*.** Ha
133c0 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69 61 6c  ndle the special
133d0 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d 70 6f   case of a compo
133e0 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20  und-select that 
133f0 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20  originates from 
13400 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61 75  a.** VALUES clau
13410 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e 67  se.  By handling
13420 20 74 68 69 73 20 61 73 20 61 20 73 70 65 63 69   this as a speci
13430 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76 6f 69  al case, we avoi
13440 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75 72 73  d deep.** recurs
13450 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20 64 6f  ion, and thus do
13460 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e 66   not need to enf
13470 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54 45 5f  orce the SQLITE_
13480 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
13490 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56 41  ELECT.** on a VA
134a0 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  LUES clause..**.
134b0 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 53  ** Because the S
134c0 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f 72 69  elect object ori
134d0 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 20 56  ginates from a V
134e0 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a 2a  ALUES clause:.**
134f0 20 20 20 28 31 29 20 54 68 65 72 65 20 69 73 20     (1) There is 
13500 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53  no LIMIT or OFFS
13510 45 54 20 6f 72 20 65 6c 73 65 20 74 68 65 72 65  ET or else there
13520 20 69 73 20 61 20 4c 49 4d 49 54 20 6f 66 20 65   is a LIMIT of e
13530 78 61 63 74 6c 79 20 31 0a 2a 2a 20 20 20 28 32  xactly 1.**   (2
13540 29 20 41 6c 6c 20 74 65 72 6d 73 20 61 72 65 20  ) All terms are 
13550 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20 20 20 28  UNION ALL.**   (
13560 33 29 20 54 68 65 72 65 20 69 73 20 6e 6f 20 4f  3) There is no O
13570 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a  RDER BY clause.*
13580 2a 0a 2a 2a 20 54 68 65 20 22 4c 49 4d 49 54 20  *.** The "LIMIT 
13590 6f 66 20 65 78 61 63 74 6c 79 20 31 22 20 63 61  of exactly 1" ca
135a0 73 65 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 20  se of condition 
135b0 28 31 29 20 63 6f 6d 65 73 20 61 62 6f 75 74 20  (1) comes about 
135c0 77 68 65 6e 20 61 20 56 41 4c 55 45 53 0a 2a 2a  when a VALUES.**
135d0 20 63 6c 61 75 73 65 20 6f 63 63 75 72 73 20 77   clause occurs w
135e0 69 74 68 69 6e 20 73 63 61 6c 61 72 20 65 78 70  ithin scalar exp
135f0 72 65 73 73 69 6f 6e 20 28 65 78 3a 20 22 53 45  ression (ex: "SE
13600 4c 45 43 54 20 28 56 41 4c 55 45 53 28 31 29 2c  LECT (VALUES(1),
13610 28 32 29 2c 28 33 29 29 22 29 2e 0a 2a 2a 20 54  (2),(3))")..** T
13620 68 65 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75  he sqlite3CodeSu
13630 62 73 65 6c 65 63 74 20 77 69 6c 6c 20 68 61 76  bselect will hav
13640 65 20 61 64 64 65 64 20 74 68 65 20 4c 49 4d 49  e added the LIMI
13650 54 20 31 20 63 6c 61 75 73 65 20 69 6e 20 74 68  T 1 clause in th
13660 74 20 63 61 73 65 2e 0a 2a 2a 20 53 69 6e 63 65  t case..** Since
13670 20 74 68 65 20 6c 69 6d 69 74 20 69 73 20 65 78   the limit is ex
13680 61 63 74 6c 79 20 31 2c 20 77 65 20 6f 6e 6c 79  actly 1, we only
13690 20 6e 65 65 64 20 74 6f 20 65 76 61 6c 75 74 65   need to evalute
136a0 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
136b0 56 41 4c 55 45 53 2e 0a 2a 2f 0a 73 74 61 74 69  VALUES..*/.stati
136c0 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
136d0 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72 73 65  tValues(.  Parse
136e0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
136f0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
13700 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
13710 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
13720 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
13730 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
13740 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
13750 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
13760 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
13770 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
13780 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  lts */.){.  Sele
13790 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20 53 65  ct *pPrior;.  Se
137a0 6c 65 63 74 20 2a 70 52 69 67 68 74 6d 6f 73 74  lect *pRightmost
137b0 20 3d 20 70 3b 0a 20 20 69 6e 74 20 6e 52 6f 77   = p;.  int nRow
137c0 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 1;.  int rc =
137d0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   0;.  assert( p-
137e0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d  >selFlags & SF_M
137f0 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a 20 20 64  ultiValue );.  d
13800 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o{.    assert( p
13810 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
13820 56 61 6c 75 65 73 20 29 3b 0a 20 20 20 20 61 73  Values );.    as
13830 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
13840 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d 54  ALL || (p->op==T
13850 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 2d 3e 70  K_SELECT && p->p
13860 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a 20 20 20  Prior==0) );.   
13870 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78   assert( p->pNex
13880 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73  t==0 || p->pELis
13890 74 2d 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65  t->nExpr==p->pNe
138a0 78 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  xt->pEList->nExp
138b0 72 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r );.    if( p->
138c0 70 50 72 69 6f 72 3d 3d 30 20 29 20 62 72 65 61  pPrior==0 ) brea
138d0 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  k;.    assert( p
138e0 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d  ->pPrior->pNext=
138f0 3d 70 20 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  =p );.    p = p-
13900 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f  >pPrior;.    nRo
13910 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29  w++;.  }while(1)
13920 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
13930 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e      pPrior = p->
13940 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70  pPrior;.    p->p
13950 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 72  Prior = 0;.    r
13960 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
13970 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  t(pParse, p, pDe
13980 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  st);.    p->pPri
13990 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
139a0 20 69 66 28 20 72 63 20 7c 7c 20 70 52 69 67 68   if( rc || pRigh
139b0 74 6d 6f 73 74 2d 3e 70 4c 69 6d 69 74 20 29 20  tmost->pLimit ) 
139c0 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d 3e 6e 53  break;.    p->nS
139d0 65 6c 65 63 74 52 6f 77 20 3d 20 6e 52 6f 77 3b  electRow = nRow;
139e0 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
139f0 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
13a00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
13a10 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
13a20 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61  led to process a
13a30 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
13a40 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f  form from.** two
13a50 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
13a60 65 20 71 75 65 72 69 65 73 20 75 73 69 6e 67 20  e queries using 
13a70 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c  UNION, UNION ALL
13a80 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20  , EXCEPT, or.** 
13a90 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20  INTERSECT.**.** 
13aa0 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  "p" points to th
13ab0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
13ac0 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e  the two queries.
13ad0 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74    the query on t
13ae0 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d  he.** left is p-
13af0 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65  >pPrior.  The le
13b00 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61  ft query could a
13b10 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  lso be a compoun
13b20 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68  d query.** in wh
13b30 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f  ich case this ro
13b40 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
13b50 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
13b60 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  . .**.** The res
13b70 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61  ults of the tota
13b80 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62  l query are to b
13b90 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61  e written into a
13ba0 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20   destination.** 
13bb0 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69  of type eDest wi
13bc0 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61  th parameter iPa
13bd0 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  rm..**.** Exampl
13be0 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61  e 1:  Consider a
13bf0 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f   three-way compo
13c00 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  und SQL statemen
13c10 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  t..**.**     SEL
13c20 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e  ECT a FROM t1 UN
13c30 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ION SELECT b FRO
13c40 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t2 UNION SELEC
13c50 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a  T c FROM t3.**.*
13c60 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
13c70 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73   is parsed up as
13c80 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
13c90 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f      SELECT c FRO
13ca0 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a  M t3.**      |.*
13cb0 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20  *      `----->  
13cc0 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
13cd0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
13ce0 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
13cf0 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20         `------> 
13d00 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
13d10 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f  1.**.** The arro
13d20 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  ws in the diagra
13d30 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e  m above represen
13d40 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72  t the Select.pPr
13d50 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20  ior pointer..** 
13d60 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
13d70 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  ne is called wit
13d80 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65  h p equal to the
13d90 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a   t3 query, then.
13da0 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62  ** pPrior will b
13db0 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20  e the t2 query. 
13dc0 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54   p->op will be T
13dd0 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20  K_UNION in this 
13de0 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69  case..**.** Noti
13df0 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  ce that because 
13e00 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74  of the way SQLit
13e10 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e  e parses compoun
13e20 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a  d SELECTs, the.*
13e30 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c  * individual sel
13e40 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75  ects always grou
13e50 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  p from left to r
13e60 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ight..*/.static 
13e70 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  int multiSelect(
13e80 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
13e90 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
13ea0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
13eb0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
13ec0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
13ed0 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
13ee0 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
13ef0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
13f00 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
13f10 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
13f20 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
13f30 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
13f40 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63  ITE_OK;   /* Suc
13f50 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61  cess code from a
13f60 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
13f70 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
13f80 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
13f90 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
13fa0 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
13fb0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
13fd0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
13fe0 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53  this VDBE */.  S
13ff0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
14000 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74       /* Alternat
14010 69 76 65 20 64 61 74 61 20 64 65 73 74 69 6e 61  ive data destina
14020 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tion */.  Select
14030 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20   *pDelete = 0;  
14040 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d 70  /* Chain of simp
14050 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64 65  le selects to de
14060 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lete */.  sqlite
14070 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
14080 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
14090 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65  ection */.#ifnde
140a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
140b0 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62  PLAIN.  int iSub
140c0 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  1 = 0;        /*
140d0 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d   EQP id of left-
140e0 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  hand query */.  
140f0 69 6e 74 20 69 53 75 62 32 20 3d 20 30 3b 20 20  int iSub2 = 0;  
14100 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
14110 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75  of right-hand qu
14120 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ery */.#endif.. 
14130 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
14140 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
14150 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75  BY or LIMIT clau
14160 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45  se on prior SELE
14170 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20  CTs.  Only.  ** 
14180 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d  the last (right-
14190 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20  most) SELECT in 
141a0 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68  the series may h
141b0 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
141c0 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20  or LIMIT..  */. 
141d0 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d   assert( p && p-
141e0 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43  >pPrior );  /* C
141f0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
14200 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20  guarantees this 
14210 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72 74  much */.  assert
14220 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
14230 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d   SF_Recursive)==
14240 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  0 || p->op==TK_A
14250 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  LL || p->op==TK_
14260 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20  UNION );.  db = 
14270 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50  pParse->db;.  pP
14280 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
14290 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73  ;.  dest = *pDes
142a0 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  t;.  if( pPrior-
142b0 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 50 72  >pOrderBy || pPr
142c0 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ior->pLimit ){. 
142d0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
142e0 73 67 28 70 50 61 72 73 65 2c 22 25 73 20 63 6c  sg(pParse,"%s cl
142f0 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65  ause should come
14300 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65   after %s not be
14310 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 70 50 72  fore",.      pPr
14320 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30  ior->pOrderBy!=0
14330 20 3f 20 22 4f 52 44 45 52 20 42 59 22 20 3a 20   ? "ORDER BY" : 
14340 22 4c 49 4d 49 54 22 2c 20 73 65 6c 65 63 74 4f  "LIMIT", selectO
14350 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
14360 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
14370 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
14380 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d  _end;.  }..  v =
14390 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
143a0 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
143b0 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54  t( v!=0 );  /* T
143c0 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  he VDBE already 
143d0 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69  created by calli
143e0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  ng function */..
143f0 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
14400 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70  destination temp
14410 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e  orary table if n
14420 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20  ecessary.  */.  
14430 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
14440 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
14450 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14460 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c  EList );.    sql
14470 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14480 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
14490 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d  al, dest.iSDParm
144a0 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
144b0 70 72 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44  pr);.    dest.eD
144c0 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b  est = SRT_Table;
144d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69  .  }..  /* Speci
144e0 61 6c 20 68 61 6e 64 6c 69 6e 67 20 66 6f 72 20  al handling for 
144f0 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  a compound-selec
14500 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65  t that originate
14510 73 20 61 73 20 61 20 56 41 4c 55 45 53 20 63 6c  s as a VALUES cl
14520 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ause..  */.  if(
14530 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
14540 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 7b 0a  F_MultiValue ){.
14550 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65      rc = multiSe
14560 6c 65 63 74 56 61 6c 75 65 73 28 70 50 61 72 73  lectValues(pPars
14570 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
14580 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
14590 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
145a0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  /* Make sure all
145b0 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20   SELECTs in the 
145c0 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74  statement have t
145d0 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
145e0 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  f elements.  ** 
145f0 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20  in their result 
14600 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sets..  */.  ass
14610 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26  ert( p->pEList &
14620 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  & pPrior->pEList
14630 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
14640 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  >pEList->nExpr==
14650 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e  pPrior->pEList->
14660 6e 45 78 70 72 20 29 3b 0a 0a 23 69 66 6e 64 65  nExpr );..#ifnde
14670 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
14680 45 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  E.  if( p->selFl
14690 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
146a0 76 65 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ve ){.    genera
146b0 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51  teWithRecursiveQ
146c0 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
146d0 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a  &dest);.  }else.
146e0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d  #endif..  /* Com
146f0 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68  pound SELECTs th
14700 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  at have an ORDER
14710 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68   BY clause are h
14720 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c  andled separatel
14730 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  y..  */.  if( p-
14740 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
14750 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c   return multiSel
14760 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73  ectOrderBy(pPars
14770 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
14780 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 47 65 6e 65  }else..  /* Gene
14790 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
147a0 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
147b0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
147c0 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63  ts..  */.  switc
147d0 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
147e0 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20  case TK_ALL: {. 
147f0 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
14800 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69  0;.      int nLi
14810 6d 69 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  mit;.      asser
14820 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  t( !pPrior->pLim
14830 69 74 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69  it );.      pPri
14840 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->iLimit = p->
14850 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50  iLimit;.      pP
14860 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20  rior->iOffset = 
14870 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->iOffset;.    
14880 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74    pPrior->pLimit
14890 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
148a0 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
148b0 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
148c0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
148d0 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
148e0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
148f0 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
14900 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  est);.      p->p
14910 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
14920 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
14930 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
14940 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
14950 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
14960 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  r = 0;.      p->
14970 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d  iLimit = pPrior-
14980 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >iLimit;.      p
14990 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69  ->iOffset = pPri
149a0 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  or->iOffset;.   
149b0 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74     if( p->iLimit
149c0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72   ){.        addr
149d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
149e0 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
149f0 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64  , p->iLimit); Vd
14a00 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
14a10 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
14a20 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65  nt((v, "Jump ahe
14a30 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63  ad if LIMIT reac
14a40 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20  hed"));.        
14a50 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 20 29  if( p->iOffset )
14a60 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
14a70 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
14a80 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c   OP_OffsetLimit,
14a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
14ab0 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66 66 73  iLimit, p->iOffs
14ac0 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et+1, p->iOffset
14ad0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
14ae0 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61     }.      expla
14af0 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
14b00 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
14b10 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
14b20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
14b30 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
14b40 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  &dest);.      te
14b50 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
14b60 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70  TE_OK );.      p
14b70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
14b80 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  or;.      p->pPr
14b90 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
14ba0 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
14bb0 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
14bc0 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52  tAdd(p->nSelectR
14bd0 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  ow, pPrior->nSel
14be0 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 69  ectRow);.      i
14bf0 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  f( pPrior->pLimi
14c00 74 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  t.       && sqli
14c10 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
14c20 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2d  (pPrior->pLimit-
14c30 3e 70 4c 65 66 74 2c 20 26 6e 4c 69 6d 69 74 29  >pLeft, &nLimit)
14c40 0a 20 20 20 20 20 20 20 26 26 20 6e 4c 69 6d 69  .       && nLimi
14c50 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63  t>0 && p->nSelec
14c60 74 52 6f 77 20 3e 20 73 71 6c 69 74 65 33 4c 6f  tRow > sqlite3Lo
14c70 67 45 73 74 28 28 75 36 34 29 6e 4c 69 6d 69 74  gEst((u64)nLimit
14c80 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
14c90 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
14ca0 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
14cb0 74 28 28 75 36 34 29 6e 4c 69 6d 69 74 29 3b 0a  t((u64)nLimit);.
14cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
14cd0 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20  ( addr ){.      
14ce0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
14cf0 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
14d00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
14d10 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
14d20 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20  ase TK_EXCEPT:. 
14d30 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e     case TK_UNION
14d40 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e  : {.      int un
14d50 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75  ionTab;    /* Cu
14d60 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
14d70 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
14d80 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  le holding resul
14d90 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70  t */.      u8 op
14da0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f   = 0;       /* O
14db0 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f  ne of the SRT_ o
14dc0 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70  perations to app
14dd0 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20  ly to self */.  
14de0 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b      int priorOp;
14df0 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f       /* The SRT_
14e00 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70   operation to ap
14e10 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c  ply to prior sel
14e20 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  ects */.      Ex
14e30 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20 2f  pr *pLimit;    /
14e40 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f  * Saved values o
14e50 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 20 2a 2f 0a  f p->nLimit  */.
14e60 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
14e70 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
14e80 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20   uniondest;..   
14e90 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
14ea0 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b  op==TK_EXCEPT );
14eb0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14ec0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
14ed0 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 4f   );.      priorO
14ee0 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
14ef0 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
14f00 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a  est==priorOp ){.
14f10 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61          /* We ca
14f20 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72  n reuse a tempor
14f30 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61  ary table genera
14f40 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20  ted by a SELECT 
14f50 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a  to our.        *
14f60 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
14f70 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
14f80 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30  rt( p->pLimit==0
14f90 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20   );      /* Not 
14fa0 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
14fb0 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
14fc0 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
14fd0 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
14fe0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14ff0 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
15000 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
15010 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
15020 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
15030 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
15040 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
15050 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
15060 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
15070 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
15080 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
15090 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
150a0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  0 );.        add
150b0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
150c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
150d0 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e  Ephemeral, union
150e0 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
150f0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
15100 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
15110 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
15120 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
15130 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20  = addr;.        
15140 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
15150 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
15160 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
15170 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15180 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
15190 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
151a0 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
151b0 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
151c0 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20   left.      */. 
151d0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
151e0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
151f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
15200 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75  electDestInit(&u
15210 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f  niondest, priorO
15220 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20  p, unionTab);.  
15230 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
15240 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
15250 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
15260 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
15270 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
15280 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75  arse, pPrior, &u
15290 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
152a0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
152b0 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
152c0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
152d0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
152e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
152f0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
15300 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
15310 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
15320 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20  T ){.        op 
15330 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20  = SRT_Except;.  
15340 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15350 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
15360 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
15370 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55        op = SRT_U
15380 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nion;.      }.  
15390 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
153a0 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
153b0 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
153c0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
153d0 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73  ;.      uniondes
153e0 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20  t.eDest = op;.  
153f0 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
15400 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
15410 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
15420 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
15430 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
15440 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64  arse, p, &uniond
15450 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
15460 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
15470 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  _OK );.      /* 
15480 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  Query flattening
15490 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
154a0 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c  t() might refill
154b0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20   p->pOrderBy..  
154c0 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74      ** Be sure t
154d0 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64  o delete p->pOrd
154e0 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c  erBy, therefore,
154f0 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f   to avoid a memo
15500 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20  ry leak. */.    
15510 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
15520 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
15530 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
15540 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
15550 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ior;.      p->pP
15560 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
15570 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
15580 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
15590 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
155a0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  ){.        p->nS
155b0 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
155c0 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e  e3LogEstAdd(p->n
155d0 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f  SelectRow, pPrio
155e0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  r->nSelectRow);.
155f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
15600 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
15610 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
15620 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
15630 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
15640 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->iLimit = 0;. 
15650 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
15660 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  = 0;..      /* C
15670 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20  onvert the data 
15680 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
15690 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74   table into what
156a0 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20  ever form.      
156b0 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65  ** it is that we
156c0 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e   currently need.
156d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
156e0 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62  assert( unionTab
156f0 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c  ==dest.iSDParm |
15700 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72  | dest.eDest!=pr
15710 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 69  iorOp );.      i
15720 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70  f( dest.eDest!=p
15730 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20  riorOp ){.      
15740 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
15750 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
15760 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
15770 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
15780 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
15790 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
157a0 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e  v);.        iCon
157b0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
157c0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
157d0 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
157e0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
157f0 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
15800 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15810 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
15820 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
15830 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
15840 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
15850 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
15860 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
15870 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  dr(v);.        s
15880 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
15890 50 61 72 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54  Parse, p, unionT
158a0 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
158b0 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
158c0 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20  , &dest, iCont, 
158d0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
158e0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
158f0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
15900 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
15910 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15920 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54   OP_Next, unionT
15930 61 62 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62  ab, iStart); Vdb
15940 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
15950 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15960 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
15970 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
15980 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15990 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
159a0 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
159b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
159c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
159d0 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70  fault: assert( p
159e0 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ->op==TK_INTERSE
159f0 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e  CT ); {.      in
15a00 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20  t tab1, tab2;.  
15a10 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
15a20 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
15a30 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
15a40 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
15a50 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
15a60 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73  est intersectdes
15a70 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b  t;.      int r1;
15a80 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52  ..      /* INTER
15a90 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e  SECT is differen
15aa0 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  t from the other
15ab0 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69  s since it requi
15ac0 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  res.      ** two
15ad0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15ae0 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73  s.  Hence it has
15af0 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20   its own case.  
15b00 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62  Begin.      ** b
15b10 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  y allocating the
15b20 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20   tables we will 
15b30 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
15b40 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72       tab1 = pPar
15b50 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
15b60 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
15b70 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
15b80 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
15b90 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  By==0 );..      
15ba0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
15bb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
15bc0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
15bd0 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b1, 0);.      as
15be0 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
15bf0 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
15c00 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
15c10 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
15c20 72 3b 0a 20 20 20 20 20 20 66 69 6e 64 52 69 67  r;.      findRig
15c30 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c  htmost(p)->selFl
15c40 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
15c50 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61  hemeral;.      a
15c60 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
15c70 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   );..      /* Co
15c80 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
15c90 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
15ca0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
15cb0 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f  "tab1"..      */
15cc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
15cd0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e  lectDestInit(&in
15ce0 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54  tersectdest, SRT
15cf0 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20  _Union, tab1);. 
15d00 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
15d10 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
15d20 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
15d30 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
15d40 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
15d50 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
15d60 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
15d70 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
15d80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
15d90 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
15da0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
15db0 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
15dc0 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65  t SELECT into te
15dd0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
15de0 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ab2".      */.  
15df0 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
15e00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15e10 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
15e20 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
15e30 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
15e40 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20  rOpenEphm[1] == 
15e50 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
15e60 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
15e70 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
15e80 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
15e90 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
15ea0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
15eb0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
15ec0 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69   intersectdest.i
15ed0 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20  SDParm = tab2;. 
15ee0 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
15ef0 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
15f00 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
15f10 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
15f20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
15f30 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72  Parse, p, &inter
15f40 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20  sectdest);.     
15f50 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
15f60 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
15f70 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
15f80 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
15f90 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
15fa0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
15fb0 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d  electRow>pPrior-
15fc0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d  >nSelectRow ) p-
15fd0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50  >nSelectRow = pP
15fe0 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
15ff0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
16000 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
16010 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
16020 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
16030 69 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  it;..      /* Ge
16040 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
16050 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63  ake the intersec
16060 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20  tion of the two 
16070 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
16080 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ** tables..     
16090 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
160a0 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
160b0 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
160c0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
160d0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f  el(v);.      iCo
160e0 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
160f0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
16100 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74      computeLimit
16110 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
16120 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , p, iBreak);.  
16130 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16140 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
16150 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b  nd, tab1, iBreak
16160 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16170 76 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  v);.      r1 = s
16180 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
16190 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
161a0 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
161b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
161c0 5f 52 6f 77 44 61 74 61 2c 20 74 61 62 31 2c 20  _RowData, tab1, 
161d0 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
161e0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
161f0 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
16200 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c  tab2, iCont, r1,
16210 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   0); VdbeCoverag
16220 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
16230 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
16240 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
16250 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
16260 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
16270 74 61 62 31 2c 0a 20 20 20 20 20 20 20 20 20 20  tab1,.          
16280 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
16290 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20  , &dest, iCont, 
162a0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
162b0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
162c0 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
162d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
162e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
162f0 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61  Next, tab1, iSta
16300 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  rt); VdbeCoverag
16310 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
16320 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
16330 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
16340 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16350 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
16360 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ose, tab2, 0);. 
16370 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16380 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
16390 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  se, tab1, 0);.  
163a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
163b0 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43  .  }..  explainC
163c0 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c  omposite(pParse,
163d0 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69   p->op, iSub1, i
163e0 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f  Sub2, p->op!=TK_
163f0 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ALL);..  /* Comp
16400 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ute collating se
16410 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20  quences used by 
16420 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
16430 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f  tables needed to
16440 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
16450 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
16460 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20    ** Attach the 
16470 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
16480 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61  e to all tempora
16490 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ry tables..  **.
164a0 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f    ** This sectio
164b0 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20  n is run by the 
164c0 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43  right-most SELEC
164d0 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79  T statement only
164e0 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74  ..  ** SELECT st
164f0 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  atements to the 
16500 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70  left always skip
16510 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65   this part.  The
16520 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
16530 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c   SELECT might al
16540 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  so skip this par
16550 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f  t if it has no O
16560 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
16570 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20  nd.  ** no temp 
16580 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69  tables are requi
16590 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  red..  */.  if( 
165a0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
165b0 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29  _UsesEphemeral )
165c0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  {.    int i;    
165d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165e0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
165f0 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e  ter */.    KeyIn
16600 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20  fo *pKeyInfo;   
16610 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
16620 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
16630 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  or the result se
16640 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20  t */.    Select 
16650 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
16660 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
16670 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45  oping through SE
16680 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
16690 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  */.    CollSeq *
166a0 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20  *apColl;        
166b0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
166c0 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79  ing through pKey
166d0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f  Info->aColl[] */
166e0 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  .    int nCol;  
166f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16700 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
16710 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
16720 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73  t set */..    as
16730 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d  sert( p->pNext==
16740 30 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  0 );.    nCol = 
16750 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
16760 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
16770 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
16780 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31  lloc(db, nCol, 1
16790 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79  );.    if( !pKey
167a0 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  Info ){.      rc
167b0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
167c0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
167d0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
167e0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  d;.    }.    for
167f0 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65  (i=0, apColl=pKe
16800 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c  yInfo->aColl; i<
16810 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c  nCol; i++, apCol
16820 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43  l++){.      *apC
16830 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  oll = multiSelec
16840 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
16850 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66   p, i);.      if
16860 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a  ( 0==*apColl ){.
16870 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20          *apColl 
16880 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
16890 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
168a0 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b      for(pLoop=p;
168b0 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
168c0 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  oop->pPrior){.  
168d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32      for(i=0; i<2
168e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
168f0 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70  int addr = pLoop
16900 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
16910 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ];.        if( a
16920 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ddr<0 ){.       
16930 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20     /* If [0] is 
16940 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20  unused then [1] 
16950 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20  is also unused. 
16960 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20   So we can.     
16970 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
16980 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73  afely abort as s
16990 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74  oon as the first
169a0 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20   unused slot is 
169b0 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  found */.       
169c0 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
169d0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
169e0 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ]<0 );.         
169f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
16a00 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
16a10 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
16a20 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20   addr, nCol);.  
16a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16a40 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64  eChangeP4(v, add
16a50 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65  r, (char*)sqlite
16a60 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
16a70 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20  Info),.         
16a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a90 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a     P4_KEYINFO);.
16aa0 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61          pLoop->a
16ab0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d  ddrOpenEphm[i] =
16ac0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
16ad0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65   }.    sqlite3Ke
16ae0 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49  yInfoUnref(pKeyI
16af0 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69  nfo);.  }..multi
16b00 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70  _select_end:.  p
16b10 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65  Dest->iSdst = de
16b20 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73  st.iSdst;.  pDes
16b30 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e  t->nSdst = dest.
16b40 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  nSdst;.  sqlite3
16b50 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
16b60 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74   pDelete);.  ret
16b70 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
16b80 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
16b90 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
16ba0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20  */../*.** Error 
16bb0 6d 65 73 73 61 67 65 20 66 6f 72 20 77 68 65 6e  message for when
16bc0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72   two or more ter
16bd0 6d 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  ms of a compound
16be0 20 73 65 6c 65 63 74 20 68 61 76 65 20 64 69 66   select have dif
16bf0 66 65 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72  ferent.** size r
16c00 65 73 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76  esult sets..*/.v
16c10 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
16c20 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72  tWrongNumTermsEr
16c30 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ror(Parse *pPars
16c40 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
16c50 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
16c60 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a   & SF_Values ){.
16c70 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
16c80 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c  Msg(pParse, "all
16c90 20 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76   VALUES must hav
16ca0 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
16cb0 72 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20  r of terms");.  
16cc0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
16cd0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
16ce0 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74  e, "SELECTs to t
16cf0 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
16d00 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22  t of %s".      "
16d10 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65   do not have the
16d20 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
16d30 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c  result columns",
16d40 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
16d50 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  >op));.  }.}../*
16d60 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70  .** Code an outp
16d70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f  ut subroutine fo
16d80 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d  r a coroutine im
16d90 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
16da0 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
16db0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
16dc0 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75  data to be outpu
16dd0 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  t is contained i
16de0 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54  n pIn->iSdst.  T
16df0 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d  here are.** pIn-
16e00 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74  >nSdst columns t
16e10 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44  o be output.  pD
16e20 65 73 74 20 69 73 20 77 68 65 72 65 20 74 68 65  est is where the
16e30 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a   output should.*
16e40 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a  * be sent..**.**
16e50 20 72 65 67 52 65 74 75 72 6e 20 69 73 20 74 68   regReturn is th
16e60 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
16e70 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  register holding
16e80 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a   the subroutine.
16e90 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  ** return addres
16ea0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50  s..**.** If regP
16eb0 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73  rev>0 then it is
16ec0 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73   the first regis
16ed0 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20  ter in a vector 
16ee0 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20  that.** records 
16ef0 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74  the previous out
16f00 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65  put.  mem[regPre
16f10 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68 61  v] is a flag tha
16f20 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66  t is false.** if
16f30 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20   there has been 
16f40 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  no previous outp
16f50 75 74 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e  ut.  If regPrev>
16f60 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a  0 then code is.*
16f70 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73  * generated to s
16f80 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74  uppress duplicat
16f90 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73  es.  pKeyInfo is
16fa0 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72   used for compar
16fb0 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a  ing.** keys..**.
16fc0 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20  ** If the LIMIT 
16fd0 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d  found in p->iLim
16fe0 69 74 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a  it is reached, j
16ff0 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ump immediately 
17000 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f  to.** iBreak..*/
17010 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65  .static int gene
17020 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75  rateOutputSubrou
17030 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70  tine(.  Parse *p
17040 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
17050 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
17060 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
17070 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
17080 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
17090 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c  atement */.  Sel
170a0 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20  ectDest *pIn,   
170b0 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e       /* Coroutin
170c0 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61  e supplying data
170d0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
170e0 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a   *pDest,      /*
170f0 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74   Where to send t
17100 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  he data */.  int
17110 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20   regReturn,     
17120 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
17130 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
17140 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
17150 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20  Prev,           
17160 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73   /* Previous res
17170 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e  ult register.  N
17180 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20  o uniqueness if 
17190 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  0 */.  KeyInfo *
171a0 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f  pKeyInfo,      /
171b0 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  * For comparing 
171c0 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e  with previous en
171d0 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  try */.  int iBr
171e0 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  eak             
171f0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
17200 20 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49   we hit the LIMI
17210 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  T */.){.  Vdbe *
17220 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
17230 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  e;.  int iContin
17240 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  ue;.  int addr;.
17250 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
17260 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
17270 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65  (v);.  iContinue
17280 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
17290 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f  keLabel(v);..  /
172a0 2a 20 53 75 70 70 72 65 73 73 20 64 75 70 6c 69  * Suppress dupli
172b0 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c  cates for UNION,
172c0 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54   EXCEPT, and INT
172d0 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69  ERSECT .  */.  i
172e0 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20  f( regPrev ){.  
172f0 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64    int addr1, add
17300 72 32 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20  r2;.    addr1 = 
17310 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17320 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72  1(v, OP_IfNot, r
17330 65 67 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76  egPrev); VdbeCov
17340 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64  erage(v);.    ad
17350 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
17360 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
17370 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73  mpare, pIn->iSds
17380 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49  t, regPrev+1, pI
17390 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20  n->nSdst,.      
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173b0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73          (char*)s
173c0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
173d0 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b  (pKeyInfo), P4_K
173e0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c  EYINFO);.    sql
173f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
17400 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 32  , OP_Jump, addr2
17410 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 61  +2, iContinue, a
17420 64 64 72 32 2b 32 29 3b 20 56 64 62 65 43 6f 76  ddr2+2); VdbeCov
17430 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
17440 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
17450 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
17460 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17470 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p3(v, OP_Copy, p
17480 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72  In->iSdst, regPr
17490 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  ev+1, pIn->nSdst
174a0 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
174b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
174c0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67  _Integer, 1, reg
174d0 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Prev);.  }.  if(
174e0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
174f0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
17500 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  rn 0;..  /* Supp
17510 72 65 73 73 20 74 68 65 20 66 69 72 73 74 20 4f  ress the first O
17520 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66  FFSET entries if
17530 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46   there is an OFF
17540 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  SET clause.  */.
17550 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
17560 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
17570 74 69 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65 72  tinue);..  asser
17580 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  t( pDest->eDest!
17590 3d 53 52 54 5f 45 78 69 73 74 73 20 29 3b 0a 20  =SRT_Exists );. 
175a0 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e   assert( pDest->
175b0 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65  eDest!=SRT_Table
175c0 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 44   );.  switch( pD
175d0 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20  est->eDest ){.  
175e0 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
175f0 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73  esult as data us
17600 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79  ing a unique key
17610 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
17620 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
17630 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d  {.      int r1 =
17640 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
17650 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
17660 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
17670 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
17680 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
17690 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
176a0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
176b0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
176c0 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20  >nSdst, r1);.   
176d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
176e0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
176f0 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  wid, pDest->iSDP
17700 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  arm, r2);.      
17710 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17720 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
17730 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
17740 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  r1, r2);.      s
17750 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
17760 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
17770 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  END);.      sqli
17780 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
17790 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
177a0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
177b0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
177c0 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
177d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
177e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
177f0 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
17800 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
17810 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
17820 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
17830 20 2e 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20   ...)"..    */. 
17840 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
17850 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
17860 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17870 20 70 49 6e 2d 3e 6e 53 64 73 74 3e 31 20 29 3b   pIn->nSdst>1 );
17880 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
17890 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
178a0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
178b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
178c0 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
178d0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
178e0 2d 3e 6e 53 64 73 74 2c 20 0a 20 20 20 20 20 20  ->nSdst, .      
178f0 20 20 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a      r1, pDest->z
17900 41 66 66 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  AffSdst, pIn->nS
17910 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
17920 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
17930 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
17940 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  e, pIn->iSdst, p
17950 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
17960 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17970 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
17980 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69  Insert, pDest->i
17990 53 44 50 61 72 6d 2c 20 72 31 2c 0a 20 20 20 20  SDParm, r1,.    
179a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179b0 20 20 20 20 20 20 20 70 49 6e 2d 3e 69 53 64 73         pIn->iSds
179c0 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
179d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
179e0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
179f0 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
17a00 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
17a10 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
17a20 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
17a30 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
17a40 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
17a50 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
17a60 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
17a70 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
17a80 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62  emory cell and b
17a90 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20  reak out.    ** 
17aa0 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
17ab0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
17ac0 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
17ad0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e     assert( pIn->
17ae0 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72  nSdst==1 || pPar
17af0 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20 74  se->nErr>0 );  t
17b00 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53  estcase( pIn->nS
17b10 64 73 74 21 3d 31 20 29 3b 0a 20 20 20 20 20 20  dst!=1 );.      
17b20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
17b30 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ove(pParse, pIn-
17b40 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69  >iSdst, pDest->i
17b50 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20  SDParm, 1);.    
17b60 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
17b70 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20  lause will jump 
17b80 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
17b90 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
17ba0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
17bb0 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
17bc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
17bd0 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54  ERY */..    /* T
17be0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  he results are s
17bf0 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65  tored in a seque
17c00 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
17c10 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
17c20 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73 74   at pDest->iSdst
17c30 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72  .  Then the co-r
17c40 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20  outine yields.. 
17c50 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
17c60 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a  RT_Coroutine: {.
17c70 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74 2d        if( pDest-
17c80 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20  >iSdst==0 ){.   
17c90 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73       pDest->iSds
17ca0 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  t = sqlite3GetTe
17cb0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
17cc0 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
17cd0 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73       pDest->nSds
17ce0 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a  t = pIn->nSdst;.
17cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
17d00 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
17d10 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
17d20 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 64  Sdst, pDest->iSd
17d30 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
17d40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17d50 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
17d60 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44  ield, pDest->iSD
17d70 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65  Parm);.      bre
17d80 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
17d90 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
17da0 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65   above, then the
17db0 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74   result destinat
17dc0 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20  ion must be.    
17dd0 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20  ** SRT_Output.  
17de0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
17df0 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74  never called wit
17e00 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20  h any other.    
17e10 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f  ** destination o
17e20 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ther than the on
17e30 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65  es handled above
17e40 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a   or SRT_Output..
17e50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
17e60 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65  r SRT_Output, re
17e70 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
17e80 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f   in a sequence o
17e90 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20  f registers.  . 
17ea0 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f     ** Then the O
17eb0 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f  P_ResultRow opco
17ec0 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 61  de is used to ca
17ed0 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  use sqlite3_step
17ee0 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74  () to.    ** ret
17ef0 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77  urn the next row
17f00 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20   of result..    
17f10 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
17f20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
17f30 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
17f40 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
17f50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17f60 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
17f70 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  Row, pIn->iSdst,
17f80 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
17f90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
17fa0 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
17fb0 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ge(pParse, pIn->
17fc0 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
17fd0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
17fe0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
17ff0 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   Jump to the end
18000 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20   of the loop if 
18010 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61  the LIMIT is rea
18020 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ched..  */.  if(
18030 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
18040 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18050 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75  Op2(v, OP_DecrJu
18060 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  mpZero, p->iLimi
18070 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65  t, iBreak); Vdbe
18080 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
18090 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
180a0 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72  the subroutine r
180b0 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c  eturn.  */.  sql
180c0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
180d0 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75  abel(v, iContinu
180e0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
180f0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
18100 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29  turn, regReturn)
18110 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  ;..  return addr
18120 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72  ;.}../*.** Alter
18130 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20  native compound 
18140 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65  select code gene
18150 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20  rator for cases 
18160 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73  when there.** is
18170 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
18180 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73  use..**.** We as
18190 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20  sume a query of 
181a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
181b0 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c  rm:.**.**      <
181c0 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61  selectA>  <opera
181d0 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20  tor>  <selectB> 
181e0 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72   ORDER BY <order
181f0 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f  bylist>.**.** <o
18200 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20  perator> is one 
18210 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e  of UNION ALL, UN
18220 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20  ION, EXCEPT, or 
18230 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65 20  INTERSECT.  The 
18240 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f  idea.** is to co
18250 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41  de both <selectA
18260 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20  > and <selectB> 
18270 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42  with the ORDER B
18280 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63  Y clause as.** c
18290 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65  o-routines.  The
182a0 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75  n run the co-rou
182b0 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65  tines in paralle
182c0 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20  l and merge the 
182d0 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20  results.** into 
182e0 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20  the output.  In 
182f0 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20  addition to the 
18300 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28  two coroutines (
18310 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61  called selectA a
18320 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74  nd.** selectB) t
18330 68 65 72 65 20 61 72 65 20 37 20 73 75 62 72 6f  here are 7 subro
18340 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  utines:.**.**   
18350 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74   outA:    Move t
18360 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
18370 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69   selectA corouti
18380 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ne into the outp
18390 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
183a0 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e    of the compoun
183b0 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  d query..**.**  
183c0 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20    outB:    Move 
183d0 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
183e0 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74  e selectB corout
183f0 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ine into the out
18400 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  put.**          
18410 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75     of the compou
18420 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79  nd query.  (Only
18430 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55   generated for U
18440 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20  NION and.**     
18450 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
18460 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20 49  L.  EXCEPT and I
18470 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65 72 20  NSERTSECT never 
18480 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74 68 61  output a row tha
18490 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
184a0 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e   appears only in
184b0 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c   B.).**.**    Al
184c0 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  tB:    Called wh
184d0 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
184e0 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
184f0 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a  tines and A<B..*
18500 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20  *.**    AeqB:   
18510 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
18520 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
18530 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
18540 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20  and A==B..**.** 
18550 20 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c     AgtB:    Call
18560 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
18570 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
18580 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
18590 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66  >B..**.**    Eof
185a0 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  A:    Called whe
185b0 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  n data is exhaus
185c0 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  ted from selectA
185d0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a  ..**.**    EofB:
185e0 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
185f0 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
18600 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a  d from selectB..
18610 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  **.** The implem
18620 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
18630 6c 61 74 74 65 72 20 66 69 76 65 20 73 75 62 72  latter five subr
18640 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f  outines depend o
18650 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65  n which .** <ope
18660 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a  rator> is used:.
18670 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  **.**.**        
18680 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20       UNION ALL  
18690 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20         UNION    
186a0 20 20 20 20 20 20 20 20 45 58 43 45 50 54 20 20          EXCEPT  
186b0 20 20 20 20 20 20 20 20 49 4e 54 45 52 53 45 43          INTERSEC
186c0 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d  T.**          --
186d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
186e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
186f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
18700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18710 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f  -.**   AltB:   o
18720 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
18730 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
18740 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
18750 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a        nextA.**.*
18760 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41  *   AeqB:   outA
18770 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
18780 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 20 20  nextA           
18790 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20    nextA         
187a0 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a  outA, nextA.**.*
187b0 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42  *   AgtB:   outB
187c0 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74  , nextB      out
187d0 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20  B, nextB        
187e0 20 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20    nextB         
187f0 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20     nextB.**.**  
18800 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e   EofA:   outB, n
18810 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20  extB      outB, 
18820 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 68  nextB          h
18830 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  alt             
18840 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66  halt.**.**   Eof
18850 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
18860 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
18870 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  A       outA, ne
18880 78 74 41 20 20 20 20 20 20 20 20 20 68 61 6c 74  xtA         halt
18890 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c  .**.** In the Al
188a0 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67  tB, AeqB, and Ag
188b0 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20  tB subroutines, 
188c0 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c  an EOF on A foll
188d0 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63  owing nextA.** c
188e0 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61  auses an immedia
188f0 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20  te jump to EofA 
18900 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20  and an EOF on B 
18910 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20  following nextB 
18920 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d  causes.** an imm
18930 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45  ediate jump to E
18940 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66  ofB.  Within Eof
18950 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20  A and EofB, and 
18960 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a  EOF on entry or.
18970 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78  ** following nex
18980 74 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70  tX causes a jump
18990 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
189a0 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73  he select proces
189b0 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c  sing..**.** Dupl
189c0 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e  icate removal in
189d0 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45   the UNION, EXCE
189e0 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43  PT, and INTERSEC
189f0 54 20 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c  T cases is handl
18a00 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ed.** within the
18a10 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
18a20 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72 65 76  ne.  The regPrev
18a30 20 72 65 67 69 73 74 65 72 20 73 65 74 20 68 6f   register set ho
18a40 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  lds the previous
18a50 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c  ly.** output val
18a60 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f  ue.  A compariso
18a70 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73  n is made agains
18a80 74 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64  t this value and
18a90 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69   the output.** i
18aa0 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
18ab0 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f   next results wo
18ac0 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20  uld be the same 
18ad0 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e  as the previous.
18ae0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  .**.** The imple
18af0 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69  mentation plan i
18b00 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  s to implement t
18b10 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65  he two coroutine
18b20 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73  s and seven.** s
18b30 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74  ubroutines first
18b40 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65 20 63  , then put the c
18b50 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20  ontrol logic at 
18b60 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b  the bottom.  Lik
18b70 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
18b80 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74         goto Init
18b90 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72  .**     coA: cor
18ba0 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20  outine for left 
18bb0 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20  query (A).**    
18bc0 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20   coB: coroutine 
18bd0 66 6f 72 20 72 69 67 68 74 20 71 75 65 72 79 20  for right query 
18be0 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20  (B).**    outA: 
18bf0 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f  output one row o
18c00 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20  f A.**    outB: 
18c10 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f  output one row o
18c20 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55  f B (UNION and U
18c30 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a  NION ALL only).*
18c40 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a  *    EofA: ....*
18c50 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a  *    EofB: ....*
18c60 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a  *    AltB: ....*
18c70 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a  *    AeqB: ....*
18c80 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a  *    AgtB: ....*
18c90 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69  *    Init: initi
18ca0 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20  alize coroutine 
18cb0 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20  registers.**    
18cc0 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a        yield coA.
18cd0 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
18ce0 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a  of(A) goto EofA.
18cf0 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  **          yiel
18d00 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20  d coB.**        
18d10 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f    if eof(B) goto
18d20 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72   EofB.**    Cmpr
18d30 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a  : Compare A, B.*
18d40 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20  *          Jump 
18d50 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42  AltB, AeqB, AgtB
18d60 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e  .**     End: ...
18d70 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41  .**.** We call A
18d80 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c  ltB, AeqB, AgtB,
18d90 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20   EofA, and EofB 
18da0 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75  "subroutines" bu
18db0 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a  t they are not.*
18dc0 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65  * actually calle
18dd0 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e  d using Gosub an
18de0 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65  d they do not Re
18df0 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20  turn.  EofA and 
18e00 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74  EofB loop.** unt
18e10 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65  il all data is e
18e20 78 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75  xhausted then ju
18e30 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20  mp to the "end" 
18e40 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71  labe.  AltB, Aeq
18e50 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a  B,.** and AgtB j
18e60 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32  ump to either L2
18e70 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f   or to one of Eo
18e80 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23  fA or EofB..*/.#
18e90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18ea0 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
18eb0 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  CT.static int mu
18ec0 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
18ed0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
18ee0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
18ef0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
18f00 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
18f10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
18f20 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
18f30 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
18f40 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
18f50 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
18f60 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
18f70 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
18f80 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
18f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
18fa0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
18fb0 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
18fc0 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
18fd0 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
18fe0 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
18ff0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
19000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
19010 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
19020 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53  this VDBE */.  S
19030 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 41 3b  electDest destA;
19040 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74       /* Destinat
19050 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e  ion for coroutin
19060 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  e A */.  SelectD
19070 65 73 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f  est destB;     /
19080 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
19090 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f  r coroutine B */
190a0 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b  .  int regAddrA;
190b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
190c0 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
190d0 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
190e0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
190f0 41 64 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f  AddrB;         /
19100 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
19110 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20  er for select-B 
19120 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
19130 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20  nt addrSelectA; 
19140 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
19150 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20  of the select-A 
19160 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
19170 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20  nt addrSelectB; 
19180 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
19190 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20  of the select-B 
191a0 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
191b0 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20  nt regOutA;     
191c0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
191d0 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65  register for the
191e0 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75   output-A subrou
191f0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
19200 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20 20  gOutB;          
19210 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
19220 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70  ter for the outp
19230 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-B subroutine 
19240 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74  */.  int addrOut
19250 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
19260 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dress of the out
19270 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65  put-A subroutine
19280 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75   */.  int addrOu
19290 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41  tB = 0;     /* A
192a0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75  ddress of the ou
192b0 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  tput-B subroutin
192c0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  e */.  int addrE
192d0 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ofA;         /* 
192e0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
192f0 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65  elect-A-exhauste
19300 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  d subroutine */.
19310 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e    int addrEofA_n
19320 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  oB;     /* Alter
19330 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20 69 66  nate addrEofA if
19340 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69   B is uninitiali
19350 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  zed */.  int add
19360 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f  rEofB;         /
19370 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
19380 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73   select-B-exhaus
19390 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ted subroutine *
193a0 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42  /.  int addrAltB
193b0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
193c0 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20  ress of the A<B 
193d0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
193e0 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20 20  int addrAeqB;   
193f0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
19400 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62   of the A==B sub
19410 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
19420 20 61 64 64 72 41 67 74 42 3b 20 20 20 20 20 20   addrAgtB;      
19430 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
19440 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74   the A>B subrout
19450 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
19460 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f  LimitA;        /
19470 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72  * Limit register
19480 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f   for select-A */
19490 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42  .  int regLimitB
194a0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
194b0 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
194c0 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
194d0 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20   regPrev;       
194e0 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66     /* A range of
194f0 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f   registers to ho
19500 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  ld previous outp
19510 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65  ut */.  int save
19520 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a  dLimit;       /*
19530 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20   Saved value of 
19540 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69  p->iLimit */.  i
19550 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20  nt savedOffset; 
19560 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
19570 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65  lue of p->iOffse
19580 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  t */.  int label
19590 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  Cmpr;        /* 
195a0 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74  Label for the st
195b0 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65  art of the merge
195c0 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20   algorithm */.  
195d0 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20  int labelEnd;   
195e0 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66        /* Label f
195f0 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  or the end of th
19600 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54  e overall SELECT
19610 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 61   stmt */.  int a
19620 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  ddr1;           
19630 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63   /* Jump instruc
19640 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72  tions that get r
19650 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20  etargetted */.  
19660 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
19670 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
19680 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e  TK_ALL, TK_UNION
19690 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f  , TK_EXCEPT, TK_
196a0 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b  INTERSECT */.  K
196b0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20  eyInfo *pKeyDup 
196c0 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73  = 0; /* Comparis
196d0 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  on information f
196e0 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d  or duplicate rem
196f0 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  oval */.  KeyInf
19700 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20  o *pKeyMerge;   
19710 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  /* Comparison in
19720 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65  formation for me
19730 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20  rging rows */.  
19740 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
19750 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
19760 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
19770 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
19780 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f  erBy;   /* The O
19790 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
197a0 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  /.  int nOrderBy
197b0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
197c0 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
197d0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
197e0 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50  use */.  int *aP
197f0 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f  ermute;        /
19800 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f  * Mapping from O
19810 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f  RDER BY terms to
19820 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75   result set colu
19830 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  mns */.#ifndef S
19840 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
19850 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b 20  IN.  int iSub1; 
19860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51             /* EQ
19870 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e  P id of left-han
19880 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  d query */.  int
19890 20 69 53 75 62 32 3b 20 20 20 20 20 20 20 20 20   iSub2;         
198a0 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20     /* EQP id of 
198b0 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79  right-hand query
198c0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   */.#endif..  as
198d0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
198e0 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y!=0 );.  assert
198f0 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20  ( pKeyDup==0 ); 
19900 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64  /* "Managed" cod
19910 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54  e needs this.  T
19920 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a  icket #3382. */.
19930 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
19940 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  b;.  v = pParse-
19950 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
19960 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20  ( v!=0 );       
19970 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77  /* Already throw
19980 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66 20 56  n the error if V
19990 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64  DBE alloc failed
199a0 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d   */.  labelEnd =
199b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
199c0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65  Label(v);.  labe
199d0 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56  lCmpr = sqlite3V
199e0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
199f0 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70  ...  /* Patch up
19a00 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
19a10 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ause.  */.  op =
19a20 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69   p->op;  .  pPri
19a30 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
19a40 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
19a50 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
19a60 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
19a70 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73  >pOrderBy;.  ass
19a80 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b  ert( pOrderBy );
19a90 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f  .  nOrderBy = pO
19aa0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a  rderBy->nExpr;..
19ab0 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f    /* For operato
19ac0 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e  rs other than UN
19ad0 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20  ION ALL we have 
19ae0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
19af0 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52  t.  ** the ORDER
19b00 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72   BY clause cover
19b10 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20  s every term of 
19b20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
19b30 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20   Add.  ** terms 
19b40 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
19b50 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73  clause as necess
19b60 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ary..  */.  if( 
19b70 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op!=TK_ALL ){.  
19b80 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d    for(i=1; db->m
19b90 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26  allocFailed==0 &
19ba0 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  & i<=p->pEList->
19bb0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
19bc0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
19bd0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
19be0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
19bf0 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Item=pOrderBy->a
19c00 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b  ; j<nOrderBy; j+
19c10 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
19c20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
19c30 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
19c40 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Col>0 );.       
19c50 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e   if( pItem->u.x.
19c60 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29  iOrderByCol==i )
19c70 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
19c80 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72        if( j==nOr
19c90 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
19ca0 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
19cb0 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
19cc0 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20  _INTEGER, 0);.  
19cd0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d        if( pNew==
19ce0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
19cf0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
19d00 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
19d10 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65  s |= EP_IntValue
19d20 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
19d30 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20  u.iValue = i;.  
19d40 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
19d50 79 20 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 73  y = pOrderBy = s
19d60 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
19d70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72  pend(pParse, pOr
19d80 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20  derBy, pNew);.  
19d90 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
19da0 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61  By ) pOrderBy->a
19db0 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78  [nOrderBy++].u.x
19dc0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28  .iOrderByCol = (
19dd0 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  u16)i;.      }. 
19de0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
19df0 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61  ompute the compa
19e00 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f  rison permutatio
19e10 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68  n and keyinfo th
19e20 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68 0a  at is used with.
19e30 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61    ** the permuta
19e40 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74  tion used to det
19e50 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65  ermine if the ne
19e60 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72  xt.  ** row of r
19e70 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f  esults comes fro
19e80 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c  m selectA or sel
19e90 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20  ectB.  Also add 
19ea0 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f  explicit.  ** co
19eb0 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  llations to the 
19ec0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
19ed0 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68  terms so that wh
19ee0 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65  en the subquerie
19ef0 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69  s.  ** to the ri
19f00 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74  ght and the left
19f10 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20   are evaluated, 
19f20 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f 72  they use the cor
19f30 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  rect.  ** collat
19f40 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72  ion..  */.  aPer
19f50 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62  mute = sqlite3Db
19f60 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
19f70 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 4f 72  sizeof(int)*(nOr
19f80 64 65 72 42 79 20 2b 20 31 29 29 3b 0a 20 20 69  derBy + 1));.  i
19f90 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20  f( aPermute ){. 
19fa0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
19fb0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
19fc0 20 20 20 20 61 50 65 72 6d 75 74 65 5b 30 5d 20      aPermute[0] 
19fd0 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = nOrderBy;.    
19fe0 66 6f 72 28 69 3d 31 2c 20 70 49 74 65 6d 3d 70  for(i=1, pItem=p
19ff0 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e  OrderBy->a; i<=n
1a000 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49  OrderBy; i++, pI
1a010 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  tem++){.      as
1a020 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78  sert( pItem->u.x
1a030 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29  .iOrderByCol>0 )
1a040 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1a050 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
1a060 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73  rByCol<=p->pELis
1a070 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
1a080 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20    aPermute[i] = 
1a090 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
1a0a0 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20  rByCol - 1;.    
1a0b0 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20  }.    pKeyMerge 
1a0c0 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  = multiSelectOrd
1a0d0 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72  erByKeyInfo(pPar
1a0e0 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c  se, p, 1);.  }el
1a0f0 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67  se{.    pKeyMerg
1a100 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
1a110 20 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52   Reattach the OR
1a120 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f  DER BY clause to
1a130 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
1a140 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
1a150 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72   pOrderBy;.  pPr
1a160 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  ior->pOrderBy = 
1a170 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
1a180 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
1a190 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20  OrderBy, 0);..  
1a1a0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61  /* Allocate a ra
1a1b0 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79  nge of temporary
1a1c0 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74   registers and t
1a1d0 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65  he KeyInfo neede
1a1e0 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c  d.  ** for the l
1a1f0 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65  ogic that remove
1a200 73 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75  s duplicate resu
1a210 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65  lt rows when the
1a220 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69  .  ** operator i
1a230 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  s UNION, EXCEPT,
1a240 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62   or INTERSECT (b
1a250 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c  ut not UNION ALL
1a260 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  )..  */.  if( op
1a270 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
1a280 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d  regPrev = 0;.  }
1a290 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45  else{.    int nE
1a2a0 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
1a2b0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >nExpr;.    asse
1a2c0 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45  rt( nOrderBy>=nE
1a2d0 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  xpr || db->mallo
1a2e0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
1a2f0 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
1a300 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
1a310 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78  rse->nMem += nEx
1a320 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  pr+1;.    sqlite
1a330 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a340 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
1a350 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79  gPrev);.    pKey
1a360 44 75 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Dup = sqlite3Key
1a370 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45  InfoAlloc(db, nE
1a380 78 70 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  xpr, 1);.    if(
1a390 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20   pKeyDup ){.    
1a3a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a3b0 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
1a3c0 62 6c 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a  ble(pKeyDup) );.
1a3d0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1a3e0 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  <nExpr; i++){.  
1a3f0 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
1a400 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53  Coll[i] = multiS
1a410 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
1a420 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
1a430 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f      pKeyDup->aSo
1a440 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a  rtOrder[i] = 0;.
1a450 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a460 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74  }. .  /* Separat
1a470 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74  e the left and t
1a480 68 65 20 72 69 67 68 74 20 71 75 65 72 79 20 66  he right query f
1a490 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a  rom one another.
1a4a0 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72    */.  p->pPrior
1a4b0 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e   = 0;.  pPrior->
1a4c0 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c  pNext = 0;.  sql
1a4d0 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
1a4e0 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
1a4f0 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  p, p->pOrderBy, 
1a500 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20  "ORDER");.  if( 
1a510 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d  pPrior->pPrior==
1a520 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1a530 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
1a540 70 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69  pBy(pParse, pPri
1a550 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  or, pPrior->pOrd
1a560 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
1a570 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
1a580 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69  e the limit regi
1a590 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75  sters */.  compu
1a5a0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
1a5b0 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65  (pParse, p, labe
1a5c0 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  lEnd);.  if( p->
1a5d0 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b  iLimit && op==TK
1a5e0 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c  _ALL ){.    regL
1a5f0 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65  imitA = ++pParse
1a600 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c  ->nMem;.    regL
1a610 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  imitB = ++pParse
1a620 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
1a630 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a640 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66   OP_Copy, p->iOf
1a650 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65  fset ? p->iOffse
1a660 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c  t+1 : p->iLimit,
1a670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a690 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20     regLimitA);. 
1a6a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a6b0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
1a6c0 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c   regLimitA, regL
1a6d0 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b  imitB);.  }else{
1a6e0 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d  .    regLimitA =
1a6f0 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a   regLimitB = 0;.
1a700 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
1a710 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
1a720 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69  Limit);.  p->pLi
1a730 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41  mit = 0;..  regA
1a740 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrA = ++pParse-
1a750 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72  >nMem;.  regAddr
1a760 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
1a770 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20  em;.  regOutA = 
1a780 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1a790 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50    regOutB = ++pP
1a7a0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
1a7b0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
1a7c0 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f  nit(&destA, SRT_
1a7d0 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
1a7e0 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  drA);.  sqlite3S
1a7f0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
1a800 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74  estB, SRT_Corout
1a810 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  ine, regAddrB);.
1a820 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1a830 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
1a840 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
1a850 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74  T statement to t
1a860 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20  he.  ** left of 
1a870 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65  the compound ope
1a880 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20  rator - the "A" 
1a890 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 61  select..  */.  a
1a8a0 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c  ddrSelectA = sql
1a8b0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1a8c0 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61 64  ddr(v) + 1;.  ad
1a8d0 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
1a8e0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
1a8f0 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  itCoroutine, reg
1a900 41 64 64 72 41 2c 20 30 2c 20 61 64 64 72 53 65  AddrA, 0, addrSe
1a910 6c 65 63 74 41 29 3b 0a 20 20 56 64 62 65 43 6f  lectA);.  VdbeCo
1a920 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66 74 20  mment((v, "left 
1a930 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50 72  SELECT"));.  pPr
1a940 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65  ior->iLimit = re
1a950 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c 61  gLimitA;.  expla
1a960 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
1a970 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
1a980 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71  tSelectId);.  sq
1a990 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
1a9a0 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73  se, pPrior, &des
1a9b0 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tA);.  sqlite3Vd
1a9c0 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76  beEndCoroutine(v
1a9d0 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73  , regAddrA);.  s
1a9e0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1a9f0 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20  re(v, addr1);.. 
1aa00 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63   /* Generate a c
1aa10 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c  oroutine to eval
1aa20 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  uate the SELECT 
1aa30 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20  statement on .  
1aa40 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20 74  ** the right - t
1aa50 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20  he "B" select.  
1aa60 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42  */.  addrSelectB
1aa70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1aa80 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31  rrentAddr(v) + 1
1aa90 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
1aaa0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1aab0 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
1aac0 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20  e, regAddrB, 0, 
1aad0 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20  addrSelectB);.  
1aae0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1aaf0 22 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29  "right SELECT"))
1ab00 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d  ;.  savedLimit =
1ab10 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61   p->iLimit;.  sa
1ab20 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  vedOffset = p->i
1ab30 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69  Offset;.  p->iLi
1ab40 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b  mit = regLimitB;
1ab50 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20  .  p->iOffset = 
1ab60 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65  0;  .  explainSe
1ab70 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
1ab80 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
1ab90 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65  ectId);.  sqlite
1aba0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
1abb0 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d  p, &destB);.  p-
1abc0 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c  >iLimit = savedL
1abd0 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  imit;.  p->iOffs
1abe0 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74  et = savedOffset
1abf0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 45  ;.  sqlite3VdbeE
1ac00 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72  ndCoroutine(v, r
1ac10 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20  egAddrB);..  /* 
1ac20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1ac30 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
1ac40 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
1ac50 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a  ow of the A.  **
1ac60 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
1ac70 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
1ac80 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
1ac90 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64  elect..  */.  Vd
1aca0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1acb0 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e  , "Output routin
1acc0 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64  e for A"));.  ad
1acd0 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74  drOutA = generat
1ace0 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
1acf0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
1ad00 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
1ad10 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67  estA, pDest, reg
1ad20 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20  OutA,.          
1ad30 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
1ad40 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e  pKeyDup, labelEn
1ad50 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65  d);.  .  /* Gene
1ad60 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
1ad70 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74  e that outputs t
1ad80 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
1ad90 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c  f the B.  ** sel
1ada0 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20  ect as the next 
1adb0 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68  output row of th
1adc0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
1add0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  t..  */.  if( op
1ade0 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d  ==TK_ALL || op==
1adf0 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
1ae00 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1ae10 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74  (v, "Output rout
1ae20 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20  ine for B"));.  
1ae30 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e    addrOutB = gen
1ae40 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
1ae50 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20  utine(pParse,.  
1ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1ae70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c  , &destB, pDest,
1ae80 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20   regOutB,.      
1ae90 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72             regPr
1aea0 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62  ev, pKeyDup, lab
1aeb0 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71  elEnd);.  }.  sq
1aec0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
1aed0 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f  f(pKeyDup);..  /
1aee0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
1aef0 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77  routine to run w
1af00 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
1af10 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20  from select A.  
1af20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64  ** are exhausted
1af30 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69   and only data i
1af40 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69  n select B remai
1af50 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ns..  */.  if( o
1af60 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20  p==TK_EXCEPT || 
1af70 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
1af80 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41   ){.    addrEofA
1af90 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66 41 20  _noB = addrEofA 
1afa0 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d 65  = labelEnd;.  }e
1afb0 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e  lse{  .    VdbeN
1afc0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1afd0 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65  eof-A subroutine
1afe0 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  "));.    addrEof
1aff0 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  A = sqlite3VdbeA
1b000 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1b010 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72  b, regOutB, addr
1b020 4f 75 74 42 29 3b 0a 20 20 20 20 61 64 64 72 45  OutB);.    addrE
1b030 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74 65  ofA_noB = sqlite
1b040 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b050 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1b060 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  B, labelEnd);.  
1b070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b090 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1b0a0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1b0b0 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45  dbeGoto(v, addrE
1b0c0 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65  ofA);.    p->nSe
1b0d0 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
1b0e0 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53  3LogEstAdd(p->nS
1b0f0 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72  electRow, pPrior
1b100 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20  ->nSelectRow);. 
1b110 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1b120 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
1b130 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
1b140 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
1b150 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct B.  ** are ex
1b160 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
1b170 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
1b180 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  A remains..  */.
1b190 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54    if( op==TK_INT
1b1a0 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
1b1b0 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66  drEofB = addrEof
1b1c0 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  A;.    if( p->nS
1b1d0 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f  electRow > pPrio
1b1e0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20  r->nSelectRow ) 
1b1f0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
1b200 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
1b210 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  ow;.  }else{  . 
1b220 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
1b230 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75  nt((v, "eof-B su
1b240 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
1b250 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69   addrEofB = sqli
1b260 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b270 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1b280 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
1b290 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b2a0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1b2b0 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61 62 65  , regAddrA, labe
1b2c0 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72  lEnd); VdbeCover
1b2d0 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1b2e0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
1b2f0 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20  ddrEofB);.  }.. 
1b300 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1b310 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
1b320 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f  case of A<B.  */
1b330 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
1b340 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73  nt((v, "A-lt-B s
1b350 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1b360 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74  addrAltB = sqlit
1b370 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b380 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
1b390 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20  A, addrOutA);.  
1b3a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b3b0 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1b3c0 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
1b3d0 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  A); VdbeCoverage
1b3e0 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
1b3f0 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43  beGoto(v, labelC
1b400 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  mpr);..  /* Gene
1b410 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
1b420 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
1b430 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20  A==B.  */.  if( 
1b440 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
1b450 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64    addrAeqB = add
1b460 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69  rAltB;.  }else i
1b470 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  f( op==TK_INTERS
1b480 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41  ECT ){.    addrA
1b490 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a  eqB = addrAltB;.
1b4a0 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a      addrAltB++;.
1b4b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62    }else{.    Vdb
1b4c0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1b4d0 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74   "A-eq-B subrout
1b4e0 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ine"));.    addr
1b4f0 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74  AeqB =.    sqlit
1b500 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b510 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1b520 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56  rA, addrEofA); V
1b530 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1b540 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1b550 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72  oto(v, labelCmpr
1b560 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
1b570 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
1b580 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
1b590 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65   A>B.  */.  Vdbe
1b5a0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1b5b0 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69  "A-gt-B subrouti
1b5c0 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74  ne"));.  addrAgt
1b5d0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
1b5e0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1b5f0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1b600 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  || op==TK_UNION 
1b610 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1b620 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1b630 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61  osub, regOutB, a
1b640 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20  ddrOutB);.  }.  
1b650 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b660 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1b670 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66  egAddrB, addrEof
1b680 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
1b690 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
1b6a0 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43  beGoto(v, labelC
1b6b0 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  mpr);..  /* This
1b6c0 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20   code runs once 
1b6d0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76  to initialize ev
1b6e0 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  erything..  */. 
1b6f0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1b700 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
1b710 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b720 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1b730 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45   regAddrA, addrE
1b740 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f  ofA_noB); VdbeCo
1b750 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1b760 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b770 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1b780 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b  ddrB, addrEofB);
1b790 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1b7a0 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e  ;..  /* Implemen
1b7b0 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65  t the main merge
1b7c0 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
1b7d0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1b7e0 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70  abel(v, labelCmp
1b7f0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
1b800 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65  eAddOp4(v, OP_Pe
1b810 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c  rmutation, 0, 0,
1b820 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d   0, (char*)aPerm
1b830 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59  ute, P4_INTARRAY
1b840 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1b850 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
1b860 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73  pare, destA.iSds
1b870 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20  t, destB.iSdst, 
1b880 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  nOrderBy,.      
1b890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8a0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65     (char*)pKeyMe
1b8b0 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  rge, P4_KEYINFO)
1b8c0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1b8d0 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
1b8e0 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20 73 71  G_PERMUTE);.  sq
1b8f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1b900 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
1b910 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20  AltB, addrAeqB, 
1b920 61 64 64 72 41 67 74 42 29 3b 20 56 64 62 65 43  addrAgtB); VdbeC
1b930 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
1b940 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68  * Jump to the th
1b950 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65  is point in orde
1b960 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  r to terminate t
1b970 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
1b980 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1b990 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
1b9a0 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  lEnd);..  /* Rea
1b9b0 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70  ssembly the comp
1b9c0 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68  ound query so th
1b9d0 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72  at it will be fr
1b9e0 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20  eed correctly.  
1b9f0 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ** by the callin
1ba00 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  g function */.  
1ba10 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
1ba20 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
1ba30 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  ctDelete(db, p->
1ba40 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70  pPrior);.  }.  p
1ba50 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
1ba60 72 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65  r;.  pPrior->pNe
1ba70 78 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20  xt = p;..  /*** 
1ba80 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62  TBD:  Insert sub
1ba90 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f  routine calls to
1baa0 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f   close cursors o
1bab0 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a  n incomplete.  *
1bac0 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a  *** subqueries *
1bad0 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f  ***/.  explainCo
1bae0 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20  mposite(pParse, 
1baf0 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53  p->op, iSub1, iS
1bb00 75 62 32 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  ub2, 0);.  retur
1bb10 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 21 3d  n pParse->nErr!=
1bb20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0;.}.#endif..#if
1bb30 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1bb40 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1bb50 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1bb60 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 0a 2f  TE_OMIT_VIEW)../
1bb70 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
1bb80 20 74 68 65 20 53 75 62 73 74 43 6f 6e 74 65 78   the SubstContex
1bb90 74 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62  t object describ
1bba0 65 73 20 61 6e 20 73 75 62 73 74 69 74 75 74 69  es an substituti
1bbb0 6f 6e 20 65 64 69 74 0a 2a 2a 20 74 6f 20 62 65  on edit.** to be
1bbc0 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 61 20   performed on a 
1bbd0 70 61 72 73 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a  parse tree..**.*
1bbe0 2a 20 41 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  * All references
1bbf0 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   to columns in t
1bc00 61 62 6c 65 20 69 54 61 62 6c 65 20 61 72 65 20  able iTable are 
1bc10 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 62  to be replaced b
1bc20 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  y corresponding.
1bc30 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  ** expressions i
1bc40 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f 0a 74 79 70  n pEList..*/.typ
1bc50 65 64 65 66 20 73 74 72 75 63 74 20 53 75 62 73  edef struct Subs
1bc60 74 43 6f 6e 74 65 78 74 20 7b 0a 20 20 50 61 72  tContext {.  Par
1bc70 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
1bc80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1bc90 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1bca0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 3b 20 20  .  int iTable;  
1bcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bcc0 52 65 70 6c 61 63 65 20 72 65 66 65 72 65 6e 63  Replace referenc
1bcd0 65 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  es to this table
1bce0 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 54 61   */.  int iNewTa
1bcf0 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
1bd00 2f 2a 20 4e 65 77 20 74 61 62 6c 65 20 6e 75 6d  /* New table num
1bd10 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c  ber */.  int isL
1bd20 65 66 74 4a 6f 69 6e 3b 20 20 20 20 20 20 20 20  eftJoin;        
1bd30 20 20 20 2f 2a 20 41 64 64 20 54 4b 5f 49 46 5f     /* Add TK_IF_
1bd40 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63 6f 64 65 73  NULL_ROW opcodes
1bd50 20 6f 6e 20 65 61 63 68 20 72 65 70 6c 61 63 65   on each replace
1bd60 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ment */.  ExprLi
1bd70 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
1bd80 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 6d 65      /* Replaceme
1bd90 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a  nt expressions *
1bda0 2f 0a 7d 20 53 75 62 73 74 43 6f 6e 74 65 78 74  /.} SubstContext
1bdb0 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65  ;../* Forward De
1bdc0 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74  clarations */.st
1bdd0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
1bde0 78 70 72 4c 69 73 74 28 53 75 62 73 74 43 6f 6e  xprList(SubstCon
1bdf0 74 65 78 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a  text*, ExprList*
1be00 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  );.static void s
1be10 75 62 73 74 53 65 6c 65 63 74 28 53 75 62 73 74  ubstSelect(Subst
1be20 43 6f 6e 74 65 78 74 2a 2c 20 53 65 6c 65 63 74  Context*, Select
1be30 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
1be40 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  Scan through the
1be50 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
1be60 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72  r.  Replace ever
1be70 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a  y reference to.*
1be80 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  * a column in ta
1be90 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c  ble number iTabl
1bea0 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  e with a copy of
1beb0 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a   the iColumn-th.
1bec0 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69  ** entry in pELi
1bed0 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20  st.  (But leave 
1bee0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
1bef0 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a  e ROWID column .
1bf00 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a  ** unchanged.).*
1bf10 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1bf20 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
1bf30 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63   flattening proc
1bf40 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65  edure.  A subque
1bf50 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75  ry.** whose resu
1bf60 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65  lt set is define
1bf70 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65  d by pEList appe
1bf80 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20  ars as entry in 
1bf90 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  the.** FROM clau
1bfa0 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
1bfb0 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42  uch that the VDB
1bfc0 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65  E cursor assigne
1bfd0 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52  d to that.** FOR
1bfe0 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69  M clause entry i
1bff0 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20  s iTable.  This 
1c000 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68  routine makes th
1c010 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20  e necessary .** 
1c020 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72  changes to pExpr
1c030 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65   so that it refe
1c040 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  rs directly to t
1c050 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a  he source table.
1c060 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
1c070 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65  ry rather the re
1c080 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
1c090 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61  subquery..*/.sta
1c0a0 74 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45  tic Expr *substE
1c0b0 78 70 72 28 0a 20 20 53 75 62 73 74 43 6f 6e 74  xpr(.  SubstCont
1c0c0 65 78 74 20 2a 70 53 75 62 73 74 2c 20 20 2f 2a  ext *pSubst,  /*
1c0d0 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
1c0e0 74 68 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  the substitution
1c0f0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
1c100 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
1c110 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73 75  Expr in which su
1c120 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72  bstitution occur
1c130 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45  s */.){.  if( pE
1c140 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  xpr==0 ) return 
1c150 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  0;.  if( ExprHas
1c160 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1c170 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
1c180 26 26 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74  && pExpr->iRight
1c190 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70 53 75 62 73  JoinTable==pSubs
1c1a0 74 2d 3e 69 54 61 62 6c 65 0a 20 20 29 7b 0a 20  t->iTable.  ){. 
1c1b0 20 20 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74     pExpr->iRight
1c1c0 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 53 75 62  JoinTable = pSub
1c1d0 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20  st->iNewTable;. 
1c1e0 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e   }.  if( pExpr->
1c1f0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
1c200 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
1c210 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 20 29  pSubst->iTable )
1c220 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
1c230 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
1c240 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
1c250 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TK_NULL;.    }el
1c260 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
1c270 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72  pNew;.      Expr
1c280 20 2a 70 43 6f 70 79 20 3d 20 70 53 75 62 73 74   *pCopy = pSubst
1c290 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70  ->pEList->a[pExp
1c2a0 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  r->iColumn].pExp
1c2b0 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 69 66  r;.      Expr if
1c2c0 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 61  NullRow;.      a
1c2d0 73 73 65 72 74 28 20 70 53 75 62 73 74 2d 3e 70  ssert( pSubst->p
1c2e0 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70  EList!=0 && pExp
1c2f0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53 75 62 73  r->iColumn<pSubs
1c300 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
1c310 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1c320 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
1c330 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
1c340 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ht==0 );.      i
1c350 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
1c360 56 65 63 74 6f 72 28 70 43 6f 70 79 29 20 29 7b  Vector(pCopy) ){
1c370 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c380 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70  VectorErrorMsg(p
1c390 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2c 20 70  Subst->pParse, p
1c3a0 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Copy);.      }el
1c3b0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1c3c0 74 65 33 20 2a 64 62 20 3d 20 70 53 75 62 73 74  te3 *db = pSubst
1c3d0 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
1c3e0 20 20 20 20 20 20 69 66 28 20 70 53 75 62 73 74        if( pSubst
1c3f0 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 26 26 20  ->isLeftJoin && 
1c400 70 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pCopy->op!=TK_CO
1c410 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
1c420 20 20 6d 65 6d 73 65 74 28 26 69 66 4e 75 6c 6c    memset(&ifNull
1c430 52 6f 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  Row, 0, sizeof(i
1c440 66 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20 20 20 20  fNullRow));.    
1c450 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e        ifNullRow.
1c460 6f 70 20 3d 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  op = TK_IF_NULL_
1c470 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ROW;.          i
1c480 66 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66 74 20 3d  fNullRow.pLeft =
1c490 20 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20   pCopy;.        
1c4a0 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 69 54 61 62    ifNullRow.iTab
1c4b0 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65  le = pSubst->iNe
1c4c0 77 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  wTable;.        
1c4d0 20 20 70 43 6f 70 79 20 3d 20 26 69 66 4e 75 6c    pCopy = &ifNul
1c4e0 6c 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lRow;.        }.
1c4f0 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
1c500 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
1c510 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20 20 20  , pCopy, 0);.   
1c520 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26       if( pNew &&
1c530 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a   pSubst->isLeftJ
1c540 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oin ){.         
1c550 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
1c560 28 70 4e 65 77 2c 20 45 50 5f 43 61 6e 42 65 4e  (pNew, EP_CanBeN
1c570 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ull);.        }.
1c580 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1c590 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
1c5a0 72 74 79 28 70 45 78 70 72 2c 45 50 5f 46 72 6f  rty(pExpr,EP_Fro
1c5b0 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  mJoin) ){.      
1c5c0 20 20 20 20 70 4e 65 77 2d 3e 69 52 69 67 68 74      pNew->iRight
1c5d0 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 45 78 70  JoinTable = pExp
1c5e0 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
1c5f0 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78  le;.          Ex
1c600 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e  prSetProperty(pN
1c610 65 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  ew, EP_FromJoin)
1c620 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c630 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1c640 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
1c650 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20  ;.        pExpr 
1c660 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a  = pNew;.      }.
1c670 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1c680 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
1c690 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57  ==TK_IF_NULL_ROW
1c6a0 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
1c6b0 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c  e==pSubst->iTabl
1c6c0 65 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  e ){.      pExpr
1c6d0 2d 3e 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73  ->iTable = pSubs
1c6e0 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20  t->iNewTable;.  
1c6f0 20 20 7d 0a 20 20 20 20 70 45 78 70 72 2d 3e 70    }.    pExpr->p
1c700 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70 72  Left = substExpr
1c710 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e  (pSubst, pExpr->
1c720 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 45 78 70  pLeft);.    pExp
1c730 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73  r->pRight = subs
1c740 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 45  tExpr(pSubst, pE
1c750 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
1c760 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1c770 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1c780 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
1c790 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
1c7a0 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78  pSubst, pExpr->x
1c7b0 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20  .pSelect, 1);.  
1c7c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1c7d0 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1c7e0 62 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  bst, pExpr->x.pL
1c7f0 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
1c800 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a    return pExpr;.
1c810 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1c820 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 53  bstExprList(.  S
1c830 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75  ubstContext *pSu
1c840 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74  bst, /* Descript
1c850 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74  ion of the subst
1c860 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  itution */.  Exp
1c870 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20  rList *pList    
1c880 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63     /* List to sc
1c890 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20  an and in which 
1c8a0 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
1c8b0 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tes */.){.  int 
1c8c0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1c8d0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
1c8e0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1c8f0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1c900 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
1c910 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  pr = substExpr(p
1c920 53 75 62 73 74 2c 20 70 4c 69 73 74 2d 3e 61 5b  Subst, pList->a[
1c930 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 7d  i].pExpr);.  }.}
1c940 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1c950 73 74 53 65 6c 65 63 74 28 0a 20 20 53 75 62 73  stSelect(.  Subs
1c960 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74  tContext *pSubst
1c970 2c 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e  , /* Description
1c980 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75   of the substitu
1c990 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tion */.  Select
1c9a0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1c9b0 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
1c9c0 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ent in which to 
1c9d0 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f  make substitutio
1c9e0 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50 72  ns */.  int doPr
1c9f0 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ior           /*
1ca00 20 44 6f 20 73 75 62 73 74 69 74 75 74 65 73 20   Do substitutes 
1ca10 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f 6f  on p->pPrior too
1ca20 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
1ca30 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74   *pSrc;.  struct
1ca40 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1ca50 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
1ca60 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
1ca70 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75 62 73  ;.  do{.    subs
1ca80 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74  tExprList(pSubst
1ca90 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
1caa0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1cab0 70 53 75 62 73 74 2c 20 70 2d 3e 70 47 72 6f 75  pSubst, p->pGrou
1cac0 70 42 79 29 3b 0a 20 20 20 20 73 75 62 73 74 45  pBy);.    substE
1cad0 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20  xprList(pSubst, 
1cae0 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
1caf0 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73    p->pHaving = s
1cb00 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1cb10 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
1cb20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75    p->pWhere = su
1cb30 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20  bstExpr(pSubst, 
1cb40 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
1cb50 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
1cb60 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
1cb70 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  !=0 );.    for(i
1cb80 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74  =pSrc->nSrc, pIt
1cb90 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b  em=pSrc->a; i>0;
1cba0 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
1cbb0 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
1cbc0 74 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d 2d  t(pSubst, pItem-
1cbd0 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20  >pSelect, 1);.  
1cbe0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
1cbf0 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20  g.isTabFunc ){. 
1cc00 20 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72         substExpr
1cc10 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 49 74  List(pSubst, pIt
1cc20 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29  em->u1.pFuncArg)
1cc30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cc40 20 20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69 6f    }while( doPrio
1cc50 72 20 26 26 20 28 70 20 3d 20 70 2d 3e 70 50 72  r && (p = p->pPr
1cc60 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65 6e  ior)!=0 );.}.#en
1cc70 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
1cc80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1cc90 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1cca0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1ccb0 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  EW) */..#if !def
1ccc0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1ccd0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1cce0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1ccf0 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54  IT_VIEW)./*.** T
1cd00 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
1cd10 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
1cd20 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61 20  subqueries as a 
1cd30 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69  performance opti
1cd40 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  mization..** Thi
1cd50 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1cd60 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
1cd70 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
1cd80 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f   no flattening o
1cd90 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
1cda0 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
1cdb0 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
1cdc0 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
1cdd0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1cde0 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
1cdf0 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
1ce00 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
1ce10 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
1ce20 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
1ce30 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
1ce40 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
1ce50 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
1ce60 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
1ce70 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
1ce80 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
1ce90 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
1cea0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
1ceb0 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
1cec0 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
1ced0 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
1cee0 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
1cef0 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
1cf00 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
1cf10 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
1cf20 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
1cf30 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
1cf40 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
1cf50 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
1cf60 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1cf70 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
1cf80 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
1cf90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
1cfa0 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
1cfb0 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
1cfc0 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
1cfd0 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
1cfe0 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
1cff0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
1d000 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
1d010 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
1d020 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
1d030 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
1d040 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
1d050 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73  lification gives
1d060 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
1d070 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73  .** but only has
1d080 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74   to scan the dat
1d090 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63  a once.  And bec
1d0a0 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67  ause indices mig
1d0b0 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20  ht .** exist on 
1d0c0 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20  the table t1, a 
1d0d0 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66  complete scan of
1d0e0 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   the data might 
1d0f0 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a  be.** avoided..*
1d100 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20  *.** Flattening 
1d110 69 73 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  is subject to th
1d120 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73  e following cons
1d130 74 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  traints:.**.**  
1d140 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67  (**)  We no long
1d150 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c  er attempt to fl
1d160 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20  atten aggregate 
1d170 73 75 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a  subqueries. Was:
1d180 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 73  .**        The s
1d190 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
1d1a0 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e  outer query cann
1d1b0 6f 74 20 62 6f 74 68 20 62 65 20 61 67 67 72 65  ot both be aggre
1d1c0 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  gates..**.**  (*
1d1d0 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72  *)  We no longer
1d1e0 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74   attempt to flat
1d1f0 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75  ten aggregate su
1d200 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a 0a 2a  bqueries. Was:.*
1d210 2a 20 20 20 20 20 20 20 20 28 32 29 20 49 66 20  *        (2) If 
1d220 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1d230 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 65  an aggregate the
1d240 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 61 29  n.**        (2a)
1d250 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d260 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20 6a   must not be a j
1d270 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  oin and.**      
1d280 20 20 28 32 62 29 20 74 68 65 20 6f 75 74 65 72    (2b) the outer
1d290 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74 20   query must not 
1d2a0 75 73 65 20 73 75 62 71 75 65 72 69 65 73 0a 2a  use subqueries.*
1d2b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74  *             ot
1d2c0 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65  her than the one
1d2d0 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
1d2e0 71 75 65 72 79 20 74 68 61 74 20 69 73 20 61 20  query that is a 
1d2f0 63 61 6e 64 69 64 61 74 65 0a 2a 2a 20 20 20 20  candidate.**    
1d300 20 20 20 20 20 20 20 20 20 66 6f 72 20 66 6c 61           for fla
1d310 74 74 65 6e 69 6e 67 2e 20 20 28 54 68 69 73 20  ttening.  (This 
1d320 69 73 20 64 75 65 20 74 6f 20 74 69 63 6b 65 74  is due to ticket
1d330 20 5b 32 66 37 31 37 30 64 37 33 62 66 39 61 62   [2f7170d73bf9ab
1d340 66 38 30 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20  f80].**         
1d350 20 20 20 20 66 72 6f 6d 20 32 30 31 35 2d 30 32      from 2015-02
1d360 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33  -09.).**.**   (3
1d370 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  )  If the subque
1d380 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
1d390 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46  operand of a LEF
1d3a0 54 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a 2a 20 20  T JOIN then.**  
1d3b0 20 20 20 20 20 20 28 33 61 29 20 74 68 65 20 73        (3a) the s
1d3c0 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
1d3d0 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a  be a join and.**
1d3e0 20 20 20 20 20 20 20 20 28 33 62 29 20 74 68 65          (3b) the
1d3f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1d400 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  the subquery may
1d410 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 76   not contain a v
1d420 69 72 74 75 61 6c 0a 2a 2a 20 20 20 20 20 20 20  irtual.**       
1d430 20 20 20 20 20 20 74 61 62 6c 65 20 61 6e 64 0a        table and.
1d440 2a 2a 20 20 20 20 20 20 20 20 28 33 63 29 20 74  **        (3c) t
1d450 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1d460 61 79 20 6e 6f 74 20 62 65 20 61 6e 20 61 67 67  ay not be an agg
1d470 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  regate..**.**   
1d480 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
1d490 79 20 63 61 6e 20 6e 6f 74 20 62 65 20 44 49 53  y can not be DIS
1d4a0 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  TINCT..**.**  (*
1d4b0 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74  *)  At one point
1d4c0 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34   restrictions (4
1d4d0 29 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65  ) and (5) define
1d4e0 64 20 61 20 73 75 62 73 65 74 20 6f 66 20 44 49  d a subset of DI
1d4f0 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20  STINCT.**       
1d500 20 73 75 62 2d 71 75 65 72 69 65 73 20 74 68 61   sub-queries tha
1d510 74 20 77 65 72 65 20 65 78 63 6c 75 64 65 64 20  t were excluded 
1d520 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69  from this optimi
1d530 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74  zation. Restrict
1d540 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28  ion .**        (
1d550 34 29 20 68 61 73 20 73 69 6e 63 65 20 62 65 65  4) has since bee
1d560 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78  n expanded to ex
1d570 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e  clude all DISTIN
1d580 43 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  CT subqueries..*
1d590 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e  *.**  (**)  We n
1d5a0 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74  o longer attempt
1d5b0 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72   to flatten aggr
1d5c0 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73  egate subqueries
1d5d0 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20  .  Was:.**      
1d5e0 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1d5f0 79 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20  y is aggregate, 
1d600 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1d610 6d 61 79 20 6e 6f 74 20 62 65 20 44 49 53 54 49  may not be DISTI
1d620 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29  NCT..**.**   (7)
1d630 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 6d    The subquery m
1d640 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d 20  ust have a FROM 
1d650 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20  clause.  TODO:  
1d660 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77  For subqueries w
1d670 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20  ithout.**       
1d680 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20   A FROM clause, 
1d690 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20  consider adding 
1d6a0 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 69  a FROM clause wi
1d6b0 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a  th the special.*
1d6c0 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73  *        table s
1d6d0 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20  qlite_once that 
1d6e0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69  consists of a si
1d6f0 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e  ngle row contain
1d700 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
1d710 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a  single NULL..**.
1d720 2a 2a 20 20 20 28 38 29 20 20 49 66 20 74 68 65  **   (8)  If the
1d730 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c   subquery uses L
1d740 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75  IMIT then the ou
1d750 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
1d760 74 20 62 65 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a  t be a join..**.
1d770 2a 2a 20 20 20 28 39 29 20 20 49 66 20 74 68 65  **   (9)  If the
1d780 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c   subquery uses L
1d790 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75  IMIT then the ou
1d7a0 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
1d7b0 74 20 62 65 20 61 67 67 72 65 67 61 74 65 2e 0a  t be aggregate..
1d7c0 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65 73  **.**  (**)  Res
1d7d0 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77 61  triction (10) wa
1d7e0 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
1d7f0 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35 2d  he code on 2005-
1d800 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a 20  02-05 but we.** 
1d810 20 20 20 20 20 20 20 61 63 63 69 64 65 6e 74 6c         accidentl
1d820 79 20 63 61 72 72 69 65 64 20 74 68 65 20 63 6f  y carried the co
1d830 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75 6e  mment forward un
1d840 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e 20  til 2014-09-15. 
1d850 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   Original.**    
1d860 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 3a 20      constraint: 
1d870 22 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79  "If the subquery
1d880 20 69 73 20 61 67 67 72 65 67 61 74 65 20 74 68   is aggregate th
1d890 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  en the outer que
1d8a0 72 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 6d 61  ry .**        ma
1d8b0 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e  y not use LIMIT.
1d8c0 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54  ".**.**  (11)  T
1d8d0 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
1d8e0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1d8f0 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20 68 61 76  may not both hav
1d900 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1d910 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  es..**.**  (**) 
1d920 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64   Not implemented
1d930 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f  .  Subsumed into
1d940 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29   restriction (3)
1d950 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c  .  Was previousl
1d960 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65  y.**        a se
1d970 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74 69  parate restricti
1d980 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d  on deriving from
1d990 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a   ticket #350..**
1d9a0 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73  .**  (13)  The s
1d9b0 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65  ubquery and oute
1d9c0 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
1d9d0 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a  both use LIMIT..
1d9e0 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65  **.**  (14)  The
1d9f0 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
1da00 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a  t use OFFSET..**
1da10 0a 2a 2a 20 20 28 31 35 29 20 20 49 66 20 74 68  .**  (15)  If th
1da20 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
1da30 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
1da40 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
1da50 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
1da60 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
1da70 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 20 20 20  use LIMIT..**   
1da80 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74       (See ticket
1da90 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65   #2339 and ticke
1daa0 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e  t [02a8e81d44]).
1dab0 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 49 66  .**.**  (16)  If
1dac0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1dad0 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20 74   is aggregate, t
1dae0 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 79  hen the subquery
1daf0 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20 20   may not.**     
1db00 20 20 20 75 73 65 20 4f 52 44 45 52 20 42 59 2e     use ORDER BY.
1db10 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29    (Ticket #2942)
1db20 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e    This used to n
1db30 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20  ot matter.**    
1db40 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74      until we int
1db50 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75  roduced the grou
1db60 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74  p_concat() funct
1db70 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31  ion.  .**.**  (1
1db80 37 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75  7)  If the subqu
1db90 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
1dba0 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 0a 2a  d select, then.*
1dbb0 2a 20 20 20 20 20 20 20 20 28 31 37 61 29 20 61  *        (17a) a
1dbc0 6c 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72  ll compound oper
1dbd0 61 74 6f 72 73 20 6d 75 73 74 20 62 65 20 61 20  ators must be a 
1dbe0 55 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e 64 0a 2a  UNION ALL, and.*
1dbf0 2a 20 20 20 20 20 20 20 20 28 31 37 62 29 20 6e  *        (17b) n
1dc00 6f 20 74 65 72 6d 73 20 77 69 74 68 69 6e 20 74  o terms within t
1dc10 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d 70  he subquery comp
1dc20 6f 75 6e 64 20 6d 61 79 20 62 65 20 61 67 67 72  ound may be aggr
1dc30 65 67 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20  egate.**        
1dc40 20 20 20 20 20 20 6f 72 20 44 49 53 54 49 4e 43        or DISTINC
1dc50 54 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  T, and.**       
1dc60 20 28 31 37 63 29 20 65 76 65 72 79 20 74 65 72   (17c) every ter
1dc70 6d 20 77 69 74 68 69 6e 20 74 68 65 20 73 75 62  m within the sub
1dc80 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20 6d  query compound m
1dc90 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d 20  ust have a FROM 
1dca0 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  clause.**       
1dcb0 20 28 31 37 64 29 20 74 68 65 20 6f 75 74 65 72   (17d) the outer
1dcc0 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62   query may not b
1dcd0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
1dce0 20 20 28 31 37 64 31 29 20 61 67 67 72 65 67 61    (17d1) aggrega
1dcf0 74 65 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  te, or.**       
1dd00 20 20 20 20 20 20 20 28 31 37 64 32 29 20 44 49         (17d2) DI
1dd10 53 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a 20 20 20  STINCT, or.**   
1dd20 20 20 20 20 20 20 20 20 20 20 20 28 31 37 64 33             (17d3
1dd30 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ) a join..**.** 
1dd40 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e         The paren
1dd50 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20  t and sub-query 
1dd60 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52  may contain WHER
1dd70 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65  E clauses. Subje
1dd80 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ct to.**        
1dd90 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29  rules (11), (13)
1dda0 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20   and (14), they 
1ddb0 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
1ddc0 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20   ORDER BY,.**   
1ddd0 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f       LIMIT and O
1dde0 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 20  FFSET clauses.  
1ddf0 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e  The subquery can
1de00 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d 70  not use any comp
1de10 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f  ound.**        o
1de20 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68  perator other th
1de30 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63  an UNION ALL bec
1de40 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74 68  ause all the oth
1de50 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  er compound.**  
1de60 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73 20        operators 
1de70 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64 20  have an implied 
1de80 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20 69  DISTINCT which i
1de90 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a  s disallowed by.
1dea0 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72 69  **        restri
1deb0 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a  ction (4)..**.**
1dec0 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65 61          Also, ea
1ded0 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20  ch component of 
1dee0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 75  the sub-query mu
1def0 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  st return the sa
1df00 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20  me number.**    
1df10 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63 6f      of result co
1df20 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20 61  lumns. This is a
1df30 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69 72  ctually a requir
1df40 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f  ement for any co
1df50 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
1df60 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1df70 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 63  t, but all the c
1df80 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69 73  ode here does is
1df90 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1dfa0 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 63  no.**        suc
1dfb0 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d  h (illegal) sub-
1dfc0 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65 6e  query is flatten
1dfd0 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ed. The caller w
1dfe0 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a 2a  ill detect the.*
1dff0 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78 20  *        syntax 
1e000 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e  error and return
1e010 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73 73   a detailed mess
1e020 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29  age..**.**  (18)
1e030 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
1e040 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1e050 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c   select, then al
1e060 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  l terms of the.*
1e070 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 42  *        ORDER B
1e080 59 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  Y clause of the 
1e090 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73  parent must be s
1e0a0 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  imple references
1e0b0 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63   to .**        c
1e0c0 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75  olumns of the su
1e0d0 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
1e0e0 28 31 39 29 20 20 49 66 20 74 68 65 20 73 75 62  (19)  If the sub
1e0f0 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54  query uses LIMIT
1e100 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
1e110 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a  query may not.**
1e120 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57          have a W
1e130 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  HERE clause..**.
1e140 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65  **  (20)  If the
1e150 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
1e160 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1e170 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f   then it must no
1e180 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
1e190 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
1e1a0 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37  se.  Ticket #377
1e1b0 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c  3.  We could rel
1e1c0 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  ax this constrai
1e1d0 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d  nt.**        som
1e1e0 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20  ewhat by saying 
1e1f0 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f  that the terms o
1e200 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
1e210 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20  lause must.**   
1e220 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75       appear as u
1e230 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74  nmodified result
1e240 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
1e250 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75  outer query.  Bu
1e260 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68  t we.**        h
1e270 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69  ave other optimi
1e280 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20  zations in mind 
1e290 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61  to deal with tha
1e2a0 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  t case..**.**  (
1e2b0 32 31 29 20 20 49 66 20 74 68 65 20 73 75 62 71  21)  If the subq
1e2c0 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54 20  uery uses LIMIT 
1e2d0 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71  then the outer q
1e2e0 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 0a  uery may not be.
1e2f0 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
1e300 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74  CT.  (See ticket
1e310 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a   [752e1646fc])..
1e320 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65  **.**  (22)  The
1e330 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
1e340 74 20 62 65 20 61 20 72 65 63 75 72 73 69 76 65  t be a recursive
1e350 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a   CTE..**.**  (**
1e360 29 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f  )  Subsumed into
1e370 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37   restriction (17
1e380 64 33 29 2e 20 20 57 61 73 3a 20 49 66 20 74 68  d3).  Was: If th
1e390 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
1e3a0 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 72 65 63  .**        a rec
1e3b0 75 72 73 69 76 65 20 43 54 45 2c 20 74 68 65 6e  ursive CTE, then
1e3c0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d   the sub-query m
1e3d0 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d 70  ay not be a comp
1e3e0 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 20 20  ound query..**  
1e3f0 20 20 20 20 20 20 54 68 69 73 20 72 65 73 74 72        This restr
1e400 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73  iction is becaus
1e410 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74  e transforming t
1e420 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72  he.**        par
1e430 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e  ent to a compoun
1e440 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73  d query confuses
1e450 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 68   the code that h
1e460 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20  andles.**       
1e470 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69   recursive queri
1e480 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63  es in multiSelec
1e490 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  t()..**.**  (**)
1e4a0 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61    We no longer a
1e4b0 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65  ttempt to flatte
1e4c0 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71  n aggregate subq
1e4d0 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a  ueries.  Was:.**
1e4e0 20 20 20 20 20 20 20 20 54 68 65 20 73 75 62 71          The subq
1e4f0 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
1e500 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 61  an aggregate tha
1e510 74 20 75 73 65 73 20 74 68 65 20 62 75 69 6c 74  t uses the built
1e520 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a  -in min() or .**
1e530 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28 29          or max()
1e540 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69   functions.  (Wi
1e550 74 68 6f 75 74 20 74 68 69 73 20 72 65 73 74 72  thout this restr
1e560 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79 20  iction, a query 
1e570 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20  like:.**        
1e580 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28  "SELECT x FROM (
1e590 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20 78  SELECT max(y), x
1e5a0 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64   FROM t1)" would
1e5b0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1e5c0 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75 72  .**        retur
1e5d0 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20 66 6f  n the value X fo
1e5e0 72 20 77 68 69 63 68 20 59 20 77 61 73 20 6d 61  r which Y was ma
1e5f0 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a  ximal.).**.**.**
1e600 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   In this routine
1e610 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65  , the "p" parame
1e620 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
1e630 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
1e640 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71  ery..** The subq
1e650 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d  uery is p->pSrc-
1e660 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67  >a[iFrom].  isAg
1e670 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
1e680 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20   outer query.** 
1e690 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e  uses aggregates.
1e6a0 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65  .**.** If flatte
1e6b0 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65  ning is not atte
1e6c0 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74  mpted, this rout
1e6d0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61  ine is a no-op a
1e6e0 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a  nd returns 0..**
1e6f0 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
1e700 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73  s attempted this
1e710 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1e720 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66   1..**.** All of
1e730 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1e740 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63  analysis must oc
1e750 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20  cur on both the 
1e760 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a  outer query and.
1e770 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ** the subquery 
1e780 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
1e790 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61  ine runs..*/.sta
1e7a0 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53  tic int flattenS
1e7b0 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65  ubquery(.  Parse
1e7c0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1e7d0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1e7e0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
1e7f0 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
1e800 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75  The parent or ou
1e810 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  ter SELECT state
1e820 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  ment */.  int iF
1e830 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rom,           /
1e840 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53  * Index in p->pS
1e850 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69  rc->a[] of the i
1e860 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f  nner subquery */
1e870 0a 20 20 69 6e 74 20 69 73 41 67 67 20 20 20 20  .  int isAgg    
1e880 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e890 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  if outer SELECT 
1e8a0 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
1e8b0 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
1e8c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
1e8d0 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
1e8e0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1e8f0 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20  ntext;.  Select 
1e900 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a 20  *pParent;    /* 
1e910 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e 20 41 4c  Current UNION AL
1e920 4c 20 74 65 72 6d 20 6f 66 20 74 68 65 20 6f 74  L term of the ot
1e930 68 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53  her query */.  S
1e940 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20  elect *pSub;    
1e950 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20     /* The inner 
1e960 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65  query or "subque
1e970 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ry" */.  Select 
1e980 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20  *pSub1;      /* 
1e990 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72  Pointer to the r
1e9a0 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20  ightmost select 
1e9b0 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a  in sub-query */.
1e9c0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
1e9d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
1e9e0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1e9f0 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
1ea00 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72   SrcList *pSubSr
1ea10 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
1ea20 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
1ea30 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
1ea40 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20   iParent;       
1ea50 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20   /* VDBE cursor 
1ea60 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53  number of the pS
1ea70 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65  ub result set te
1ea80 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  mp table */.  in
1ea90 74 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20 2d  t iNewParent = -
1eaa0 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e 74  1;/* Replacement
1eab0 20 74 61 62 6c 65 20 66 6f 72 20 69 50 61 72 65   table for iPare
1eac0 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65  nt */.  int isLe
1ead0 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f 2a 20 54  ftJoin = 0; /* T
1eae0 72 75 65 20 69 66 20 70 53 75 62 20 69 73 20 74  rue if pSub is t
1eaf0 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66  he right side of
1eb00 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 20   a LEFT JOIN */ 
1eb10 20 20 20 0a 20 20 69 6e 74 20 69 3b 20 20 20 20     .  int i;    
1eb20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1eb30 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45  p counter */.  E
1eb40 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20  xpr *pWhere;    
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb60 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
1eb70 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
1eb80 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
1eb90 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65  ubitem;   /* The
1eba0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73   subquery */.  s
1ebb0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1ebc0 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43  rse->db;..  /* C
1ebd0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66  heck to see if f
1ebe0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
1ebf0 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20  mitted.  Return 
1ec00 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20  0 if not..  */. 
1ec10 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
1ec20 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
1ec30 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28  rior==0 );.  if(
1ec40 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
1ec50 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
1ec60 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 29  _QueryFlattener)
1ec70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
1ec80 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
1ec90 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26   assert( pSrc &&
1eca0 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72   iFrom>=0 && iFr
1ecb0 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  om<pSrc->nSrc );
1ecc0 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70  .  pSubitem = &p
1ecd0 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20  Src->a[iFrom];. 
1ece0 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69   iParent = pSubi
1ecf0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
1ed00 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d  pSub = pSubitem-
1ed10 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65  >pSelect;.  asse
1ed20 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 0a  rt( pSub!=0 );..
1ed30 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
1ed40 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
1ed50 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f  ( pSubSrc );.  /
1ed60 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69  * Prior to versi
1ed70 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c  on 3.1.2, when L
1ed80 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
1ed90 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65  had to be simple
1eda0 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a   constants,.  **
1edb0 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20 65   not arbitrary e
1edc0 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 61  xpressions, we a
1edd0 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62  llowed some comb
1ede0 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61  ining of LIMIT a
1edf0 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
1ee00 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c  ecause they coul
1ee10 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74  d be computed at
1ee20 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20   compile-time.  
1ee30 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  But when LIMIT a
1ee40 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
1ee50 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79 20  ecame arbitrary 
1ee60 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20  expressions, we 
1ee70 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61  were forced to a
1ee80 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  dd restrictions 
1ee90 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31  (13).  ** and (1
1eea0 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  4). */.  if( pSu
1eeb0 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
1eec0 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
1eed0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1eee0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1eef0 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  13) */.  if( pSu
1ef00 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 53 75  b->pLimit && pSu
1ef10 62 2d 3e 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68  b->pLimit->pRigh
1ef20 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
1ef30 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1ef40 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  14) */.  if( (p-
1ef50 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43  >selFlags & SF_C
1ef60 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26 20 70  ompound)!=0 && p
1ef70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
1ef80 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1ef90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efb0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1efc0 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20  iction (15) */. 
1efd0 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72 63   }.  if( pSubSrc
1efe0 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75  ->nSrc==0 ) retu
1eff0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1f000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1f010 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20  estriction (7)  
1f020 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73  */.  if( pSub->s
1f030 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1f040 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30  tinct ) return 0
1f050 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
1f060 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 20 20  estriction (4)  
1f070 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1f080 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e  Limit && (pSrc->
1f090 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29  nSrc>1 || isAgg)
1f0a0 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
1f0b0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
1f0c0 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39  strictions (8)(9
1f0d0 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  ) */.  }.  if( p
1f0e0 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 53  ->pOrderBy && pS
1f0f0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
1f100 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1f110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f130 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1f140 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a  riction (11) */.
1f150 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20    }.  if( isAgg 
1f160 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
1f170 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  y ) return 0;   
1f180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f190 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29  Restriction (16)
1f1a0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1f1b0 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68  pLimit && p->pWh
1f1c0 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
1f1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f1e0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29  Restriction (19)
1f1f0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1f200 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65  pLimit && (p->se
1f210 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
1f220 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  inct)!=0 ){.    
1f230 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1f240 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1f250 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (21) */.  }.  
1f260 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61  if( pSub->selFla
1f270 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69  gs & (SF_Recursi
1f280 76 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ve) ){.    retur
1f290 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74  n 0; /* Restrict
1f2a0 69 6f 6e 73 20 28 32 32 29 20 2a 2f 0a 20 20 7d  ions (22) */.  }
1f2b0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  /*.  ** If t
1f2c0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74  he subquery is t
1f2d0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1f2e0 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   of a LEFT JOIN,
1f2f0 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 73   then the.  ** s
1f300 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
1f310 62 65 20 61 20 6a 6f 69 6e 20 69 74 73 65 6c 66  be a join itself
1f320 20 28 33 61 29 2e 20 45 78 61 6d 70 6c 65 20 6f   (3a). Example o
1f330 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f  f why this is no
1f340 74 0a 20 20 2a 2a 20 61 6c 6c 6f 77 65 64 3a 0a  t.  ** allowed:.
1f350 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
1f360 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
1f370 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33  JOIN (t2 JOIN t3
1f380 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
1f390 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
1f3a0 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
1f3b0 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
1f3c0 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
1f3d0 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e  ER JOIN t2) JOIN
1f3e0 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68   t3.  **.  ** wh
1f3f0 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c  ich is not at al
1f400 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  l the same thing
1f410 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
1f420 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74  he subquery is t
1f430 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1f440 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   of a LEFT JOIN,
1f450 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 0a   then the outer.
1f460 20 20 2a 2a 20 71 75 65 72 79 20 63 61 6e 6e 6f    ** query canno
1f470 74 20 62 65 20 61 6e 20 61 67 67 72 65 67 61 74  t be an aggregat
1f480 65 2e 20 28 33 63 29 20 20 54 68 69 73 20 69 73  e. (3c)  This is
1f490 20 61 6e 20 61 72 74 69 66 61 63 74 20 6f 66 20   an artifact of 
1f4a0 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 61 67 67  the way.  ** agg
1f4b0 72 65 67 61 74 65 73 20 61 72 65 20 70 72 6f 63  regates are proc
1f4c0 65 73 73 65 64 20 2d 20 74 68 65 72 65 20 69 73  essed - there is
1f4d0 20 6e 6f 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f   no mechanism to
1f4e0 20 64 65 74 65 72 6d 69 6e 65 20 69 66 0a 20 20   determine if.  
1f4f0 2a 2a 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e  ** the LEFT JOIN
1f500 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65   table should be
1f510 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a   all-NULL..  **.
1f520 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 69    ** See also ti
1f530 63 6b 65 74 73 20 23 33 30 36 2c 20 23 33 35 30  ckets #306, #350
1f540 2c 20 61 6e 64 20 23 33 33 30 30 2e 0a 20 20 2a  , and #3300..  *
1f550 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69 74 65  /.  if( (pSubite
1f560 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
1f570 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b   JT_OUTER)!=0 ){
1f580 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20  .    isLeftJoin 
1f590 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 53 75  = 1;.    if( pSu
1f5a0 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20  bSrc->nSrc>1 || 
1f5b0 69 73 41 67 67 20 7c 7c 20 49 73 56 69 72 74 75  isAgg || IsVirtu
1f5c0 61 6c 28 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d  al(pSubSrc->a[0]
1f5d0 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  .pTab) ){.      
1f5e0 2f 2a 20 20 28 33 61 29 20 20 20 20 20 20 20 20  /*  (3a)        
1f5f0 20 20 20 20 20 28 33 63 29 20 20 20 20 20 28 33       (3c)     (3
1f600 62 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  b) */.      retu
1f610 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
1f620 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58  #ifdef SQLITE_EX
1f630 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a 20 20  TRA_IFNULLROW.  
1f640 65 6c 73 65 20 69 66 28 20 69 46 72 6f 6d 3e 30  else if( iFrom>0
1f650 20 26 26 20 21 69 73 41 67 67 20 29 7b 0a 20 20   && !isAgg ){.  
1f660 20 20 2f 2a 20 53 65 74 74 69 6e 67 20 69 73 4c    /* Setting isL
1f670 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31 20 63 61  eftJoin to -1 ca
1f680 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f  uses OP_IfNullRo
1f690 77 20 6f 70 63 6f 64 65 73 20 74 6f 20 62 65 20  w opcodes to be 
1f6a0 67 65 6e 65 72 61 74 65 64 20 66 6f 72 0a 20 20  generated for.  
1f6b0 20 20 2a 2a 20 65 76 65 72 79 20 72 65 66 65 72    ** every refer
1f6c0 65 6e 63 65 20 74 6f 20 61 6e 79 20 72 65 73 75  ence to any resu
1f6d0 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 73  lt column from s
1f6e0 75 62 71 75 65 72 79 20 69 6e 20 61 20 6a 6f 69  ubquery in a joi
1f6f0 6e 2c 20 65 76 65 6e 0a 20 20 20 20 2a 2a 20 74  n, even.    ** t
1f700 68 6f 75 67 68 20 74 68 65 79 20 61 72 65 20 6e  hough they are n
1f710 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  ot necessary.  T
1f720 68 69 73 20 77 69 6c 6c 20 73 74 72 65 73 73 2d  his will stress-
1f730 74 65 73 74 20 74 68 65 20 4f 50 5f 49 66 4e 75  test the OP_IfNu
1f740 6c 6c 52 6f 77 20 0a 20 20 20 20 2a 2a 20 6f 70  llRow .    ** op
1f750 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69 73 4c  code. */.    isL
1f760 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b 0a 20 20  eftJoin = -1;.  
1f770 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
1f780 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37 29 3a  estriction (17):
1f790 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
1f7a0 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
1f7b0 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20  SELECT, then it 
1f7c0 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e  must.  ** use on
1f7d0 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ly the UNION ALL
1f7e0 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e   operator. And n
1f7f0 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c  one of the simpl
1f800 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65 73  e select queries
1f810 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20  .  ** that make 
1f820 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  up the compound 
1f830 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77  SELECT are allow
1f840 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67 61  ed to be aggrega
1f850 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20  te or distinct. 
1f860 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a   ** queries..  *
1f870 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50  /.  if( pSub->pP
1f880 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20  rior ){.    if( 
1f890 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
1f8a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
1f8b0 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  ;  /* Restrictio
1f8c0 6e 20 28 32 30 29 20 2a 2f 0a 20 20 20 20 7d 0a  n (20) */.    }.
1f8d0 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c      if( isAgg ||
1f8e0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1f8f0 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
1f900 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  || pSrc->nSrc!=1
1f910 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1f920 20 30 3b 20 2f 2a 20 28 31 37 64 31 29 2c 20 28   0; /* (17d1), (
1f930 31 37 64 32 29 2c 20 6f 72 20 28 31 37 64 33 29  17d2), or (17d3)
1f940 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   */.    }.    fo
1f950 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53  r(pSub1=pSub; pS
1f960 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31  ub1; pSub1=pSub1
1f970 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
1f980 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
1f990 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
1f9a0 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
1f9b0 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
1f9c0 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
1f9d0 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
1f9e0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1f9f0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
1fa00 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67  regate))==SF_Agg
1fa10 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20  regate );.      
1fa20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53  assert( pSub->pS
1fa30 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  rc!=0 );.      a
1fa40 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 45 4c  ssert( pSub->pEL
1fa50 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75 62  ist->nExpr==pSub
1fa60 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  1->pEList->nExpr
1fa70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   );.      if( (p
1fa80 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
1fa90 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
1faa0 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 20  _Aggregate))!=0 
1fab0 20 20 20 2f 2a 20 28 31 37 62 29 20 2a 2f 0a 20     /* (17b) */. 
1fac0 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d        || (pSub1-
1fad0 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31  >pPrior && pSub1
1fae0 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 20 20  ->op!=TK_ALL)   
1faf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fb00 20 28 31 37 61 29 20 2a 2f 0a 20 20 20 20 20 20   (17a) */.      
1fb10 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d   || pSub1->pSrc-
1fb20 3e 6e 53 72 63 3c 31 20 20 20 20 20 20 20 20 20  >nSrc<1         
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb40 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 37 63           /* (17c
1fb50 29 20 2a 2f 0a 20 20 20 20 20 20 29 7b 0a 20 20  ) */.      ){.  
1fb60 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1fb70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
1fb80 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70  stcase( pSub1->p
1fb90 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20  Src->nSrc>1 );. 
1fba0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73     }..    /* Res
1fbb0 74 72 69 63 74 69 6f 6e 20 28 31 38 29 2e 20 2a  triction (18). *
1fbc0 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72  /.    if( p->pOr
1fbd0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69  derBy ){.      i
1fbe0 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72  nt ii;.      for
1fbf0 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72  (ii=0; ii<p->pOr
1fc00 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69  derBy->nExpr; ii
1fc10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
1fc20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b   p->pOrderBy->a[
1fc30 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  ii].u.x.iOrderBy
1fc40 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Col==0 ) return 
1fc50 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1fc60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 2d 72 65  .  }..  /* Ex-re
1fc70 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29 3a 0a  striction (23):.
1fc80 20 20 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 77 61    ** The only wa
1fc90 79 20 74 68 61 74 20 74 68 65 20 72 65 63 75 72  y that the recur
1fca0 73 69 76 65 20 70 61 72 74 20 6f 66 20 61 20 43  sive part of a C
1fcb0 54 45 20 63 61 6e 20 63 6f 6e 74 61 69 6e 20 61  TE can contain a
1fcc0 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 2a 2a 20 73   compound.  ** s
1fcd0 75 62 71 75 65 72 79 20 69 73 20 66 6f 72 20 74  ubquery is for t
1fce0 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20 62  he subquery to b
1fcf0 65 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61 20  e one term of a 
1fd00 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66 20 74 68  join.  But if th
1fd10 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
1fd20 69 73 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20  is a join, then 
1fd30 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 68  the flattening h
1fd40 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1fd50 73 74 6f 70 70 65 64 20 62 79 0a 20 20 2a 2a 20  stopped by.  ** 
1fd60 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37 64  restriction (17d
1fd70 33 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  3).  */.  assert
1fd80 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
1fd90 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d   SF_Recursive)==
1fda0 30 20 7c 7c 20 70 53 75 62 2d 3e 70 50 72 69 6f  0 || pSub->pPrio
1fdb0 72 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 2a 2a 2a  r==0 );..  /****
1fdc0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
1fdd0 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65  is point, flatte
1fde0 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
1fdf0 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45  d. *****/.  SELE
1fe00 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65  CTTRACE(1,pParse
1fe10 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20 25 73 2e  ,p,("flatten %s.
1fe20 25 70 20 66 72 6f 6d 20 74 65 72 6d 20 25 64 5c  %p from term %d\
1fe30 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1fe40 20 20 20 20 20 20 20 70 53 75 62 2d 3e 7a 53 65         pSub->zSe
1fe50 6c 4e 61 6d 65 2c 20 70 53 75 62 2c 20 69 46 72  lName, pSub, iFr
1fe60 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68  om));..  /* Auth
1fe70 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65  orize the subque
1fe80 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  ry */.  pParse->
1fe90 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
1fea0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  Subitem->zName;.
1feb0 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20    TESTONLY(i =) 
1fec0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1fed0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1fee0 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
1fef0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d  ;.  testcase( i=
1ff00 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a  =SQLITE_DENY );.
1ff10 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
1ff20 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
1ff30 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f  uthContext;..  /
1ff40 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  * If the sub-que
1ff50 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1ff60 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1ff70 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74  t, then (by rest
1ff80 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37  rictions.  ** 17
1ff90 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69   and 18 above) i
1ffa0 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f  t must be a UNIO
1ffb0 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61  N ALL and the pa
1ffc0 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20  rent query must 
1ffd0 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20  .  ** be of the 
1ffe0 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form:.  **.  ** 
1fff0 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72      SELECT <expr
20000 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75  -list> FROM (<su
20010 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65  b-query>) <where
20020 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20  -clause> .  **. 
20030 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   ** followed by 
20040 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
20050 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45  MIT and/or OFFSE
20060 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20  T clauses. This 
20070 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74  block.  ** creat
20080 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66  es N-1 copies of
20090 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
200a0 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52  y without any OR
200b0 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72  DER BY, LIMIT or
200c0 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c   .  ** OFFSET cl
200d0 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20  auses and joins 
200e0 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74  them to the left
200f0 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68  -hand-side of th
20100 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  e original.  ** 
20110 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20  using UNION ALL 
20120 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68  operators. In th
20130 69 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65  is case N is the
20140 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c   number of simpl
20150 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74  e.  ** select st
20160 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  atements in the 
20170 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65  compound sub-que
20180 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  ry..  **.  ** Ex
20190 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
201a0 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20       SELECT a+1 
201b0 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20  FROM (.  **     
201c0 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
201d0 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
201e0 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
201f0 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20         SELECT y 
20200 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20  FROM tab.  **   
20210 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
20220 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
20230 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20  T abs(z*2) FROM 
20240 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20  tab2.  **     ) 
20250 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52  WHERE a!=5 ORDER
20260 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20   BY 1.  **.  ** 
20270 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
20280 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
20290 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20  SELECT x+1 FROM 
202a0 74 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35  tab WHERE x+1!=5
202b0 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
202c0 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
202d0 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62  ECT y+1 FROM tab
202e0 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20   WHERE y+1!=5.  
202f0 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  **     UNION ALL
20300 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
20310 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d   abs(z*2)+1 FROM
20320 20 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28   tab2 WHERE abs(
20330 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  z*2)+1!=5.  **  
20340 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20     ORDER BY 1.  
20350 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20  **.  ** We call 
20360 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75  this the "compou
20370 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
20380 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20  tening"..  */.  
20390 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70  for(pSub=pSub->p
203a0 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75  Prior; pSub; pSu
203b0 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
203c0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  .    Select *pNe
203d0 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  w;.    ExprList 
203e0 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  *pOrderBy = p->p
203f0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70  OrderBy;.    Exp
20400 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r *pLimit = p->p
20410 4c 69 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65 63  Limit;.    Selec
20420 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
20430 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f  Prior;.    p->pO
20440 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
20450 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20  p->pSrc = 0;.   
20460 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
20470 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
20480 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  0;.    pNew = sq
20490 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
204a0 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 73 71  b, p, 0);.    sq
204b0 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61  lite3SelectSetNa
204c0 6d 65 28 70 4e 65 77 2c 20 70 53 75 62 2d 3e 7a  me(pNew, pSub->z
204d0 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d  SelName);.    p-
204e0 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
204f0 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
20500 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
20510 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63    p->pSrc = pSrc
20520 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  ;.    p->op = TK
20530 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e  _ALL;.    if( pN
20540 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ew==0 ){.      p
20550 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
20560 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
20570 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72      pNew->pPrior
20580 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
20590 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70 50   if( pPrior ) pP
205a0 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  rior->pNext = pN
205b0 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ew;.      pNew->
205c0 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
205d0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65   p->pPrior = pNe
205e0 77 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54  w;.      SELECTT
205f0 52 41 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c  RACE(2,pParse,p,
20600 0a 20 20 20 20 20 20 20 20 20 28 22 63 6f 6d 70  .         ("comp
20610 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
20620 61 74 74 65 6e 65 72 20 63 72 65 61 74 65 73 20  attener creates 
20630 25 73 2e 25 70 20 61 73 20 70 65 65 72 5c 6e 22  %s.%p as peer\n"
20640 2c 0a 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ,.         pNew-
20650 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e 65 77 29  >zSelName, pNew)
20660 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
20670 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
20680 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  d ) return 1;.  
20690 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c  }..  /* Begin fl
206a0 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72  attening the iFr
206b0 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74  om-th entry of t
206c0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a  he FROM clause .
206d0 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65    ** in the oute
206e0 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  r query..  */.  
206f0 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70  pSub = pSub1 = p
20700 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
20710 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  ;..  /* Delete t
20720 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62  he transient tab
20730 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73  le structure ass
20740 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
20750 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20  .  ** subquery. 
20760 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
20770 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
20780 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
20790 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
207a0 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  , pSubitem->zNam
207b0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
207c0 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
207d0 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75  ->zAlias);.  pSu
207e0 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
207f0 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
20800 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ->zName = 0;.  p
20810 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  Subitem->zAlias 
20820 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
20830 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20  >pSelect = 0;.. 
20840 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69   /* Defer deleti
20850 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  ng the Table obj
20860 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
20870 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
20880 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65  query until code
20890 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20   generation is. 
208a0 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69   ** complete, si
208b0 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74  nce there may st
208c0 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70  ill exist Expr.p
208d0 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74  Tab entries that
208e0 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  .  ** refer to t
208f0 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e  he subquery even
20900 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e   after flattenin
20910 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36  g.  Ticket #3346
20920 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62  ..  **.  ** pSub
20930 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c  item->pTab is al
20940 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79  ways non-NULL by
20950 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69 6f   test restrictio
20960 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f  ns and tests abo
20970 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41  ve..  */.  if( A
20980 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e  LWAYS(pSubitem->
20990 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
209a0 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c  Table *pTabToDel
209b0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61   = pSubitem->pTa
209c0 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 54  b;.    if( pTabT
209d0 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d 31  oDel->nTabRef==1
209e0 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20   ){.      Parse 
209f0 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
20a00 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
20a10 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
20a20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78   pTabToDel->pNex
20a30 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65  tZombie = pTople
20a40 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b  vel->pZombieTab;
20a50 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c  .      pToplevel
20a60 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70  ->pZombieTab = p
20a70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65  TabToDel;.    }e
20a80 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54  lse{.      pTabT
20a90 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d 3b  oDel->nTabRef--;
20aa0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69  .    }.    pSubi
20ab0 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  tem->pTab = 0;. 
20ac0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
20ad0 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73  lowing loop runs
20ae0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
20af0 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  erm in a compoun
20b00 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d-subquery.  ** 
20b10 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64  flattening (as d
20b20 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e  escribed above).
20b30 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e    If we are doin
20b40 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69  g a different ki
20b50 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74  nd.  ** of flatt
20b60 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65  ening - a flatte
20b70 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  ning other than 
20b80 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  a compound-subqu
20b90 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d  ery flattening -
20ba0 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  .  ** then this 
20bb0 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f  loop only runs o
20bc0 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
20bd0 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61  his loop moves a
20be0 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65  ll of the FROM e
20bf0 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
20c00 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
20c10 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
20c20 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
20c30 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72  er query.  Befor
20c40 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65  e doing this, re
20c50 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20  member.  ** the 
20c60 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
20c70 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  r the original o
20c80 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
20c90 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20  element in.  ** 
20ca0 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50  iParent.  The iP
20cb0 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c  arent cursor wil
20cc0 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e  l never be used.
20cd0 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64    Subsequent cod
20ce0 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e  e.  ** will scan
20cf0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f   expressions loo
20d00 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74  king for iParent
20d10 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
20d20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f  replace.  ** tho
20d30 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69  se references wi
20d40 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  th expressions t
20d50 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74  hat resolve to t
20d60 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  he subquery FROM
20d70 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77  .  ** elements w
20d80 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e  e are now copyin
20d90 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  g in..  */.  for
20da0 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72  (pParent=p; pPar
20db0 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61  ent; pParent=pPa
20dc0 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53  rent->pPrior, pS
20dd0 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
20de0 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72  {.    int nSubSr
20df0 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79  c;.    u8 jointy
20e00 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  pe = 0;.    pSub
20e10 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
20e20 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
20e30 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79  ause of subquery
20e40 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20   */.    nSubSrc 
20e50 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b  = pSubSrc->nSrc;
20e60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
20e70 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79  erms in subquery
20e80 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
20e90 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
20ea0 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  nt->pSrc;     /*
20eb0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
20ec0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
20ed0 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  */..    if( pSrc
20ee0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
20ef0 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20  ( pParent==p ); 
20f00 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74   /* First time t
20f10 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
20f20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  */.      jointyp
20f30 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66 67  e = pSubitem->fg
20f40 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  .jointype;.    }
20f50 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
20f60 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
20f70 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
20f80 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
20f90 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
20fa0 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
20fb0 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
20fc0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
20fd0 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30  pend(db, 0, 0, 0
20fe0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
20ff0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
21000 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
21010 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
21020 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
21030 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
21040 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73   The subquery us
21050 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74  es a single slot
21060 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
21070 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
21080 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20  .    ** query.  
21090 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
210a0 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
210b0 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73  e element in its
210c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20   FROM clause,.  
210d0 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64    ** then expand
210e0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
210f0 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
21100 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c  or it to hold al
21110 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a  l elements.    *
21120 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
21130 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
21140 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
21150 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43  .    **    SELEC
21160 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28  T * FROM tabA, (
21170 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75  SELECT * FROM su
21180 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b  b1, sub2), tabB;
21190 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
211a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
211b0 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74  as 3 slots in it
211c0 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
211d0 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a  One slot of the.
211e0 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
211f0 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73  ry (the middle s
21200 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20  lot) is used by 
21210 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
21220 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62  he next.    ** b
21230 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c  lock of code wil
21240 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  l expand the out
21250 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 63 6c  er query FROM cl
21260 61 75 73 65 20 74 6f 20 34 20 73 6c 6f 74 73 2e  ause to 4 slots.
21270 0a 20 20 20 20 2a 2a 20 54 68 65 20 6d 69 64 64  .    ** The midd
21280 6c 65 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e  le slot is expan
21290 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73  ded to two slots
212a0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
212b0 65 20 73 70 61 63 65 0a 20 20 20 20 2a 2a 20 66  e space.    ** f
212c0 6f 72 20 74 68 65 20 74 77 6f 20 65 6c 65 6d 65  or the two eleme
212d0 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  nts in the FROM 
212e0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
212f0 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  bquery..    */. 
21300 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
21310 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
21320 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d  t->pSrc = pSrc =
21330 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
21340 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c  nlarge(db, pSrc,
21350 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d   nSubSrc-1,iFrom
21360 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  +1);.      if( d
21370 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
21380 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
21390 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
213a0 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  .    /* Transfer
213b0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
213c0 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
213d0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
213e0 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
213f0 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
21400 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
21410 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
21420 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
21430 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61  lete(db, pSrc->a
21440 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67  [i+iFrom].pUsing
21450 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
21460 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
21470 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d  ].fg.isTabFunc==
21480 30 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d  0 );.      pSrc-
21490 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53  >a[i+iFrom] = pS
214a0 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  ubSrc->a[i];.   
214b0 20 20 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20     iNewParent = 
214c0 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2e 69 43  pSubSrc->a[i].iC
214d0 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 6d 65 6d  ursor;.      mem
214e0 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b  set(&pSubSrc->a[
214f0 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  i], 0, sizeof(pS
21500 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20  ubSrc->a[i]));. 
21510 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61     }.    pSrc->a
21520 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74  [iFrom].fg.joint
21530 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a  ype = jointype;.
21540 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65    .    /* Now be
21550 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67  gin substituting
21560 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
21570 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
21580 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66   for .    ** ref
21590 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69  erences to the i
215a0 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75  Parent in the ou
215b0 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a  ter query..    *
215c0 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  * .    ** Exampl
215d0 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
215e0 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62     SELECT a+5, b
215f0 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  *10 FROM (SELECT
21600 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20   x*3 AS a, y+10 
21610 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48  AS b FROM t1) WH
21620 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20  ERE a>b;.    ** 
21630 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
21640 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
21650 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20  ______ subquery 
21660 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
21670 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20       /.    **   
21680 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
21690 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
216a0 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
216b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
216c0 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  __/.    **.    *
216d0 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65  * We look at eve
216e0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
216f0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
21700 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
21710 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22   we see.    ** "
21720 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
21730 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
21740 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
21750 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
21760 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20  "y+10"..    */. 
21770 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
21780 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f  derBy ){.      /
21790 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
217a0 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f   any non-zero iO
217b0 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73  rderByCol values
217c0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
217d0 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45  he.      ** ORDE
217e0 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72  R BY column expr
217f0 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69  ession is identi
21800 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65  cal to the iOrde
21810 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20  rByCol'th.      
21820 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  ** expression re
21830 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54  turned by SELECT
21840 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e   statement pSub.
21850 20 53 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c   Since these val
21860 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20  ues.      ** do 
21870 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
21880 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f  correspond to co
21890 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20  lumns in SELECT 
218a0 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e  statement pParen
218b0 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  t,.      ** zero
218c0 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61   them before tra
218d0 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44  nsfering the ORD
218e0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  ER BY clause..  
218f0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
21900 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d  Not doing this m
21910 61 79 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f  ay cause an erro
21920 72 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e  r if a subsequen
21930 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20  t call to this. 
21940 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
21950 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
21960 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20  tten a compound 
21970 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70  sub-query into p
21980 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  Parent.      ** 
21990 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68  (the only way th
219a0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73  is can happen is
219b0 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   if the compound
219c0 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20   sub-query is.  
219d0 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79      ** currently
219e0 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70   part of pSub->p
219f0 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74  Src). See ticket
21a00 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20   [d11a6e908f].  
21a10 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
21a20 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53  t *pOrderBy = pS
21a30 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ub->pOrderBy;.  
21a40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
21a50 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
21a60 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  i++){.        pO
21a70 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78  rderBy->a[i].u.x
21a80 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30  .iOrderByCol = 0
21a90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21aa0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
21ab0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
21ac0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
21ad0 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b  ub->pPrior==0 );
21ae0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
21af0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
21b00 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  rBy;.      pSub-
21b10 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
21b20 20 20 20 7d 0a 20 20 20 20 70 57 68 65 72 65 20     }.    pWhere 
21b30 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
21b40 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72  (db, pSub->pWher
21b50 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69  e, 0);.    if( i
21b60 73 4c 65 66 74 4a 6f 69 6e 3e 30 20 29 7b 0a 20  sLeftJoin>0 ){. 
21b70 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72       setJoinExpr
21b80 28 70 57 68 65 72 65 2c 20 69 4e 65 77 50 61 72  (pWhere, iNewPar
21b90 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ent);.    }.    
21ba0 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20  pParent->pWhere 
21bb0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
21bc0 28 64 62 2c 20 70 57 68 65 72 65 2c 20 70 50 61  (db, pWhere, pPa
21bd0 72 65 6e 74 2d 3e 70 57 68 65 72 65 29 3b 0a 20  rent->pWhere);. 
21be0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
21bf0 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
21c00 20 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74      SubstContext
21c10 20 78 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72   x;.      x.pPar
21c20 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
21c30 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 50     x.iTable = iP
21c40 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69  arent;.      x.i
21c50 4e 65 77 54 61 62 6c 65 20 3d 20 69 4e 65 77 50  NewTable = iNewP
21c60 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69  arent;.      x.i
21c70 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 69 73 4c 65  sLeftJoin = isLe
21c80 66 74 4a 6f 69 6e 3b 0a 20 20 20 20 20 20 78 2e  ftJoin;.      x.
21c90 70 45 4c 69 73 74 20 3d 20 70 53 75 62 2d 3e 70  pEList = pSub->p
21ca0 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 75 62  EList;.      sub
21cb0 73 74 53 65 6c 65 63 74 28 26 78 2c 20 70 50 61  stSelect(&x, pPa
21cc0 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  rent, 0);.    }.
21cd0 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c    .    /* The fl
21ce0 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73  attened query is
21cf0 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74   distinct if eit
21d00 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72  her the inner or
21d10 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
21d20 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  r query is disti
21d30 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nct. .    */.   
21d40 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61   pParent->selFla
21d50 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46  gs |= pSub->selF
21d60 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
21d70 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20  ct;.  .    /*.  
21d80 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20    ** SELECT ... 
21d90 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e  FROM (SELECT ...
21da0 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20   LIMIT a OFFSET 
21db0 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45  b) LIMIT x OFFSE
21dc0 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  T y;.    **.    
21dd0 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65  ** One is tempte
21de0 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20  d to try to add 
21df0 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69  a and b to combi
21e00 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20  ne the limits.  
21e10 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  But this.    ** 
21e20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66  does not work if
21e30 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73   either limit is
21e40 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a   negative..    *
21e50 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
21e60 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  pLimit ){.      
21e70 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20  pParent->pLimit 
21e80 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a  = pSub->pLimit;.
21e90 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d        pSub->pLim
21ea0 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  it = 0;.    }.  
21eb0 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79  }..  /* Finially
21ec0 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73  , delete what is
21ed0 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62   left of the sub
21ee0 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e  query and return
21ef0 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20  .  ** success.. 
21f00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c   */.  sqlite3Sel
21f10 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
21f20 75 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43  ub1);..#if SELEC
21f30 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
21f40 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
21f50 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
21f60 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ){.    SELECTTRA
21f70 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
21f80 70 2c 28 22 41 66 74 65 72 20 66 6c 61 74 74 65  p,("After flatte
21f90 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  ning:\n"));.    
21fa0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
21fb0 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
21fc0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
21fd0 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
21fe0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
21ff0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
22000 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
22010 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
22020 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69   */....#if !defi
22030 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
22040 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
22050 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
22060 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61  T_VIEW)./*.** Ma
22070 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 72 65 6c  ke copies of rel
22080 65 76 61 6e 74 20 57 48 45 52 45 20 63 6c 61 75  evant WHERE clau
22090 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  se terms of the 
220a0 6f 75 74 65 72 20 71 75 65 72 79 20 69 6e 74 6f  outer query into
220b0 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c  .** the WHERE cl
220c0 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79  ause of subquery
220d0 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  .  Example:.**.*
220e0 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
220f0 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53 20  OM (SELECT a AS 
22100 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d  x, c-d AS y FROM
22110 20 74 31 29 20 57 48 45 52 45 20 78 3d 35 20 41   t1) WHERE x=5 A
22120 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54  ND y=10;.**.** T
22130 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a  ransformed into:
22140 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
22150 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   * FROM (SELECT 
22160 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79  a AS x, c-d AS y
22170 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
22180 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a 2a  =5 AND c-d=10).*
22190 2a 20 20 20 20 20 57 48 45 52 45 20 78 3d 35 20  *     WHERE x=5 
221a0 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20  AND y=10;.**.** 
221b0 54 68 65 20 68 6f 70 65 20 69 73 20 74 68 61 74  The hope is that
221c0 20 74 68 65 20 74 65 72 6d 73 20 61 64 64 65 64   the terms added
221d0 20 74 6f 20 74 68 65 20 69 6e 6e 65 72 20 71 75   to the inner qu
221e0 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69 74  ery will make it
221f0 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69 65   more.** efficie
22200 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74  nt..**.** Do not
22210 20 61 74 74 65 6d 70 74 20 74 68 69 73 20 6f 70   attempt this op
22220 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a  timization if:.*
22230 2a 0a 2a 2a 20 20 20 28 31 29 20 28 2a 2a 20 54  *.**   (1) (** T
22240 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20  his restriction 
22250 77 61 73 20 72 65 6d 6f 76 65 64 20 6f 6e 20 32  was removed on 2
22260 30 31 37 2d 30 39 2d 32 39 2e 20 20 57 65 20 75  017-09-29.  We u
22270 73 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  sed to.**       
22280 20 20 20 20 64 69 73 61 6c 6c 6f 77 20 74 68 69      disallow thi
22290 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  s optimization f
222a0 6f 72 20 61 67 67 72 65 67 61 74 65 20 73 75 62  or aggregate sub
222b0 71 75 65 72 69 65 73 2c 20 62 75 74 20 6e 6f 77  queries, but now
222c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 69 74  .**           it
222d0 20 69 73 20 61 6c 6c 6f 77 65 64 20 62 79 20 70   is allowed by p
222e0 75 74 74 69 6e 67 20 74 68 65 20 65 78 74 72 61  utting the extra
222f0 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 48 41   terms on the HA
22300 56 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 20  VING clause..** 
22310 20 20 20 20 20 20 20 20 20 20 54 68 65 20 61 64            The ad
22320 64 65 64 20 48 41 56 49 4e 47 20 63 6c 61 75 73  ded HAVING claus
22330 65 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 20 69  e is pointless i
22340 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6c  f the subquery l
22350 61 63 6b 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  acks.**         
22360 20 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61    a GROUP BY cla
22370 75 73 65 2e 20 20 42 75 74 20 73 75 63 68 20 61  use.  But such a
22380 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69   HAVING clause i
22390 73 20 61 6c 73 6f 20 68 61 72 6d 6c 65 73 73 0a  s also harmless.
223a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 73 6f 20  **           so 
223b0 74 68 65 72 65 20 64 6f 65 73 20 6e 6f 74 20 61  there does not a
223c0 70 70 65 61 72 20 74 6f 20 62 65 20 61 6e 79 20  ppear to be any 
223d0 72 65 61 73 6f 6e 20 74 6f 20 61 64 64 20 65 78  reason to add ex
223e0 74 72 61 20 6c 6f 67 69 63 0a 2a 2a 20 20 20 20  tra logic.**    
223f0 20 20 20 20 20 20 20 74 6f 20 73 75 70 70 72 65         to suppre
22400 73 73 20 69 74 2e 20 2a 2a 29 0a 2a 2a 0a 2a 2a  ss it. **).**.**
22410 20 20 20 28 32 29 20 54 68 65 20 69 6e 6e 65 72     (2) The inner
22420 20 71 75 65 72 79 20 69 73 20 74 68 65 20 72 65   query is the re
22430 63 75 72 73 69 76 65 20 70 61 72 74 20 6f 66 20  cursive part of 
22440 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65  a common table e
22450 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
22460 20 20 20 28 33 29 20 54 68 65 20 69 6e 6e 65 72     (3) The inner
22470 20 71 75 65 72 79 20 68 61 73 20 61 20 4c 49 4d   query has a LIM
22480 49 54 20 63 6c 61 75 73 65 20 28 73 69 6e 63 65  IT clause (since
22490 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
224a0 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 20 20 20  the WHERE.**    
224b0 20 20 20 63 6c 6f 73 65 20 77 6f 75 6c 64 20 63     close would c
224c0 68 61 6e 67 65 20 74 68 65 20 6d 65 61 6e 69 6e  hange the meanin
224d0 67 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 29 2e  g of the LIMIT).
224e0 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 54 68 65  .**.**   (4) The
224f0 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20   inner query is 
22500 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
22510 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  d of a LEFT JOIN
22520 2e 20 20 28 54 68 65 20 63 61 6c 6c 65 72 0a 2a  .  (The caller.*
22530 2a 20 20 20 20 20 20 20 65 6e 66 6f 72 63 65 73  *       enforces
22540 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   this restrictio
22550 6e 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75  n since this rou
22560 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 68 61  tine does not ha
22570 76 65 20 65 6e 6f 75 67 68 0a 2a 2a 20 20 20 20  ve enough.**    
22580 20 20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74     information t
22590 6f 20 6b 6e 6f 77 2e 29 0a 2a 2a 0a 2a 2a 20 20  o know.).**.**  
225a0 20 28 35 29 20 54 68 65 20 57 48 45 52 45 20 63   (5) The WHERE c
225b0 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e  lause expression
225c0 20 6f 72 69 67 69 6e 61 74 65 73 20 69 6e 20 74   originates in t
225d0 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
225e0 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f  lause.**       o
225f0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a  f a LEFT JOIN..*
22600 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  *.** Return 0 if
22610 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   no changes are 
22620 6d 61 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72  made and non-zer
22630 6f 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  o if one or more
22640 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a   WHERE clause.**
22650 20 74 65 72 6d 73 20 61 72 65 20 64 75 70 6c 69   terms are dupli
22660 63 61 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73  cated into the s
22670 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  ubquery..*/.stat
22680 69 63 20 69 6e 74 20 70 75 73 68 44 6f 77 6e 57  ic int pushDownW
22690 68 65 72 65 54 65 72 6d 73 28 0a 20 20 50 61 72  hereTerms(.  Par
226a0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
226b0 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
226c0 65 78 74 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 28  ext (for malloc(
226d0 29 20 61 6e 64 20 65 72 72 6f 72 20 72 65 70 6f  ) and error repo
226e0 72 74 69 6e 67 29 20 2a 2f 0a 20 20 53 65 6c 65  rting) */.  Sele
226f0 63 74 20 2a 70 53 75 62 71 2c 20 20 20 20 20 20  ct *pSubq,      
22700 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
22710 79 20 77 68 6f 73 65 20 57 48 45 52 45 20 63 6c  y whose WHERE cl
22720 61 75 73 65 20 69 73 20 74 6f 20 62 65 20 61 75  ause is to be au
22730 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70  gmented */.  Exp
22740 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
22750 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
22760 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
22770 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
22780 6e 74 20 69 43 75 72 73 6f 72 20 20 20 20 20 20  nt iCursor      
22790 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
227a0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 73 75 62  umber of the sub
227b0 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 45 78  query */.){.  Ex
227c0 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  pr *pNew;.  int 
227d0 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 69 66 28  nChng = 0;.  if(
227e0 20 70 57 68 65 72 65 3d 3d 30 20 29 20 72 65 74   pWhere==0 ) ret
227f0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 53 75  urn 0;.  if( pSu
22800 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  bq->selFlags & S
22810 46 5f 52 65 63 75 72 73 69 76 65 20 29 20 72 65  F_Recursive ) re
22820 74 75 72 6e 20 30 3b 20 20 2f 2a 20 72 65 73 74  turn 0;  /* rest
22830 72 69 63 74 69 6f 6e 20 28 32 29 20 2a 2f 0a 0a  riction (2) */..
22840 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
22850 42 55 47 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68  BUG.  /* Only th
22860 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20  e first term of 
22870 61 20 63 6f 6d 70 6f 75 6e 64 20 63 61 6e 20 68  a compound can h
22880 61 76 65 20 61 20 57 49 54 48 20 63 6c 61 75 73  ave a WITH claus
22890 65 2e 20 20 42 75 74 20 6d 61 6b 65 0a 20 20 2a  e.  But make.  *
228a0 2a 20 73 75 72 65 20 6e 6f 20 6f 74 68 65 72 20  * sure no other 
228b0 74 65 72 6d 73 20 61 72 65 20 6d 61 72 6b 65 64  terms are marked
228c0 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 69 6e   SF_Recursive in
228d0 20 63 61 73 65 20 73 6f 6d 65 74 68 69 6e 67 20   case something 
228e0 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 69 6e 20  changes.  ** in 
228f0 74 68 65 20 66 75 74 75 72 65 2e 0a 20 20 2a 2f  the future..  */
22900 0a 20 20 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  .  {.    Select 
22910 2a 70 58 3b 20 20 0a 20 20 20 20 66 6f 72 28 70  *pX;  .    for(p
22920 58 3d 70 53 75 62 71 3b 20 70 58 3b 20 70 58 3d  X=pSubq; pX; pX=
22930 70 58 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  pX->pPrior){.   
22940 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e     assert( (pX->
22950 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52  selFlags & (SF_R
22960 65 63 75 72 73 69 76 65 29 29 3d 3d 30 20 29 3b  ecursive))==0 );
22970 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
22980 66 0a 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e  f..  if( pSubq->
22990 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20 20  pLimit!=0 ){.   
229a0 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65   return 0; /* re
229b0 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20 2a 2f  striction (3) */
229c0 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 57  .  }.  while( pW
229d0 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44  here->op==TK_AND
229e0 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20 2b 3d   ){.    nChng +=
229f0 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
22a00 72 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75 62  rms(pParse, pSub
22a10 71 2c 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68  q, pWhere->pRigh
22a20 74 2c 20 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  t, iCursor);.   
22a30 20 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65   pWhere = pWhere
22a40 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69  ->pLeft;.  }.  i
22a50 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
22a60 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f  ty(pWhere,EP_Fro
22a70 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  mJoin) ) return 
22a80 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f  0; /* restrictio
22a90 6e 20 28 35 29 20 2a 2f 0a 20 20 69 66 28 20 73  n (5) */.  if( s
22aa0 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c  qlite3ExprIsTabl
22ab0 65 43 6f 6e 73 74 61 6e 74 28 70 57 68 65 72 65  eConstant(pWhere
22ac0 2c 20 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  , iCursor) ){.  
22ad0 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 77    nChng++;.    w
22ae0 68 69 6c 65 28 20 70 53 75 62 71 20 29 7b 0a 20  hile( pSubq ){. 
22af0 20 20 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78       SubstContex
22b00 74 20 78 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  t x;.      pNew 
22b10 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
22b20 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57 68  (pParse->db, pWh
22b30 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 78  ere, 0);.      x
22b40 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
22b50 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65  ;.      x.iTable
22b60 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20   = iCursor;.    
22b70 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20    x.iNewTable = 
22b80 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78  iCursor;.      x
22b90 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b  .isLeftJoin = 0;
22ba0 0a 20 20 20 20 20 20 78 2e 70 45 4c 69 73 74 20  .      x.pEList 
22bb0 3d 20 70 53 75 62 71 2d 3e 70 45 4c 69 73 74 3b  = pSubq->pEList;
22bc0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 75  .      pNew = su
22bd0 62 73 74 45 78 70 72 28 26 78 2c 20 70 4e 65 77  bstExpr(&x, pNew
22be0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 75  );.      if( pSu
22bf0 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  bq->selFlags & S
22c00 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20  F_Aggregate ){. 
22c10 20 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70 48         pSubq->pH
22c20 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
22c30 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
22c40 62 2c 20 70 53 75 62 71 2d 3e 70 48 61 76 69 6e  b, pSubq->pHavin
22c50 67 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  g, pNew);.      
22c60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
22c70 53 75 62 71 2d 3e 70 57 68 65 72 65 20 3d 20 73  Subq->pWhere = s
22c80 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
22c90 61 72 73 65 2d 3e 64 62 2c 20 70 53 75 62 71 2d  arse->db, pSubq-
22ca0 3e 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a  >pWhere, pNew);.
22cb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
22cc0 75 62 71 20 3d 20 70 53 75 62 71 2d 3e 70 50 72  ubq = pSubq->pPr
22cd0 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ior;.    }.  }. 
22ce0 20 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d   return nChng;.}
22cf0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
22d00 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
22d10 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
22d20 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
22d30 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a  T_VIEW) */../*.*
22d40 2a 20 54 68 65 20 70 46 75 6e 63 20 69 73 20 74  * The pFunc is t
22d50 68 65 20 6f 6e 6c 79 20 61 67 67 72 65 67 61 74  he only aggregat
22d60 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68  e function in th
22d70 65 20 71 75 65 72 79 2e 20 20 43 68 65 63 6b 20  e query.  Check 
22d80 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20 74 68 65  to see.** if the
22d90 20 71 75 65 72 79 20 69 73 20 61 20 63 61 6e 64   query is a cand
22da0 69 64 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69  idate for the mi
22db0 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69  n/max optimizati
22dc0 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  on. .**.** If th
22dd0 65 20 71 75 65 72 79 20 69 73 20 61 20 63 61 6e  e query is a can
22de0 64 69 64 61 74 65 20 66 6f 72 20 74 68 65 20 6d  didate for the m
22df0 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74  in/max optimizat
22e00 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a  ion, then set.**
22e10 20 2a 70 70 4d 69 6e 4d 61 78 20 74 6f 20 62 65   *ppMinMax to be
22e20 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
22e30 75 73 65 20 74 6f 20 62 65 20 75 73 65 64 20 66  use to be used f
22e40 6f 72 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  or the optimizat
22e50 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  ion.** and retur
22e60 6e 20 65 69 74 68 65 72 20 57 48 45 52 45 5f 4f  n either WHERE_O
22e70 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48  RDERBY_MIN or WH
22e80 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 20  ERE_ORDERBY_MAX 
22e90 64 65 70 65 6e 64 69 6e 67 20 6f 6e 0a 2a 2a 20  depending on.** 
22ea0 77 68 65 74 68 65 72 20 70 46 75 6e 63 20 69 73  whether pFunc is
22eb0 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28   a min() or max(
22ec0 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ) function..**.*
22ed0 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  * If the query i
22ee0 73 20 6e 6f 74 20 61 20 63 61 6e 64 69 64 61 74  s not a candidat
22ef0 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61  e for the min/ma
22f00 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  x optimization, 
22f10 72 65 74 75 72 6e 0a 2a 2a 20 57 48 45 52 45 5f  return.** WHERE_
22f20 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 28  ORDERBY_NORMAL (
22f30 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 7a 65  which must be ze
22f40 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ro)..**.** This 
22f50 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20  routine must be 
22f60 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 67 67  called after agg
22f70 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
22f80 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 6c 6f   have been.** lo
22f90 63 61 74 65 64 20 62 75 74 20 62 65 66 6f 72 65  cated but before
22fa0 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73   their arguments
22fb0 20 68 61 76 65 20 62 65 65 6e 20 73 75 62 6a 65   have been subje
22fc0 63 74 65 64 20 74 6f 20 61 67 67 72 65 67 61 74  cted to aggregat
22fd0 65 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2e 0a 2a  e.** analysis..*
22fe0 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d  /.static u8 minM
22ff0 61 78 51 75 65 72 79 28 73 71 6c 69 74 65 33 20  axQuery(sqlite3 
23000 2a 64 62 2c 20 45 78 70 72 20 2a 70 46 75 6e 63  *db, Expr *pFunc
23010 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d  , ExprList **ppM
23020 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52  inMax){.  int eR
23030 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
23040 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20  BY_NORMAL;      
23050 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
23060 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
23070 45 4c 69 73 74 20 3d 20 70 46 75 6e 63 2d 3e 78  EList = pFunc->x
23080 2e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 41 72  .pList;    /* Ar
23090 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66  guments to agg f
230a0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  unction */.  con
230b0 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 3b 20  st char *zFunc; 
230c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230d0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 67     /* Name of ag
230e0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
230f0 20 70 46 75 6e 63 20 2a 2f 0a 20 20 45 78 70 72   pFunc */.  Expr
23100 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 0a  List *pOrderBy;.
23110 20 20 75 38 20 73 6f 72 74 4f 72 64 65 72 3b 0a    u8 sortOrder;.
23120 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d 69  .  assert( *ppMi
23130 6e 4d 61 78 3d 3d 30 20 29 3b 0a 20 20 61 73 73  nMax==0 );.  ass
23140 65 72 74 28 20 70 46 75 6e 63 2d 3e 6f 70 3d 3d  ert( pFunc->op==
23150 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
23160 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d  );.  if( pEList=
23170 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45  =0 || pEList->nE
23180 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
23190 65 52 65 74 3b 0a 20 20 7a 46 75 6e 63 20 3d 20  eRet;.  zFunc = 
231a0 70 46 75 6e 63 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pFunc->u.zToken;
231b0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
231c0 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69  rICmp(zFunc, "mi
231d0 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 52  n")==0 ){.    eR
231e0 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
231f0 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 73 6f 72 74  BY_MIN;.    sort
23200 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53  Order = SQLITE_S
23210 4f 5f 41 53 43 3b 0a 20 20 7d 65 6c 73 65 20 69  O_ASC;.  }else i
23220 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
23230 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d  p(zFunc, "max")=
23240 3d 30 20 29 7b 0a 20 20 20 20 65 52 65 74 20 3d  =0 ){.    eRet =
23250 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
23260 41 58 3b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65  AX;.    sortOrde
23270 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45  r = SQLITE_SO_DE
23280 53 43 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  SC;.  }else{.   
23290 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 20 20   return eRet;.  
232a0 7d 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20  }.  *ppMinMax = 
232b0 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
232c0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
232d0 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20  , pEList, 0);.  
232e0 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
232f0 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
23300 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
23310 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64   pOrderBy ) pOrd
23320 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  erBy->a[0].sortO
23330 72 64 65 72 20 3d 20 73 6f 72 74 4f 72 64 65 72  rder = sortOrder
23340 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b  ;.  return eRet;
23350 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
23360 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70  lect statement p
23370 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
23380 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
23390 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
233a0 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  y..** The second
233b0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
233c0 20 61 73 73 6f 63 69 61 74 65 64 20 61 67 67 72   associated aggr
233d0 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63  egate-info objec
233e0 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  t. This .** func
233f0 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68  tion tests if th
23400 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74  e SELECT is of t
23410 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
23420 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
23430 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a   FROM <tbl>.**.*
23440 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20 69 73  * where table is
23450 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
23460 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c  e, not a sub-sel
23470 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20  ect or view. If 
23480 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65  the query.** doe
23490 73 20 6d 61 74 63 68 20 74 68 69 73 20 70 61 74  s match this pat
234a0 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69  tern, then a poi
234b0 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c  nter to the Tabl
234c0 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65  e object represe
234d0 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69  nting.** <tbl> i
234e0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
234f0 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
23500 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
23510 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43  Table *isSimpleC
23520 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  ount(Select *p, 
23530 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
23540 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  o){.  Table *pTa
23550 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  b;.  Expr *pExpr
23560 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d  ;..  assert( !p-
23570 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20  >pGroupBy );..  
23580 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c  if( p->pWhere ||
23590 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
235a0 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70  r!=1 .   || p->p
235b0 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20  Src->nSrc!=1 || 
235c0 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
235d0 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72  elect.  ){.    r
235e0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
235f0 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
23600 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70  [0].pTab;.  pExp
23610 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
23620 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73  [0].pExpr;.  ass
23630 65 72 74 28 20 70 54 61 62 20 26 26 20 21 70 54  ert( pTab && !pT
23640 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70  ab->pSelect && p
23650 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49  Expr );..  if( I
23660 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
23670 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
23680 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
23690 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65  GG_FUNCTION ) re
236a0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45  turn 0;.  if( NE
236b0 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  VER(pAggInfo->nF
236c0 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  unc==0) ) return
236d0 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49   0;.  if( (pAggI
236e0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46  nfo->aFunc[0].pF
236f0 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53  unc->funcFlags&S
23700 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54  QLITE_FUNC_COUNT
23710 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
23720 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
23730 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20  ags&EP_Distinct 
23740 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72  ) return 0;..  r
23750 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f  eturn pTab;.}../
23760 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72  *.** If the sour
23770 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73  ce-list item pas
23780 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
23790 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64  nt was augmented
237a0 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45   with an.** INDE
237b0 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74  XED BY clause, t
237c0 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74  hen try to locat
237d0 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
237e0 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a  index. If there.
237f0 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20 63 6c  ** was such a cl
23800 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d  ause and the nam
23810 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20  ed index cannot 
23820 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  be found, return
23830 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f   .** SQLITE_ERRO
23840 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65  R and leave an e
23850 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20  rror in pParse. 
23860 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c  Otherwise, popul
23870 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70  ate .** pFrom->p
23880 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e  Index and return
23890 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
238a0 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65  nt sqlite3Indexe
238b0 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20  dByLookup(Parse 
238c0 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20  *pParse, struct 
238d0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
238e0 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f  rom){.  if( pFro
238f0 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d  m->pTab && pFrom
23900 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
23910 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
23920 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
23930 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e  b;.    char *zIn
23940 64 65 78 65 64 42 79 20 3d 20 70 46 72 6f 6d 2d  dexedBy = pFrom-
23950 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 3b 0a  >u1.zIndexedBy;.
23960 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
23970 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
23980 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20  ab->pIndex; .   
23990 20 20 20 20 20 70 49 64 78 20 26 26 20 73 71 6c       pIdx && sql
239a0 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 64 78  ite3StrICmp(pIdx
239b0 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 65  ->zName, zIndexe
239c0 64 42 79 29 3b 20 0a 20 20 20 20 20 20 20 20 70  dBy); .        p
239d0 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a  Idx=pIdx->pNext.
239e0 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
239f0 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71  pIdx ){.      sq
23a00 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
23a10 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
23a20 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65  ndex: %s", zInde
23a30 78 65 64 42 79 2c 20 30 29 3b 0a 20 20 20 20 20  xedBy, 0);.     
23a40 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
23a50 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20  hema = 1;.      
23a60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
23a70 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
23a80 46 72 6f 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d  From->pIBIndex =
23a90 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74   pIdx;.  }.  ret
23aa0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
23ab0 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f  ./*.** Detect co
23ac0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
23ad0 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75 73  atements that us
23ae0 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
23af0 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e  ause with .** an
23b00 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c   alternative col
23b10 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
23b20 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
23b30 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43   ... FROM t1 EXC
23b40 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46  EPT SELECT ... F
23b50 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20  ROM t2 ORDER BY 
23b60 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a  .. COLLATE ....*
23b70 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 72  *.** These are r
23b80 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 73 75  ewritten as a su
23b90 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20  bquery:.**.**   
23ba0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
23bb0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
23bc0 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54  t1 EXCEPT SELECT
23bd0 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a   ... FROM t2).**
23be0 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 2e 2e       ORDER BY ..
23bf0 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a  . COLLATE ....**
23c00 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f  .** This transfo
23c10 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73  rmation is neces
23c20 73 61 72 79 20 62 65 63 61 75 73 65 20 74 68 65  sary because the
23c30 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
23c40 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  rBy() routine.**
23c50 20 61 62 6f 76 65 20 74 68 61 74 20 67 65 6e 65   above that gene
23c60 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66  rates the code f
23c70 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  or a compound SE
23c80 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44  LECT with an ORD
23c90 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20  ER BY clause.** 
23ca0 75 73 65 73 20 61 20 6d 65 72 67 65 20 61 6c 67  uses a merge alg
23cb0 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65 71 75  orithm that requ
23cc0 69 72 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f  ires the same co
23cd0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
23ce0 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c   on the.** resul
23cf0 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20  t columns as on 
23d00 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
23d10 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b 65 74  use.  See ticket
23d20 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73  .** http://www.s
23d30 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e  qlite.org/src/in
23d40 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a 2a 2a  fo/6709574d2a.**
23d50 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f  .** This transfo
23d60 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  rmation is only 
23d70 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43 45 50  needed for EXCEP
23d80 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20 61 6e  T, INTERSECT, an
23d90 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20  d UNION..** The 
23da0 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
23db0 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20 77 69  or works fine wi
23dc0 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  th multiSelectOr
23dd0 64 65 72 42 79 28 29 20 65 76 65 6e 20 77 68 65  derBy() even whe
23de0 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20 43  n.** there are C
23df0 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69 6e 20  OLLATE terms in 
23e00 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f  the ORDER BY..*/
23e10 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 76  .static int conv
23e20 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63  ertCompoundSelec
23e30 74 54 6f 53 75 62 71 75 65 72 79 28 57 61 6c 6b  tToSubquery(Walk
23e40 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
23e50 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ect *p){.  int i
23e60 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  ;.  Select *pNew
23e70 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a  ;.  Select *pX;.
23e80 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
23e90 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
23ea0 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c  _item *a;.  SrcL
23eb0 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20  ist *pNewSrc;.  
23ec0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
23ed0 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20   Token dummy;.. 
23ee0 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d   if( p->pPrior==
23ef0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
23f00 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 70  ontinue;.  if( p
23f10 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ->pOrderBy==0 ) 
23f20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
23f30 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b  nue;.  for(pX=p;
23f40 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d   pX && (pX->op==
23f50 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70  TK_ALL || pX->op
23f60 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58  ==TK_SELECT); pX
23f70 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20  =pX->pPrior){}. 
23f80 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72 65 74   if( pX==0 ) ret
23f90 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
23fa0 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65  ;.  a = p->pOrde
23fb0 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  rBy->a;.  for(i=
23fc0 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
23fd0 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  pr-1; i>=0; i--)
23fe0 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 70  {.    if( a[i].p
23ff0 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
24000 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65 61 6b  _Collate ) break
24010 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 30 20  ;.  }.  if( i<0 
24020 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
24030 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  tinue;..  /* If 
24040 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
24050 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  int, that means 
24060 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  the transformati
24070 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  on is required. 
24080 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
24090 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
240a0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
240b0 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
240c0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
240d0 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
240e0 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
240f0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
24100 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28  Abort;.  memset(
24110 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f  &dummy, 0, sizeo
24120 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65  f(dummy));.  pNe
24130 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  wSrc = sqlite3Sr
24140 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
24150 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30  erm(pParse,0,0,0
24160 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30  ,&dummy,pNew,0,0
24170 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53 72 63  );.  if( pNewSrc
24180 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
24190 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20  _Abort;.  *pNew 
241a0 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20  = *p;.  p->pSrc 
241b0 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e  = pNewSrc;.  p->
241c0 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
241d0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
241e0 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65  Parse, 0, sqlite
241f0 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 53 54  3Expr(db, TK_AST
24200 45 52 49 53 4b 2c 20 30 29 29 3b 0a 20 20 70 2d  ERISK, 0));.  p-
24210 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b  >op = TK_SELECT;
24220 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30  .  p->pWhere = 0
24230 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70  ;.  pNew->pGroup
24240 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  By = 0;.  pNew->
24250 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70  pHaving = 0;.  p
24260 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
24270 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  0;.  p->pPrior =
24280 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d   0;.  p->pNext =
24290 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74 68 20 3d   0;.  p->pWith =
242a0 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   0;.  p->selFlag
242b0 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e  s &= ~SF_Compoun
242c0 64 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  d;.  assert( (p-
242d0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43  >selFlags & SF_C
242e0 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20 29 3b 0a  onverted)==0 );.
242f0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
24300 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 3b 0a 20   SF_Converted;. 
24310 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
24320 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e  Prior!=0 );.  pN
24330 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ew->pPrior->pNex
24340 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77  t = pNew;.  pNew
24350 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
24360 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
24370 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  nue;.}../*.** Ch
24380 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
24390 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
243a0 72 6d 20 70 46 72 6f 6d 20 68 61 73 20 74 61 62  rm pFrom has tab
243b0 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69  le-valued functi
243c0 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e  on.** arguments.
243d0 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20 6c 65    If it does, le
243e0 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
243f0 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 20 61  sage in pParse a
24400 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  nd return.** non
24410 2d 7a 65 72 6f 2c 20 73 69 6e 63 65 20 70 46 72  -zero, since pFr
24420 6f 6d 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  om is not allowe
24430 64 20 74 6f 20 62 65 20 61 20 74 61 62 6c 65 2d  d to be a table-
24440 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 2e  valued function.
24450 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
24460 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28  annotBeFunction(
24470 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73  Parse *pParse, s
24480 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
24490 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66  em *pFrom){.  if
244a0 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 54 61  ( pFrom->fg.isTa
244b0 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c  bFunc ){.    sql
244c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
244d0 72 73 65 2c 20 22 27 25 73 27 20 69 73 20 6e 6f  rse, "'%s' is no
244e0 74 20 61 20 66 75 6e 63 74 69 6f 6e 22 2c 20 70  t a function", p
244f0 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  From->zName);.  
24500 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
24510 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23    return 0;.}..#
24520 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
24530 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67  IT_CTE./*.** Arg
24540 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77 68 69  ument pWith (whi
24550 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  ch may be NULL) 
24560 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b  points to a link
24570 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73 74 65  ed list of neste
24580 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65  d .** WITH conte
24590 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20  xts, from inner 
245a0 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66  to outermost. If
245b0 20 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74   the table ident
245c0 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f  ified by .** FRO
245d0 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
245e0 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c 6c 79   pItem is really
245f0 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d   a common-table-
24600 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54 45 29  expression (CTE)
24610 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e   .** then return
24620 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
24630 65 20 43 54 45 20 64 65 66 69 6e 69 74 69 6f 6e  e CTE definition
24640 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e   for that table.
24650 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 72 65   Otherwise.** re
24660 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
24670 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   If a non-NULL v
24680 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64  alue is returned
24690 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65 78 74  , set *ppContext
246a0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
246b0 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20   With.** object 
246c0 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 65  that the returne
246d0 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f  d CTE belongs to
246e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
246f0 63 74 20 43 74 65 20 2a 73 65 61 72 63 68 57 69  ct Cte *searchWi
24700 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57 69 74  th(.  With *pWit
24710 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
24720 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
24730 20 69 6e 6e 65 72 6d 6f 73 74 20 57 49 54 48 20   innermost WITH 
24740 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
24750 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
24760 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46  *pItem,     /* F
24770 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
24780 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f  nt to resolve */
24790 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74  .  With **ppCont
247a0 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
247b0 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20     /* OUT: WITH 
247c0 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20 76 61  clause return va
247d0 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  lue belongs to *
247e0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
247f0 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20  r *zName;.  if( 
24800 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
24810 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20  ==0 && (zName = 
24820 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30  pItem->zName)!=0
24830 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 3b   ){.    With *p;
24840 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69 74 68  .    for(p=pWith
24850 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72  ; p; p=p->pOuter
24860 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
24870 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
24880 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  <p->nCte; i++){.
24890 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
248a0 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65  te3StrICmp(zName
248b0 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  , p->a[i].zName)
248c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
248d0 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b   *ppContext = p;
248e0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
248f0 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  n &p->a[i];.    
24900 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
24910 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
24920 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f   0;.}../* The co
24930 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d 61 69  de generator mai
24940 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b 20 6f  ntains a stack o
24950 66 20 61 63 74 69 76 65 20 57 49 54 48 20 63 6c  f active WITH cl
24960 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20 74 68  auses.** with th
24970 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54  e inner-most WIT
24980 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67 20 61  H clause being a
24990 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  t the top of the
249a0 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68   stack..**.** Th
249b0 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73 68 65  is routine pushe
249c0 73 20 74 68 65 20 57 49 54 48 20 63 6c 61 75 73  s the WITH claus
249d0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
249e0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
249f0 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20  ** onto the top 
24a00 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66  of the stack. If
24a10 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65 65 20   argument bFree 
24a20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
24a30 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73  is.** WITH claus
24a40 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  e will never be 
24a50 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  popped from the 
24a60 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63  stack. In this c
24a70 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64  ase it.** should
24a80 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20   be freed along 
24a90 77 69 74 68 20 74 68 65 20 50 61 72 73 65 20 6f  with the Parse o
24aa0 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65 72 20  bject. In other 
24ab0 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62  cases, when.** b
24ac0 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57 69 74  Free==0, the Wit
24ad0 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65  h object will be
24ae0 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74   freed along wit
24af0 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a  h the SELECT .**
24b00 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20   statement with 
24b10 77 68 69 63 68 20 69 74 20 69 73 20 61 73 73 6f  which it is asso
24b20 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ciated..*/.void 
24b30 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28  sqlite3WithPush(
24b40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57  Parse *pParse, W
24b50 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38 20 62  ith *pWith, u8 b
24b60 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Free){.  assert(
24b70 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 28 70 50   bFree==0 || (pP
24b80 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20 26  arse->pWith==0 &
24b90 26 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54  & pParse->pWithT
24ba0 6f 46 72 65 65 3d 3d 30 29 20 29 3b 0a 20 20 69  oFree==0) );.  i
24bb0 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20  f( pWith ){.    
24bc0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
24bd0 70 57 69 74 68 21 3d 70 57 69 74 68 20 29 3b 0a  pWith!=pWith );.
24be0 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75 74 65      pWith->pOute
24bf0 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74  r = pParse->pWit
24c00 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  h;.    pParse->p
24c10 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20  With = pWith;.  
24c20 20 20 69 66 28 20 62 46 72 65 65 20 29 20 70 50    if( bFree ) pP
24c30 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65  arse->pWithToFre
24c40 65 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 0a 7d  e = pWith;.  }.}
24c50 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
24c60 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20  ction checks if 
24c70 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72  argument pFrom r
24c80 65 66 65 72 73 20 74 6f 20 61 20 43 54 45 20 64  efers to a CTE d
24c90 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a 20 61  eclared by .** a
24ca0 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f 6e 20   WITH clause on 
24cb0 74 68 65 20 73 74 61 63 6b 20 63 75 72 72 65 6e  the stack curren
24cc0 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64 20 62  tly maintained b
24cd0 79 20 74 68 65 20 70 61 72 73 65 72 2e 20 41 6e  y the parser. An
24ce0 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65 6e 74  d,.** if current
24cf0 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  ly processing a 
24d00 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  CTE expression, 
24d10 69 66 20 69 74 20 69 73 20 61 20 72 65 63 75 72  if it is a recur
24d20 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  sive.** referenc
24d30 65 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  e to the current
24d40 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70   CTE..**.** If p
24d50 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20  From falls into 
24d60 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 74 77  either of the tw
24d70 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61 62 6f  o categories abo
24d80 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a  ve, pFrom->pTab.
24d90 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65  ** and other fie
24da0 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65  lds are populate
24db0 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54  d accordingly. T
24dc0 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
24dd0 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d   check.** (pFrom
24de0 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20 64 65  ->pTab!=0) to de
24df0 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
24e00 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65 73 73  or not a success
24e10 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73  ful match.** was
24e20 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68   found..**.** Wh
24e30 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d  ether or not a m
24e40 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 53  atch is found, S
24e50 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
24e60 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
24e70 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66 20 61  .** occurs. If a
24e80 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  n error does occ
24e90 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ur, an error mes
24ea0 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69  sage is stored i
24eb0 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65 72 20  n the.** parser 
24ec0 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72 20 63  and some error c
24ed0 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ode other than S
24ee0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
24ef0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
24f00 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20 20 57   withExpand(.  W
24f10 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
24f20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
24f30 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b  t_item *pFrom.){
24f40 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
24f50 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
24f60 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  se;.  sqlite3 *d
24f70 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
24f80 20 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43    struct Cte *pC
24f90 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
24fa0 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43 54 45    /* Matched CTE
24fb0 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20   (or NULL if no 
24fc0 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69 74 68  match) */.  With
24fd0 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20 20 20   *pWith;        
24fe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
24ff0 49 54 48 20 63 6c 61 75 73 65 20 74 68 61 74 20  ITH clause that 
25000 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20  pCte belongs to 
25010 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  */..  assert( pF
25020 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
25030 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72 63 68  .  pCte = search
25040 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70 57 69  With(pParse->pWi
25050 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57 69 74  th, pFrom, &pWit
25060 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65 20 29  h);.  if( pCte )
25070 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
25080 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  b;.    ExprList 
25090 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c  *pEList;.    Sel
250a0 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53  ect *pSel;.    S
250b0 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20 20 20  elect *pLeft;   
250c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
250d0 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  Left-most SELECT
250e0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
250f0 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75 72 73    int bMayRecurs
25100 69 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ive;            
25110 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d 70 6f  /* True if compo
25120 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e  und joined by UN
25130 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20  ION [ALL] */.   
25140 20 57 69 74 68 20 2a 70 53 61 76 65 64 57 69 74   With *pSavedWit
25150 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  h;             /
25160 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  * Initial value 
25170 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  of pParse->pWith
25180 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   */..    /* If p
25190 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20  Cte->zCteErr is 
251a0 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73  non-NULL at this
251b0 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69   point, then thi
251c0 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a  s is an illegal.
251d0 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65      ** recursive
251e0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 43 54   reference to CT
251f0 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20 61 6e  E pCte. Leave an
25200 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
25210 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20   and return.    
25220 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70 43 74  ** early. If pCt
25230 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20 4e 55  e->zCteErr is NU
25240 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  LL, then this is
25250 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   not a recursive
25260 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20 20 20   reference..    
25270 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  ** In this case,
25280 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20   proceed.  */.  
25290 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 43 74 65    if( pCte->zCte
252a0 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Err ){.      sql
252b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
252c0 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43 74 65 45  rse, pCte->zCteE
252d0 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  rr, pCte->zName)
252e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
252f0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
25300 20 7d 0a 20 20 20 20 69 66 28 20 63 61 6e 6e 6f   }.    if( canno
25310 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  tBeFunction(pPar
25320 73 65 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74  se, pFrom) ) ret
25330 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
25340 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
25350 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
25360 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62  .    pFrom->pTab
25370 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
25380 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
25390 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
253a0 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d  ;.    if( pTab==
253b0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
253c0 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62 2d 3e  bort;.    pTab->
253d0 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20 20  nTabRef = 1;.   
253e0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
253f0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
25400 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b  b, pCte->zName);
25410 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
25420 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d   = -1;.    pTab-
25430 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
25440 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
25450 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
25460 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20 70 54  48576) );.    pT
25470 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
25480 54 46 5f 45 70 68 65 6d 65 72 61 6c 20 7c 20 54  TF_Ephemeral | T
25490 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64  F_NoVisibleRowid
254a0 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65  ;.    pFrom->pSe
254b0 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
254c0 6c 65 63 74 44 75 70 28 64 62 2c 20 70 43 74 65  lectDup(db, pCte
254d0 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
254e0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
254f0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
25500 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
25510 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
25520 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pFrom->pSelect )
25530 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
25540 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 63  if this is a rec
25550 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20  ursive CTE. */. 
25560 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d     pSel = pFrom-
25570 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d  >pSelect;.    bM
25580 61 79 52 65 63 75 72 73 69 76 65 20 3d 20 28 20  ayRecursive = ( 
25590 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  pSel->op==TK_ALL
255a0 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b   || pSel->op==TK
255b0 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66  _UNION );.    if
255c0 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  ( bMayRecursive 
255d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
255e0 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
255f0 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Src = pFrom->pSe
25600 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20  lect->pSrc;.    
25610 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
25620 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
25630 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
25640 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
25650 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b  m = &pSrc->a[i];
25660 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
25670 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30  em->zDatabase==0
25680 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49   .         && pI
25690 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20  tem->zName!=0 . 
256a0 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
256b0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 74  lite3StrICmp(pIt
256c0 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d  em->zName, pCte-
256d0 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20  >zName).        
256e0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
256f0 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  Item->pTab = pTa
25700 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  b;.          pIt
25710 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69  em->fg.isRecursi
25720 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ve = 1;.        
25730 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b    pTab->nTabRef+
25740 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65  +;.          pSe
25750 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  l->selFlags |= S
25760 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20  F_Recursive;.   
25770 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
25780 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c     }..    /* Onl
25790 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76 65 20  y one recursive 
257a0 72 65 66 65 72 65 6e 63 65 20 69 73 20 70 65 72  reference is per
257b0 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20  mitted. */ .    
257c0 69 66 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65  if( pTab->nTabRe
257d0 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  f>2 ){.      sql
257e0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20 20  ite3ErrorMsg(.  
257f0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
25800 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65  "multiple refere
25810 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73 69 76  nces to recursiv
25820 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70 43  e table: %s", pC
25830 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  te->zName.      
25840 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
25850 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
25860 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
25870 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 31  pTab->nTabRef==1
25880 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
25890 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67   ((pSel->selFlag
258a0 73 26 53 46 5f 52 65 63 75 72 73 69 76 65 29 20  s&SF_Recursive) 
258b0 26 26 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66  && pTab->nTabRef
258c0 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70 43 74  ==2 ));..    pCt
258d0 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 63 69  e->zCteErr = "ci
258e0 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65  rcular reference
258f0 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76 65  : %s";.    pSave
25900 64 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d 3e  dWith = pParse->
25910 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73  pWith;.    pPars
25920 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
25930 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65  ;.    if( bMayRe
25940 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
25950 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20   Select *pPrior 
25960 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a  = pSel->pPrior;.
25970 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
25980 72 69 6f 72 2d 3e 70 57 69 74 68 3d 3d 30 20 29  rior->pWith==0 )
25990 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
259a0 70 57 69 74 68 20 3d 20 70 53 65 6c 2d 3e 70 57  pWith = pSel->pW
259b0 69 74 68 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ith;.      sqlit
259c0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
259d0 6c 6b 65 72 2c 20 70 50 72 69 6f 72 29 3b 0a 20  lker, pPrior);. 
259e0 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69       pPrior->pWi
259f0 74 68 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  th = 0;.    }els
25a00 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
25a10 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
25a20 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d  er, pSel);.    }
25a30 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
25a40 74 68 20 3d 20 70 57 69 74 68 3b 0a 0a 20 20 20  th = pWith;..   
25a50 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b   for(pLeft=pSel;
25a60 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20   pLeft->pPrior; 
25a70 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72  pLeft=pLeft->pPr
25a80 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69 73 74  ior);.    pEList
25a90 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74   = pLeft->pEList
25aa0 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e  ;.    if( pCte->
25ab0 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20 69  pCols ){.      i
25ac0 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
25ad0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65  ist->nExpr!=pCte
25ae0 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29  ->pCols->nExpr )
25af0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
25b00 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
25b10 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20  , "table %s has 
25b20 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25 64  %d values for %d
25b30 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20   columns",.     
25b40 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61         pCte->zNa
25b50 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  me, pEList->nExp
25b60 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e  r, pCte->pCols->
25b70 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b  nExpr.        );
25b80 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
25b90 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57  >pWith = pSavedW
25ba0 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ith;.        ret
25bb0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
25bc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25bd0 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e 70  pEList = pCte->p
25be0 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Cols;.    }..   
25bf0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
25c00 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
25c10 73 65 2c 20 70 45 4c 69 73 74 2c 20 26 70 54 61  se, pEList, &pTa
25c20 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
25c30 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 62  aCol);.    if( b
25c40 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a  MayRecursive ){.
25c50 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d 3e        if( pSel->
25c60 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
25c70 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
25c80 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72     pCte->zCteErr
25c90 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 63   = "multiple rec
25ca0 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
25cb0 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 65  s: %s";.      }e
25cc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74  lse{.        pCt
25cd0 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 72 65  e->zCteErr = "re
25ce0 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
25cf0 65 20 69 6e 20 61 20 73 75 62 71 75 65 72 79 3a  e in a subquery:
25d00 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20   %s";.      }.  
25d10 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
25d20 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
25d30 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sel);.    }.    
25d40 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20  pCte->zCteErr = 
25d50 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  0;.    pParse->p
25d60 57 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74  With = pSavedWit
25d70 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  h;.  }..  return
25d80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
25d90 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
25da0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a  LITE_OMIT_CTE./*
25db0 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43  .** If the SELEC
25dc0 54 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  T passed as the 
25dd0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
25de0 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65  has an associate
25df0 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73  d WITH .** claus
25e00 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d 20 74  e, pop it from t
25e10 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65 64 20  he stack stored 
25e20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 50  as part of the P
25e30 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  arse object..**.
25e40 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
25e50 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20   is used as the 
25e60 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
25e70 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a  () callback by.*
25e80 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  * sqlite3SelectE
25e90 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77 61 6c  xpand() when wal
25ea0 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20 74 72  king a SELECT tr
25eb0 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 61  ee to resolve ta
25ec0 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64  ble.** names and
25ed0 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75   other FROM clau
25ee0 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f  se elements. .*/
25ef0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
25f00 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c 6b 65  ectPopWith(Walke
25f10 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
25f20 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
25f30 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
25f40 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 66 28  r->pParse;.  if(
25f50 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52   OK_IF_ALWAYS_TR
25f60 55 45 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68  UE(pParse->pWith
25f70 29 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ) && p->pPrior==
25f80 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70  0 ){.    With *p
25f90 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67 68 74  With = findRight
25fa0 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 3b 0a  most(p)->pWith;.
25fb0 20 20 20 20 69 66 28 20 70 57 69 74 68 21 3d 30      if( pWith!=0
25fc0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
25fd0 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d  ( pParse->pWith=
25fe0 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20 20 20  =pWith );.      
25ff0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
26000 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20  pWith->pOuter;. 
26010 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65     }.  }.}.#else
26020 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63 74 50  .#define selectP
26030 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69 66 0a  opWith 0.#endif.
26040 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
26050 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20  ine is a Walker 
26060 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78  callback for "ex
26070 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43  panding" a SELEC
26080 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
26090 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e  "Expanding" mean
260a0 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c  s to do the foll
260b0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
260c0 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56  (1)  Make sure V
260d0 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
260e0 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
260f0 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a  igned to every.*
26100 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e  *         elemen
26110 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
26120 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ause..**.**    (
26130 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  2)  Fill in the 
26140 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54  pTabList->a[].pT
26150 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  ab fields in the
26160 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a   SrcList that .*
26170 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  *         define
26180 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
26190 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61  When views appea
261a0 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
261b0 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20  ause,.**        
261c0 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e   fill pTabList->
261d0 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68  a[].pSelect with
261e0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
261f0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
26200 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20  **         that 
26210 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
26220 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20  iew.  A copy is 
26230 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77  made of the view
26240 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  's SELECT.**    
26250 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73       statement s
26260 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72  o that we can fr
26270 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64  eely modify or d
26280 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65  elete that state
26290 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
262a0 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67  without worrying
262b0 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75   about messing u
262c0 70 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  p the persistent
262d0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a   representation.
262e0 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68  **         of th
262f0 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20  e view..**.**   
26300 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20   (3)  Add terms 
26310 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
26320 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61  use to accommoda
26330 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  te the NATURAL k
26340 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20  eyword.**       
26350 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74    on joins and t
26360 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
26370 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e  clause of joins.
26380 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53  .**.**    (4)  S
26390 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  can the list of 
263a0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
263b0 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73  esult set (pELis
263c0 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20  t) looking.**   
263d0 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e        for instan
263e0 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f  ces of the "*" o
263f0 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54  perator or the T
26400 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e  ABLE.* operator.
26410 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66  .**         If f
26420 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63  ound, expand eac
26430 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72  h "*" to be ever
26440 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72  y column in ever
26450 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  y table.**      
26460 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74     and TABLE.* t
26470 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
26480 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  n in TABLE..**.*
26490 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
264a0 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b  ectExpander(Walk
264b0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
264c0 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
264d0 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
264e0 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e  er->pParse;.  in
264f0 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63  t i, j, k;.  Src
26500 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
26510 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
26520 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
26530 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
26540 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
26550 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
26560 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68  Expr *pE, *pRigh
26570 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36  t, *pExpr;.  u16
26580 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73   selFlags = p->s
26590 65 6c 46 6c 61 67 73 3b 0a 20 20 75 33 32 20 65  elFlags;.  u32 e
265a0 6c 69 73 74 46 6c 61 67 73 20 3d 20 30 3b 0a 0a  listFlags = 0;..
265b0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
265c0 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20   SF_Expanded;.  
265d0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
265e0 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74  iled  ){.    ret
265f0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
26600 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
26610 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSrc!=0 );.  if(
26620 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f   (selFlags & SF_
26630 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a  Expanded)!=0 ){.
26640 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
26650 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rune;.  }.  pTab
26660 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
26670 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
26680 4c 69 73 74 3b 0a 20 20 69 66 28 20 4f 4b 5f 49  List;.  if( OK_I
26690 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70 2d  F_ALWAYS_TRUE(p-
266a0 3e 70 57 69 74 68 29 20 29 7b 0a 20 20 20 20 73  >pWith) ){.    s
266b0 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 70  qlite3WithPush(p
266c0 50 61 72 73 65 2c 20 70 2d 3e 70 57 69 74 68 2c  Parse, p->pWith,
266d0 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d   0);.  }..  /* M
266e0 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20  ake sure cursor 
266f0 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
26700 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  n assigned to al
26710 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a  l entries in.  *
26720 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
26730 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  e of the SELECT 
26740 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
26750 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
26760 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
26770 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b  arse, pTabList);
26780 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
26790 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64  very table named
267a0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
267b0 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63  use of the selec
267c0 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  t.  If.  ** an e
267d0 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
267e0 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62   clause is a sub
267f0 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66  query instead of
26800 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
26810 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61  ,.  ** then crea
26820 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  te a transient t
26830 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
26840 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73  o describe the s
26850 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  ubquery..  */.  
26860 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
26870 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
26880 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
26890 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
268a0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
268b0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
268c0 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 3d  >fg.isRecursive=
268d0 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61  =0 || pFrom->pTa
268e0 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b!=0 );.    if( 
268f0 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75  pFrom->fg.isRecu
26900 72 73 69 76 65 20 29 20 63 6f 6e 74 69 6e 75 65  rsive ) continue
26910 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
26920 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
26930 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
26940 4d 49 54 5f 43 54 45 0a 20 20 20 20 69 66 28 20  MIT_CTE.    if( 
26950 77 69 74 68 45 78 70 61 6e 64 28 70 57 61 6c 6b  withExpand(pWalk
26960 65 72 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74  er, pFrom) ) ret
26970 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
26980 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54     if( pFrom->pT
26990 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e  ab ) {} else.#en
269a0 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 72 6f  dif.    if( pFro
269b0 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23  m->zName==0 ){.#
269c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
269d0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
269e0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
269f0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
26a00 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
26a10 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
26a20 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
26a30 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73  LECT */.      as
26a40 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b  sert( pSel!=0 );
26a50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
26a60 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
26a70 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
26a80 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
26a90 6c 6b 65 72 2c 20 70 53 65 6c 29 20 29 20 72 65  lker, pSel) ) re
26aa0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
26ab0 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
26ac0 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
26ad0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
26ae0 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
26af0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
26b00 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
26b10 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70  C_Abort;.      p
26b20 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31  Tab->nTabRef = 1
26b30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f  ;.      if( pFro
26b40 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
26b50 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
26b60 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
26b70 75 70 28 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a 41  up(db, pFrom->zA
26b80 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lias);.      }el
26b90 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62  se{.        pTab
26ba0 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
26bb0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 75  3MPrintf(db, "su
26bc0 62 71 75 65 72 79 5f 25 70 22 2c 20 28 76 6f 69  bquery_%p", (voi
26bd0 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20  d*)pTab);.      
26be0 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  }.      while( p
26bf0 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70  Sel->pPrior ){ p
26c00 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
26c10 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69  or; }.      sqli
26c20 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
26c30 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
26c40 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54 61  Sel->pEList,&pTa
26c50 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e 61  b->nCol,&pTab->a
26c60 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Col);.      pTab
26c70 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
26c80 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f      pTab->nRowLo
26c90 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
26ca0 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
26cb0 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
26cc0 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  );.      pTab->t
26cd0 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70  abFlags |= TF_Ep
26ce0 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a  hemeral;.#endif.
26cf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26d00 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
26d10 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
26d20 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
26d30 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  lause */.      a
26d40 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
26d50 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
26d60 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
26d70 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
26d80 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73  eTableItem(pPars
26d90 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20  e, 0, pFrom);.  
26da0 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
26db0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
26dc0 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  rt;.      if( pT
26dd0 61 62 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66  ab->nTabRef>=0xf
26de0 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73  fff ){.        s
26df0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
26e00 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
26e10 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c   references to \
26e20 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35  "%s\": max 65535
26e30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  ",.           pT
26e40 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
26e50 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
26e60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
26e70 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
26e80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61       }.      pTa
26e90 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20  b->nTabRef++;.  
26ea0 20 20 20 20 69 66 28 20 21 49 73 56 69 72 74 75      if( !IsVirtu
26eb0 61 6c 28 70 54 61 62 29 20 26 26 20 63 61 6e 6e  al(pTab) && cann
26ec0 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61  otBeFunction(pPa
26ed0 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20  rse, pFrom) ){. 
26ee0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
26ef0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
26f00 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
26f10 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
26f20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c  || !defined (SQL
26f30 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
26f40 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28  TABLE).      if(
26f50 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
26f60 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
26f70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36  t ){.        i16
26f80 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69   nCol;.        i
26f90 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  f( sqlite3ViewGe
26fa0 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
26fb0 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74  rse, pTab) ) ret
26fc0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
26fd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
26fe0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  From->pSelect==0
26ff0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f   );.        pFro
27000 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
27010 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
27020 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c  , pTab->pSelect,
27030 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
27040 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d  ite3SelectSetNam
27050 65 28 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  e(pFrom->pSelect
27060 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
27070 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70          nCol = p
27080 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
27090 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20     pTab->nCol = 
270a0 2d 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  -1;.        sqli
270b0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
270c0 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53  alker, pFrom->pS
270d0 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
270e0 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  pTab->nCol = nCo
270f0 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  l;.      }.#endi
27100 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
27110 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  Locate the index
27120 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e   named by the IN
27130 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
27140 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
27150 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
27160 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73  edByLookup(pPars
27170 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
27180 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
27190 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ort;.    }.  }..
271a0 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
271b0 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
271c0 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
271d0 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
271e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
271f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
27200 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
27210 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  in(pParse, p) ){
27220 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
27230 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Abort;.  }..  /*
27240 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74   For every "*" t
27250 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68  hat occurs in th
27260 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69  e column list, i
27270 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20  nsert the names 
27280 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  of.  ** all colu
27290 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
272a0 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72  s.  And for ever
272b0 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74  y TABLE.* insert
272c0 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20   the names.  ** 
272d0 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
272e0 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61  n TABLE.  The pa
272f0 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20  rser inserted a 
27300 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69  special expressi
27310 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65  on.  ** with the
27320 20 54 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70 65   TK_ASTERISK ope
27330 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
27340 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
27350 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20   in the column. 
27360 20 2a 2a 20 6c 69 73 74 2e 20 20 54 68 65 20 66   ** list.  The f
27370 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75  ollowing code ju
27380 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65  st has to locate
27390 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b   the TK_ASTERISK
273a0 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
273b0 73 20 61 6e 64 20 65 78 70 61 6e 64 20 65 61 63  s and expand eac
273c0 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73  h one to the lis
273d0 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  t of all columns
273e0 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61 62   in.  ** all tab
273f0 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
27400 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75  he first loop ju
27410 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  st checks to see
27420 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
27430 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a  y "*" operators.
27440 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65    ** that need e
27450 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  xpanding..  */. 
27460 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
27470 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
27480 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74  .    pE = pEList
27490 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[k].pExpr;.  
274a0 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
274b0 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72 65 61  _ASTERISK ) brea
274c0 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  k;.    assert( p
274d0 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
274e0 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29   pE->pRight!=0 )
274f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
27500 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
27510 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26  (pE->pLeft!=0 &&
27520 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d   pE->pLeft->op==
27530 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66  TK_ID) );.    if
27540 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
27550 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   && pE->pRight->
27560 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20  op==TK_ASTERISK 
27570 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 65 6c 69  ) break;.    eli
27580 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66  stFlags |= pE->f
27590 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lags;.  }.  if( 
275a0 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  k<pEList->nExpr 
275b0 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
275c0 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20   If we get here 
275d0 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73  it means the res
275e0 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  ult set contains
275f0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22   one or more "*"
27600 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
27610 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
27620 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f  e expanded.  Loo
27630 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
27640 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
27650 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
27660 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68  et and expand th
27670 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  em one by one.. 
27680 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74     */.    struct
27690 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
276a0 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  a = pEList->a;. 
276b0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
276c0 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66  w = 0;.    int f
276d0 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64  lags = pParse->d
276e0 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e  b->flags;.    in
276f0 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66  t longNames = (f
27700 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
27710 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20  llColNames)!=0. 
27720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27730 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26       && (flags &
27740 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
27750 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20  Names)==0;..    
27760 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
27770 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
27780 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e        pE = a[k].
27790 70 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6c 69  pExpr;.      eli
277a0 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66  stFlags |= pE->f
277b0 6c 61 67 73 3b 0a 20 20 20 20 20 20 70 52 69 67  lags;.      pRig
277c0 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b  ht = pE->pRight;
277d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
277e0 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
277f0 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
27800 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d      if( pE->op!=
27810 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 20 20  TK_ASTERISK.    
27820 20 20 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54     && (pE->op!=T
27830 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d  K_DOT || pRight-
27840 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op!=TK_ASTERISK
27850 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
27860 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
27870 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
27880 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
27890 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
278a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
278b0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
278c0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
278d0 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b  Parse, pNew, a[k
278e0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
278f0 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
27900 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
27910 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
27920 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d  Name = a[k].zNam
27930 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e;.          pNe
27940 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
27950 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d  -1].zSpan = a[k]
27960 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20  .zSpan;.        
27970 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
27980 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d  ;.          a[k]
27990 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20  .zSpan = 0;.    
279a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b      }.        a[
279b0 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  k].pExpr = 0;.  
279c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
279d0 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65     /* This expre
279e0 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f  ssion is a "*" o
279f0 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e  r a "TABLE.*" an
27a00 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  d needs to be.  
27a10 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65        ** expande
27a20 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  d. */.        in
27a30 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b  t tableSeen = 0;
27a40 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
27a50 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74  1 when TABLE mat
27a60 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ches */.        
27a70 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30  char *zTName = 0
27a80 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20  ;       /* text 
27a90 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45  of name of TABLE
27aa0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
27ab0 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  pE->op==TK_DOT )
27ac0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
27ad0 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30  rt( pE->pLeft!=0
27ae0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
27af0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
27b00 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74  operty(pE->pLeft
27b10 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
27b20 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  ;.          zTNa
27b30 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  me = pE->pLeft->
27b40 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
27b50 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
27b60 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
27b70 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
27b80 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
27b90 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  From++){.       
27ba0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
27bb0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
27bc0 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
27bd0 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSub = pFrom->pS
27be0 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20  elect;.         
27bf0 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
27c00 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b  = pFrom->zAlias;
27c10 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
27c20 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61   char *zSchemaNa
27c30 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
27c40 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
27c50 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
27c60 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
27c70 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70      zTabName = p
27c80 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
27c90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27ca0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
27cb0 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a  Failed ) break;.
27cc0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
27cd0 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e  ub==0 || (pSub->
27ce0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
27cf0 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a  stedFrom)==0 ){.
27d00 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62              pSub
27d10 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
27d20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
27d30 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
27d40 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29  TName, zTabName)
27d50 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
27d60 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
27d70 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27d80 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73           iDb = s
27d90 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
27da0 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
27db0 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
27dc0 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20      zSchemaName 
27dd0 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61  = iDb>=0 ? db->a
27de0 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
27df0 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20   : "*";.        
27e00 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f    }.          fo
27e10 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
27e20 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
27e30 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
27e40 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
27e50 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
27e60 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
27e70 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f  name;  /* The co
27e80 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
27e90 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  me */.          
27ea0 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b    char *zToFree;
27eb0 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73     /* Malloced s
27ec0 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73  tring that needs
27ed0 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
27ee0 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65              Toke
27ef0 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20  n sColname;  /* 
27f00 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  Computed column 
27f10 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20  name as a token 
27f20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  */..            
27f30 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b  assert( zName );
27f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
27f50 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a   zTName && pSub.
27f60 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
27f70 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e  sqlite3MatchSpan
27f80 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73  Name(pSub->pELis
27f90 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30  t->a[j].zSpan, 0
27fa0 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a  , zTName, 0)==0.
27fb0 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
27fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
27fd0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
27fe0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
27ff0 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e    /* If a column
28000 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68   is marked as 'h
28010 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20  idden', omit it 
28020 66 72 6f 6d 20 74 68 65 20 65 78 70 61 6e 64 65  from the expande
28030 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
28040 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74   result-set list
28050 20 75 6e 6c 65 73 73 20 74 68 65 20 53 45 4c 45   unless the SELE
28060 43 54 20 68 61 73 20 74 68 65 20 53 46 5f 49 6e  CT has the SF_In
28070 63 6c 75 64 65 48 69 64 64 65 6e 0a 20 20 20 20  cludeHidden.    
28080 20 20 20 20 20 20 20 20 2a 2a 20 62 69 74 20 73          ** bit s
28090 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  et..            
280a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
280b0 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
280c0 26 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64  & SF_IncludeHidd
280d0 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  en)==0.         
280e0 20 20 20 20 26 26 20 49 73 48 69 64 64 65 6e 43      && IsHiddenC
280f0 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f  olumn(&pTab->aCo
28100 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20 20 20  l[j]) .         
28110 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
28120 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
28130 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28140 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65          tableSee
28150 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  n = 1;..        
28160 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a      if( i>0 && z
28170 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  TName==0 ){.    
28180 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
28190 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  From->fg.jointyp
281a0 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
281b0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
281c0 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f     && tableAndCo
281d0 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69  lumnIndex(pTabLi
281e0 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c  st, i, zName, 0,
281f0 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   0).            
28200 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
28210 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
28220 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
28230 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
28240 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
28250 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
28260 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  ble to the right
28270 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
28280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28290 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
282a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
282b0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
282c0 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
282d0 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e  From->pUsing, zN
282e0 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
282f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
28300 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
28310 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
28320 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
28330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28340 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
28350 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
28360 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
28370 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28380 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
28390 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
283a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
283b0 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
283c0 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
283d0 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  _ID, zName);.   
283e0 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
283f0 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  e = zName;.     
28400 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
28410 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
28420 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c  if( longNames ||
28430 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
28440 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
28450 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a     Expr *pLeft;.
28460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
28470 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
28480 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61  r(db, TK_ID, zTa
28490 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
284a0 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
284b0 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
284c0 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
284d0 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
284e0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63           if( zSc
284f0 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20  hemaName ){.    
28500 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
28510 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
28520 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65  db, TK_ID, zSche
28530 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  maName);.       
28540 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
28550 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
28560 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
28570 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  eft, pExpr);.   
28580 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
28590 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
285a0 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
285b0 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
285c0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  name = sqlite3MP
285d0 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
285e0 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
285f0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
28600 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a       zToFree = z
28610 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
28620 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28630 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28640 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
28650 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
28660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28670 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
28680 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
28690 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
286a0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
286b0 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49     sqlite3TokenI
286c0 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a  nit(&sColname, z
286d0 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
286e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
286f0 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
28700 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c  rse, pNew, &sCol
28710 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  name, 0);.      
28720 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
28730 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
28740 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21   SF_NestedFrom)!
28750 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
28760 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
28770 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26  ist_item *pX = &
28780 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
28790 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  xpr-1];.        
287a0 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20 29        if( pSub )
287b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
287c0 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71    pX->zSpan = sq
287d0 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
287e0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  , pSub->pEList->
287f0 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[j].zSpan);.   
28800 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
28810 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
28820 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
28830 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28840 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
28850 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d  zSpan = sqlite3M
28860 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
28870 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  s.%s",.         
28880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288a0 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a    zSchemaName, z
288b0 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d  TabName, zColnam
288c0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
288d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
288e0 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20  ->zSpan==0 );.  
288f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28900 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
28910 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a  bSpanIsTab = 1;.
28920 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28930 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
28940 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46  3DbFree(db, zToF
28950 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
28960 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
28970 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
28980 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
28990 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
289a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
289b0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
289c0 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
289d0 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
289e0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
289f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
28a00 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
28a10 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
28a20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
28a30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28a40 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
28a50 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
28a60 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
28a70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
28a80 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
28a90 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  }.  if( p->pELis
28aa0 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  t ){.    if( p->
28ab0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62  pEList->nExpr>db
28ac0 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
28ad0 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
28ae0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
28af0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
28b00 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
28b10 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29   in result set")
28b20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
28b30 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
28b40 20 20 20 20 69 66 28 20 28 65 6c 69 73 74 46 6c      if( (elistFl
28b50 61 67 73 20 26 20 28 45 50 5f 48 61 73 46 75 6e  ags & (EP_HasFun
28b60 63 7c 45 50 5f 53 75 62 71 75 65 72 79 29 29 21  c|EP_Subquery))!
28b70 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  =0 ){.      p->s
28b80 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f  elFlags |= SF_Co
28b90 6d 70 6c 65 78 52 65 73 75 6c 74 3b 0a 20 20 20  mplexResult;.   
28ba0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
28bb0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
28bc0 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75  ./*.** No-op rou
28bd0 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72  tine for the par
28be0 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a  se-tree walker..
28bf0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
28c00 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 57  routine is the W
28c10 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
28c20 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73  ack then express
28c30 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65  ion trees.** are
28c40 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20   walked without 
28c50 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e  any actions bein
28c60 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20  g taken at each 
28c70 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c  node.  Presumabl
28c80 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  y,.** when this 
28c90 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
28ca0 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72  for Walker.xExpr
28cb0 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a  Callback then .*
28cc0 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  * Walker.xSelect
28cd0 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20  Callback is set 
28ce0 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  to do something 
28cf0 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79  useful for every
28d00 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e   .** subquery in
28d10 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65   the parser tree
28d20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
28d30 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c  ExprWalkNoop(Wal
28d40 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78  ker *NotUsed, Ex
28d50 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20  pr *NotUsed2){. 
28d60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
28d70 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
28d80 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
28d90 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
28da0 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75  ./*.** No-op rou
28db0 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72  tine for the par
28dc0 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 20 66  se-tree walker f
28dd0 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
28de0 65 6e 74 73 2e 0a 2a 2a 20 73 75 62 71 75 65 72  ents..** subquer
28df0 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20  y in the parser 
28e00 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tree..*/.int sql
28e10 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f  ite3SelectWalkNo
28e20 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73  op(Walker *NotUs
28e30 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55  ed, Select *NotU
28e40 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
28e50 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
28e60 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
28e70 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
28e80 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  inue;.}..#if SQL
28e90 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
28ea0 41 6c 77 61 79 73 20 61 73 73 65 72 74 2e 20 20  Always assert.  
28eb0 54 68 69 73 20 78 53 65 6c 65 63 74 43 61 6c 6c  This xSelectCall
28ec0 62 61 63 6b 32 20 69 6d 70 6c 65 6d 65 6e 74 61  back2 implementa
28ed0 74 69 6f 6e 20 70 72 6f 76 65 73 20 74 68 61 74  tion proves that
28ee0 20 74 68 65 0a 2a 2a 20 78 53 65 6c 65 63 74 43   the.** xSelectC
28ef0 61 6c 6c 62 61 63 6b 32 20 69 73 20 6e 65 76 65  allback2 is neve
28f00 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 76 6f  r invoked..*/.vo
28f10 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
28f20 57 61 6c 6b 41 73 73 65 72 74 32 28 57 61 6c 6b  WalkAssert2(Walk
28f30 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c  er *NotUsed, Sel
28f40 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a  ect *NotUsed2){.
28f50 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
28f60 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
28f70 55 73 65 64 32 29 3b 0a 20 20 61 73 73 65 72 74  Used2);.  assert
28f80 28 20 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ( 0 );.}.#endif.
28f90 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
28fa0 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61 20 53  ne "expands" a S
28fb0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
28fc0 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
28fd0 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f  ubqueries..** Fo
28fe0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
28ff0 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74  ormation on what
29000 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78   it means to "ex
29010 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a  pand" a SELECT.*
29020 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65  * statement, see
29030 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
29040 74 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64  the selectExpand
29050 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b   worker callback
29060 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78   above..**.** Ex
29070 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54  panding a SELECT
29080 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68   statement is th
29090 65 20 66 69 72 73 74 20 73 74 65 70 20 69 6e 20  e first step in 
290a0 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20  processing a.** 
290b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
290c0 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  .  The SELECT st
290d0 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  atement must be 
290e0 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a  expanded before.
290f0 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  ** name resoluti
29100 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e  on is performed.
29110 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69  .**.** If anythi
29120 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61  ng goes wrong, a
29130 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
29140 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
29150 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63  pParse..** The c
29160 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
29170 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20 70  can detect the p
29180 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e  roblem by lookin
29190 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72  g at pParse->nEr
291a0 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72  r.** and/or pPar
291b0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
291c0 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iled..*/.static 
291d0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
291e0 63 74 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a  ctExpand(Parse *
291f0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
29200 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b  pSelect){.  Walk
29210 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43  er w;.  w.xExprC
29220 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
29230 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20  3ExprWalkNoop;. 
29240 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
29250 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f  se;.  if( OK_IF_
29260 41 4c 57 41 59 53 5f 54 52 55 45 28 70 50 61 72  ALWAYS_TRUE(pPar
29270 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 29  se->hasCompound)
29280 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63   ){.    w.xSelec
29290 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76  tCallback = conv
292a0 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63  ertCompoundSelec
292b0 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20  tToSubquery;.   
292c0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
292d0 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ck2 = 0;.    sql
292e0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
292f0 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  w, pSelect);.  }
29300 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
29310 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70  back = selectExp
29320 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65  ander;.  w.xSele
29330 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65  ctCallback2 = se
29340 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a 20 20 73  lectPopWith;.  s
29350 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
29360 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d  (&w, pSelect);.}
29370 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
29380 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
29390 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
293a0 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
293b0 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20  llback callback 
293c0 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53  for the sqlite3S
293d0 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a  electTypeInfo().
293e0 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  ** interface..**
293f0 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f  .** For each FRO
29400 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
29410 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54  y, add Column.zT
29420 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a  ype and Column.z
29430 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  Coll.** informat
29440 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65  ion to the Table
29450 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
29460 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
29470 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20  esult set.** of 
29480 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a  that subquery..*
29490 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
294a0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
294b0 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
294c0 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73  ult set was cons
294d0 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65  tructed.** by se
294e0 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62  lectExpander() b
294f0 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ut the type and 
29500 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
29510 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65  ation was omitte
29520 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69  d.** at that poi
29530 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74  nt because ident
29540 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79  ifiers had not y
29550 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  et been resolved
29560 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
29570 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
29580 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65  er identifier re
29590 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
295a0 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41  tic void selectA
295b0 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
295c0 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  fo(Walker *pWalk
295d0 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
295e0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
295f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c  .  int i;.  SrcL
29600 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
29610 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
29620 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20  item *pFrom;..  
29630 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
29640 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
29650 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  d );.  assert( (
29660 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
29670 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30  _HasTypeInfo)==0
29680 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   );.  p->selFlag
29690 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49  s |= SF_HasTypeI
296a0 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20  nfo;.  pParse = 
296b0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
296c0 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
296d0 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >pSrc;.  for(i=0
296e0 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
296f0 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
29700 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
29710 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  m++){.    Table 
29720 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
29730 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
29740 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
29750 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
29760 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
29770 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
29780 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
29790 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
297a0 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
297b0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
297c0 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
297d0 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20  lect;.      if( 
297e0 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pSel ){.        
297f0 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
29800 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65  ior ) pSel = pSe
29810 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  l->pPrior;.     
29820 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
29830 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
29840 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
29850 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20  , pTab, pSel);. 
29860 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
29870 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
29880 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
29890 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64  dds datatype and
298a0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
298b0 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nce information 
298c0 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20  to.** the Table 
298d0 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c  structures of al
298e0 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
298f0 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a  bqueries in a.**
29900 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
29910 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69  t..**.** Use thi
29920 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  s routine after 
29930 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  name resolution.
29940 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
29950 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
29960 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a  TypeInfo(Parse *
29970 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
29980 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65  pSelect){.#ifnde
29990 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
299a0 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20  BQUERY.  Walker 
299b0 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  w;.  w.xSelectCa
299c0 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
299d0 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a  SelectWalkNoop;.
299e0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
299f0 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64  ack2 = selectAdd
29a00 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
29a10 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
29a20 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ack = sqlite3Exp
29a30 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
29a40 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
29a50 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
29a60 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
29a70 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
29a80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
29a90 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43 54  sets up a SELECT
29aa0 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70   statement for p
29ab0 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a  rocessing.  The.
29ac0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
29ad0 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a  accomplished:.**
29ae0 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20  .**     *  VDBE 
29af0 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61  Cursor numbers a
29b00 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  re assigned to a
29b10 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74  ll FROM-clause t
29b20 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  erms..**     *  
29b30 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20  Ephemeral Table 
29b40 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61  objects are crea
29b50 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d  ted for all FROM
29b60 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
29b70 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e  es..**     *  ON
29b80 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
29b90 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69  es are shifted i
29ba0 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d  nto WHERE statem
29bb0 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57  ents.**     *  W
29bc0 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64  ildcards "*" and
29bd0 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65   "TABLE.*" in re
29be0 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78  sult sets are ex
29bf0 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a  panded..**     *
29c00 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e    Identifiers in
29c10 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20   expression are 
29c20 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65  matched to table
29c30 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
29c40 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72  utine acts recur
29c50 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75  sively on all su
29c60 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20  bqueries within 
29c70 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76  the SELECT..*/.v
29c80 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
29c90 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a  tPrep(.  Parse *
29ca0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
29cb0 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
29cc0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
29cd0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
29ce0 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
29cf0 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
29d00 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65  coded. */.  Name
29d10 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e  Context *pOuterN
29d20 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65  C  /* Name conte
29d30 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72  xt for container
29d40 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
29d50 20 70 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p!=0 || pParse-
29d60 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
29d70 64 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  d );.  if( pPars
29d80 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
29d90 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
29da0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
29db0 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
29dc0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
29dd0 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
29de0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69  (pParse, p);.  i
29df0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
29e00 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
29e10 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
29e20 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52  turn;.  sqlite3R
29e30 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65  esolveSelectName
29e40 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75  s(pParse, p, pOu
29e50 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50  terNC);.  if( pP
29e60 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50  arse->nErr || pP
29e70 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
29e80 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
29e90 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
29ea0 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72  AddTypeInfo(pPar
29eb0 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  se, p);.}../*.**
29ec0 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65   Reset the aggre
29ed0 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
29ee0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72  ..**.** The aggr
29ef0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
29f00 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65  r is a set of me
29f10 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20  mory cells that 
29f20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64  hold.** intermed
29f30 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69  iate results whi
29f40 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61  le calculating a
29f50 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68  n aggregate.  Th
29f60 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  is.** routine ge
29f70 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61  nerates code tha
29f80 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69  t stores NULLs i
29f90 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d  n all of those m
29fa0 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a  emory.** cells..
29fb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
29fc0 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
29fd0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
29fe0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
29ff0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
2a000 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
2a010 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
2a020 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
2a030 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20  unc;.  int nReg 
2a040 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  = pAggInfo->nFun
2a050 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  c + pAggInfo->nC
2a060 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65  olumn;.  if( nRe
2a070 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23  g==0 ) return;.#
2a080 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2a090 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
2a0a0 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20  hat all AggInfo 
2a0b0 72 65 67 69 73 74 65 72 73 20 61 72 65 20 77 69  registers are wi
2a0c0 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73  thin the range s
2a0d0 70 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a  pecified by.  **
2a0e0 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e   AggInfo.mnReg..
2a0f0 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f  AggInfo.mxReg */
2a100 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d  .  assert( nReg=
2a110 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
2a120 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  -pAggInfo->mnReg
2a130 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  +1 );.  for(i=0;
2a140 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   i<pAggInfo->nCo
2a150 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
2a160 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f  assert( pAggInfo
2a170 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d  ->aCol[i].iMem>=
2a180 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a  pAggInfo->mnReg.
2a190 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67           && pAgg
2a1a0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
2a1b0 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  em<=pAggInfo->mx
2a1c0 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  Reg );.  }.  for
2a1d0 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
2a1e0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20  ->nFunc; i++){. 
2a1f0 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49     assert( pAggI
2a200 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d  nfo->aFunc[i].iM
2a210 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  em>=pAggInfo->mn
2a220 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
2a230 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2a240 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66  i].iMem<=pAggInf
2a250 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a  o->mxReg );.  }.
2a260 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
2a270 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2a280 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e  _Null, 0, pAggIn
2a290 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49  fo->mnReg, pAggI
2a2a0 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66  nfo->mxReg);.  f
2a2b0 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66  or(pFunc=pAggInf
2a2c0 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69  o->aFunc, i=0; i
2a2d0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
2a2e0 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b  ; i++, pFunc++){
2a2f0 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
2a300 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
2a310 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
2a320 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
2a330 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2a340 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2a350 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2a360 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
2a370 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
2a380 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  E->x.pList->nExp
2a390 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  r!=1 ){.        
2a3a0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2a3b0 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
2a3c0 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73  T aggregates mus
2a3d0 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f  t have exactly o
2a3e0 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ne ".           
2a3f0 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20  "argument");.   
2a400 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
2a410 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
2a420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a430 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
2a440 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
2a450 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
2a460 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c   pE->x.pList, 0,
2a470 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
2a480 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2a490 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
2a4a0 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  al, pFunc->iDist
2a4b0 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20  inct, 0, 0,.    
2a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4d0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
2a4e0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
2a4f0 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  O);.      }.    
2a500 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
2a510 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67  nvoke the OP_Agg
2a520 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20  Finalize opcode 
2a530 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67  for every aggreg
2a540 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ate function.** 
2a550 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73  in the AggInfo s
2a560 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
2a570 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a  tic void finaliz
2a580 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61  eAggFunctions(Pa
2a590 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
2a5a0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
2a5b0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
2a5c0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
2a5d0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
2a5e0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
2a5f0 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
2a600 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
2a610 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
2a620 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
2a630 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
2a640 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
2a650 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
2a660 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2a670 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
2a680 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2a690 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2a6a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67  AddOp2(v, OP_Agg
2a6b0 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c  Final, pF->iMem,
2a6c0 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
2a6d0 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20  nExpr : 0);.    
2a6e0 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
2a6f0 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63  dP4(v, pF->pFunc
2a700 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
2a710 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61   }.}../*.** Upda
2a720 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  te the accumulat
2a730 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  or memory cells 
2a740 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
2a750 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
2a760 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
2a770 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  position..*/.sta
2a780 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
2a790 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
2a7a0 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
2a7b0 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
2a7c0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
2a7d0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
2a7e0 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d  ;.  int regHit =
2a7f0 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69   0;.  int addrHi
2a800 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72  tTest = 0;.  str
2a810 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
2a820 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41   *pF;.  struct A
2a830 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a  ggInfo_col *pC;.
2a840 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
2a850 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66  ectMode = 1;.  f
2a860 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
2a870 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
2a880 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
2a890 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69  ++, pF++){.    i
2a8a0 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74  nt nArg;.    int
2a8b0 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20   addrNext = 0;. 
2a8c0 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20     int regAgg;. 
2a8d0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
2a8e0 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
2a8f0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
2a900 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2a910 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
2a920 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
2a930 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
2a940 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  ){.      nArg = 
2a950 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
2a960 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c      regAgg = sql
2a970 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
2a980 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a  (pParse, nArg);.
2a990 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2a9a0 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
2a9b0 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67  arse, pList, reg
2a9c0 41 67 67 2c 20 30 2c 20 53 51 4c 49 54 45 5f 45  Agg, 0, SQLITE_E
2a9d0 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65  CEL_DUP);.    }e
2a9e0 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  lse{.      nArg 
2a9f0 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67  = 0;.      regAg
2aa00 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 0;.    }.   
2aa10 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e   if( pF->iDistin
2aa20 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ct>=0 ){.      a
2aa30 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65  ddrNext = sqlite
2aa40 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
2aa50 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2aa60 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f  e( nArg==0 );  /
2aa70 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f  * Error conditio
2aa80 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  n */.      testc
2aa90 61 73 65 28 20 6e 41 72 67 3e 31 20 29 3b 20 20  ase( nArg>1 );  
2aaa0 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f   /* Also an erro
2aab0 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 44  r */.      codeD
2aac0 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
2aad0 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61  pF->iDistinct, a
2aae0 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41  ddrNext, 1, regA
2aaf0 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gg);.    }.    i
2ab00 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75  f( pF->pFunc->fu
2ab10 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
2ab20 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
2ab30 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
2ab40 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
2ab50 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2ab60 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
2ab70 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
2ab80 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
2ab90 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21  =0 );  /* pList!
2aba0 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20  =0 if pF->pFunc 
2abb0 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a  has NEEDCOLL */.
2abc0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
2abd0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21  Item=pList->a; !
2abe0 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b  pColl && j<nArg;
2abf0 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
2ac00 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
2ac10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
2ac20 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
2ac30 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
2ac40 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  }.      if( !pCo
2ac50 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
2ac60 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
2ac70 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
2ac80 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2ac90 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67  egHit==0 && pAgg
2aca0 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
2acb0 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b  or ) regHit = ++
2acc0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2acd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ace0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
2acf0 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20  Seq, regHit, 0, 
2ad00 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
2ad10 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
2ad20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2ad30 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2ad40 5f 41 67 67 53 74 65 70 30 2c 20 30 2c 20 72 65  _AggStep0, 0, re
2ad50 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b  gAgg, pF->iMem);
2ad60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2ad70 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e  AppendP4(v, pF->
2ad80 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
2ad90 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
2ada0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
2adb0 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  u8)nArg);.    sq
2adc0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
2add0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
2ade0 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
2adf0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  g);.    sqlite3R
2ae00 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
2ae10 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
2ae20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61  nArg);.    if( a
2ae30 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ddrNext ){.     
2ae40 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2ae50 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
2ae60 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Next);.      sql
2ae70 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2ae80 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
2ae90 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f  }.  }..  /* Befo
2aea0 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68  re populating th
2aeb0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
2aec0 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74  gisters, clear t
2aed0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
2aee0 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
2aef0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72   if any of the r
2af00 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76  equired column v
2af10 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61 64  alues are alread
2af20 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20  y present .  ** 
2af30 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73 71  in registers, sq
2af40 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 20  lite3ExprCode() 
2af50 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79  may use OP_SCopy
2af60 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c   to copy the val
2af70 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69  ue.  ** to pC->i
2af80 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20  Mem. But by the 
2af90 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69  time the value i
2afa0 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67  s used, the orig
2afb0 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20  inal register.  
2afc0 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ** may have been
2afd0 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74   used, invalidat
2afe0 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ing the underlyi
2aff0 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e  ng buffer holdin
2b000 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20  g the.  ** text 
2b010 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53  or blob value. S
2b020 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33  ee ticket [88303
2b030 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  4dcb5]..  **.  *
2b040 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69  * Another soluti
2b050 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63  on would be to c
2b060 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f  hange the OP_SCo
2b070 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20  py used to copy 
2b080 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75  cached.  ** valu
2b090 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79  es to an OP_Copy
2b0a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67  ..  */.  if( reg
2b0b0 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48  Hit ){.    addrH
2b0c0 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  itTest = sqlite3
2b0d0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2b0e0 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64  _If, regHit); Vd
2b0f0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2b100 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
2b110 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
2b120 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  e);.  for(i=0, p
2b130 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  C=pAggInfo->aCol
2b140 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41  ; i<pAggInfo->nA
2b150 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c  ccumulator; i++,
2b160 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   pC++){.    sqli
2b170 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
2b180 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70  se, pC->pExpr, p
2b190 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  C->iMem);.  }.  
2b1a0 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
2b1b0 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Mode = 0;.  sqli
2b1c0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2b1d0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  r(pParse);.  if(
2b1e0 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a   addrHitTest ){.
2b1f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2b200 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48  umpHere(v, addrH
2b210 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  itTest);.  }.}..
2b220 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
2b230 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  le OP_Explain in
2b240 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65  struction to the
2b250 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e   VDBE to explain
2b260 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75   a simple.** cou
2b270 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45  nt(*) query ("SE
2b280 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2b290 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69  OM pTab")..*/.#i
2b2a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2b2b0 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63  T_EXPLAIN.static
2b2c0 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d   void explainSim
2b2d0 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73  pleCount(.  Pars
2b2e0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2b2f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2b300 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
2b310 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
2b320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b330 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67    /* Table being
2b340 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e   queried */.  In
2b350 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
2b360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b370 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f   Index used to o
2b380 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72  ptimize scan, or
2b390 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66   NULL */.){.  if
2b3a0 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
2b3b0 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  n==2 ){.    int 
2b3c0 62 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d  bCover = (pIdx!=
2b3d0 30 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70  0 && (HasRowid(p
2b3e0 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61  Tab) || !IsPrima
2b3f0 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
2b400 29 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  ));.    char *zE
2b410 71 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  qp = sqlite3MPri
2b420 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
2b430 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73  "SCAN TABLE %s%s
2b440 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
2b450 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
2b460 20 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49    bCover ? " USI
2b470 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
2b480 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20  X " : "",.      
2b490 20 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d    bCover ? pIdx-
2b4a0 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20  >zName : "".    
2b4b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2b4c0 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20  beAddOp4(.      
2b4d0 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c    pParse->pVdbe,
2b4e0 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
2b4f0 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
2b500 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44  0, 0, zEqp, P4_D
2b510 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20  YNAMIC.    );.  
2b520 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
2b530 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  ne explainSimple
2b540 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e  Count(a,b,c).#en
2b550 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74  dif../*.** sqlit
2b560 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63 61 6c  e3WalkExpr() cal
2b570 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 68 61  lback used by ha
2b580 76 69 6e 67 54 6f 57 68 65 72 65 28 29 2e 0a 2a  vingToWhere()..*
2b590 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 64 65  *.** If the node
2b5a0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 63   passed to the c
2b5b0 61 6c 6c 62 61 63 6b 20 69 73 20 61 20 54 4b 5f  allback is a TK_
2b5c0 41 4e 44 20 6e 6f 64 65 2c 20 72 65 74 75 72 6e  AND node, return
2b5d0 20 0a 2a 2a 20 57 52 43 5f 43 6f 6e 74 69 6e 75   .** WRC_Continu
2b5e0 65 20 74 6f 20 74 65 6c 6c 20 73 71 6c 69 74 65  e to tell sqlite
2b5f0 33 57 61 6c 6b 45 78 70 72 28 29 20 74 6f 20 69  3WalkExpr() to i
2b600 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 63  terate through c
2b610 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a  hild nodes..**.*
2b620 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
2b630 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 2e 20 49  urn WRC_Prune. I
2b640 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c 73  n this case, als
2b650 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 0a  o check if the .
2b660 2a 2a 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f  ** sub-expressio
2b670 6e 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 72  n matches the cr
2b680 69 74 65 72 69 61 20 66 6f 72 20 62 65 69 6e 67  iteria for being
2b690 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 57 48   moved to the WH
2b6a0 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 49  ERE.** clause. I
2b6b0 66 20 73 6f 2c 20 61 64 64 20 69 74 20 74 6f 20  f so, add it to 
2b6c0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2b6d0 20 61 6e 64 20 72 65 70 6c 61 63 65 20 74 68 65   and replace the
2b6e0 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f 6e 0a   sub-expression.
2b6f0 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 48 41  ** within the HA
2b700 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20  VING expression 
2b710 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20  with a constant 
2b720 22 31 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  "1"..*/.static i
2b730 6e 74 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65  nt havingToWhere
2b740 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a 70  ExprCb(Walker *p
2b750 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
2b760 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70  xpr){.  if( pExp
2b770 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44 20 29 7b  r->op!=TK_AND ){
2b780 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20  .    Select *pS 
2b790 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65  = pWalker->u.pSe
2b7a0 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20 73 71  lect;.    if( sq
2b7b0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
2b7c0 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 70 57 61  antOrGroupBy(pWa
2b7d0 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 45  lker->pParse, pE
2b7e0 78 70 72 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42  xpr, pS->pGroupB
2b7f0 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  y) ){.      sqli
2b800 74 65 33 20 2a 64 62 20 3d 20 70 57 61 6c 6b 65  te3 *db = pWalke
2b810 72 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  r->pParse->db;. 
2b820 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
2b830 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
2b840 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  oc(db, TK_INTEGE
2b850 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f  R, &sqlite3IntTo
2b860 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 20  kens[1], 0);.   
2b870 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
2b880 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 57 68         Expr *pWh
2b890 65 72 65 20 3d 20 70 53 2d 3e 70 57 68 65 72 65  ere = pS->pWhere
2b8a0 3b 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 45  ;.        SWAP(E
2b8b0 78 70 72 2c 20 2a 70 4e 65 77 2c 20 2a 70 45 78  xpr, *pNew, *pEx
2b8c0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  pr);.        pNe
2b8d0 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  w = sqlite3ExprA
2b8e0 6e 64 28 64 62 2c 20 70 57 68 65 72 65 2c 20 70  nd(db, pWhere, p
2b8f0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 53  New);.        pS
2b900 2d 3e 70 57 68 65 72 65 20 3d 20 70 4e 65 77 3b  ->pWhere = pNew;
2b910 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72  .        pWalker
2b920 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ->eCode = 1;.   
2b930 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
2b940 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
2b950 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
2b960 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
2b970 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 6c  *.** Transfer el
2b980 69 67 69 62 6c 65 20 74 65 72 6d 73 20 66 72 6f  igible terms fro
2b990 6d 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61  m the HAVING cla
2b9a0 75 73 65 20 6f 66 20 61 20 71 75 65 72 79 2c 20  use of a query, 
2b9b0 77 68 69 63 68 20 69 73 0a 2a 2a 20 70 72 6f 63  which is.** proc
2b9c0 65 73 73 65 64 20 61 66 74 65 72 20 67 72 6f 75  essed after grou
2b9d0 70 69 6e 67 2c 20 74 6f 20 74 68 65 20 57 48 45  ping, to the WHE
2b9e0 52 45 20 63 6c 61 75 73 65 2c 20 77 68 69 63 68  RE clause, which
2b9f0 20 69 73 20 70 72 6f 63 65 73 73 65 64 20 62 65   is processed be
2ba00 66 6f 72 65 0a 2a 2a 20 67 72 6f 75 70 69 6e 67  fore.** grouping
2ba10 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  . For example, t
2ba20 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
2ba30 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2ba40 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20 61  <tables> WHERE a
2ba50 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48 41  =? GROUP BY b HA
2ba60 56 49 4e 47 20 62 3d 3f 20 41 4e 44 20 63 3d 3f  VING b=? AND c=?
2ba70 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 20 72 65  .**.** can be re
2ba80 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
2ba90 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
2baa0 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45  M <tables> WHERE
2bab0 20 61 3d 3f 20 41 4e 44 20 62 3d 3f 20 47 52 4f   a=? AND b=? GRO
2bac0 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 63  UP BY b HAVING c
2bad0 3d 3f 0a 2a 2a 0a 2a 2a 20 41 20 74 65 72 6d 20  =?.**.** A term 
2bae0 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 65 78  of the HAVING ex
2baf0 70 72 65 73 73 69 6f 6e 20 69 73 20 65 6c 69 67  pression is elig
2bb00 69 62 6c 65 20 66 6f 72 20 74 72 61 6e 73 66 65  ible for transfe
2bb10 72 20 69 66 20 69 74 20 63 6f 6e 73 69 73 74 73  r if it consists
2bb20 0a 2a 2a 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  .** entirely of 
2bb30 63 6f 6e 73 74 61 6e 74 73 20 61 6e 64 20 65 78  constants and ex
2bb40 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61  pressions that a
2bb50 72 65 20 61 6c 73 6f 20 47 52 4f 55 50 20 42 59  re also GROUP BY
2bb60 20 74 65 72 6d 73 20 74 68 61 74 0a 2a 2a 20 75   terms that.** u
2bb70 73 65 20 74 68 65 20 22 42 49 4e 41 52 59 22 20  se the "BINARY" 
2bb80 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
2bb90 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ce..*/.static vo
2bba0 69 64 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65  id havingToWhere
2bbb0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2bbc0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 57 61  Select *p){.  Wa
2bbd0 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20 20  lker sWalker;.  
2bbe0 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b 65 72 2c  memset(&sWalker,
2bbf0 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 61 6c 6b   0, sizeof(sWalk
2bc00 65 72 29 29 3b 0a 20 20 73 57 61 6c 6b 65 72 2e  er));.  sWalker.
2bc10 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
2bc20 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72  .  sWalker.xExpr
2bc30 43 61 6c 6c 62 61 63 6b 20 3d 20 68 61 76 69 6e  Callback = havin
2bc40 67 54 6f 57 68 65 72 65 45 78 70 72 43 62 3b 0a  gToWhereExprCb;.
2bc50 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70 53 65 6c    sWalker.u.pSel
2bc60 65 63 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74  ect = p;.  sqlit
2bc70 65 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61 6c  e3WalkExpr(&sWal
2bc80 6b 65 72 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  ker, p->pHaving)
2bc90 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
2bca0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
2bcb0 73 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 26 26  sWalker.eCode &&
2bcc0 20 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54   (sqlite3SelectT
2bcd0 72 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30  race & 0x100)!=0
2bce0 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
2bcf0 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
2bd00 2c 70 2c 28 22 4d 6f 76 65 20 48 41 56 49 4e 47  ,p,("Move HAVING
2bd10 20 74 65 72 6d 73 20 69 6e 74 6f 20 57 48 45 52   terms into WHER
2bd20 45 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  E:\n"));.    sql
2bd30 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
2bd40 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
2bd50 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
2bd60 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2bd70 20 74 68 65 20 70 54 68 69 73 20 65 6e 74 72 79   the pThis entry
2bd80 20 6f 66 20 70 54 61 62 4c 69 73 74 20 69 73 20   of pTabList is 
2bd90 61 20 73 65 6c 66 2d 6a 6f 69 6e 20 6f 66 20 61  a self-join of a
2bda0 20 70 72 69 6f 72 20 76 69 65 77 2e 0a 2a 2a 20   prior view..** 
2bdb0 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 72  If it is, then r
2bdc0 65 74 75 72 6e 20 74 68 65 20 53 72 63 4c 69 73  eturn the SrcLis
2bdd0 74 5f 69 74 65 6d 20 66 6f 72 20 74 68 65 20 70  t_item for the p
2bde0 72 69 6f 72 20 76 69 65 77 2e 20 20 49 66 20 69  rior view.  If i
2bdf0 74 20 69 73 20 6e 6f 74 2c 0a 2a 2a 20 74 68 65  t is not,.** the
2be00 6e 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  n return 0..*/.s
2be10 74 61 74 69 63 20 73 74 72 75 63 74 20 53 72 63  tatic struct Src
2be20 4c 69 73 74 5f 69 74 65 6d 20 2a 69 73 53 65 6c  List_item *isSel
2be30 66 4a 6f 69 6e 56 69 65 77 28 0a 20 20 53 72 63  fJoinView(.  Src
2be40 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
2be50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61            /* Sea
2be60 72 63 68 20 66 6f 72 20 73 65 6c 66 2d 6a 6f 69  rch for self-joi
2be70 6e 73 20 69 6e 20 74 68 69 73 20 46 52 4f 4d 20  ns in this FROM 
2be80 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
2be90 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2bea0 2a 70 54 68 69 73 20 20 20 2f 2a 20 53 65 61 72  *pThis   /* Sear
2beb0 63 68 20 66 6f 72 20 70 72 69 6f 72 20 72 65 66  ch for prior ref
2bec0 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 73  erence to this s
2bed0 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20  ubquery */.){.  
2bee0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2bef0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66 6f  tem *pItem;.  fo
2bf00 72 28 70 49 74 65 6d 20 3d 20 70 54 61 62 4c 69  r(pItem = pTabLi
2bf10 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 54 68  st->a; pItem<pTh
2bf20 69 73 3b 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  is; pItem++){.  
2bf30 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
2bf40 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  lect==0 ) contin
2bf50 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ue;.    if( pIte
2bf60 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69  m->fg.viaCorouti
2bf70 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ne ) continue;. 
2bf80 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e     if( pItem->zN
2bf90 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ame==0 ) continu
2bfa0 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
2bfb0 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65 6d  e3_stricmp(pItem
2bfc0 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20 70 54 68  ->zDatabase, pTh
2bfd0 69 73 2d 3e 7a 44 61 74 61 62 61 73 65 29 21 3d  is->zDatabase)!=
2bfe0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2bff0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
2c000 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61  ricmp(pItem->zNa
2c010 6d 65 2c 20 70 54 68 69 73 2d 3e 7a 4e 61 6d 65  me, pThis->zName
2c020 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
2c030 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2c040 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 0a  ExprCompare(0, .
2c050 20 20 20 20 20 20 20 20 20 20 70 54 68 69 73 2d            pThis-
2c060 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65  >pSelect->pWhere
2c070 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
2c080 2d 3e 70 57 68 65 72 65 2c 20 2d 31 29 20 0a 20  ->pWhere, -1) . 
2c090 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54     ){.      /* T
2c0a0 68 65 20 76 69 65 77 20 77 61 73 20 6d 6f 64 69  he view was modi
2c0b0 66 69 65 64 20 62 79 20 73 6f 6d 65 20 6f 74 68  fied by some oth
2c0c0 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  er optimization 
2c0d0 73 75 63 68 20 61 73 0a 20 20 20 20 20 20 2a 2a  such as.      **
2c0e0 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
2c0f0 72 6d 73 28 29 20 2a 2f 0a 20 20 20 20 20 20 63  rms() */.      c
2c100 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
2c110 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d 3b     return pItem;
2c120 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2c130 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
2c140 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50  E_COUNTOFVIEW_OP
2c150 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  TIMIZATION./*.**
2c160 20 41 74 74 65 6d 70 74 20 74 6f 20 74 72 61 6e   Attempt to tran
2c170 73 66 6f 72 6d 20 61 20 71 75 65 72 79 20 6f 66  sform a query of
2c180 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
2c190 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
2c1a0 2a 29 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  *) FROM (SELECT 
2c1b0 78 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  x FROM t1 UNION 
2c1c0 41 4c 4c 20 53 45 4c 45 43 54 20 79 20 46 52 4f  ALL SELECT y FRO
2c1d0 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 49 6e 74 6f  M t2).**.** Into
2c1e0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
2c1f0 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
2c200 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 29  ount(*) FROM t1)
2c210 2b 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  +(SELECT count(*
2c220 29 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a  ) FROM t2).**.**
2c230 20 54 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74   The transformat
2c240 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69  ion only works i
2c250 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
2c260 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
2c270 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20  .**.**   *  The 
2c280 73 75 62 71 75 65 72 79 20 69 73 20 61 20 55 4e  subquery is a UN
2c290 49 4f 4e 20 41 4c 4c 20 6f 66 20 74 77 6f 20 6f  ION ALL of two o
2c2a0 72 20 6d 6f 72 65 20 74 65 72 6d 73 0a 2a 2a 20  r more terms.** 
2c2b0 20 20 2a 20 20 54 68 65 72 65 20 69 73 20 6e 6f    *  There is no
2c2c0 20 57 48 45 52 45 20 6f 72 20 47 52 4f 55 50 20   WHERE or GROUP 
2c2d0 42 59 20 6f 72 20 48 41 56 49 4e 47 20 63 6c 61  BY or HAVING cla
2c2e0 75 73 65 73 20 6f 6e 20 74 68 65 20 73 75 62 71  uses on the subq
2c2f0 75 65 72 69 65 73 0a 2a 2a 20 20 20 2a 20 20 54  ueries.**   *  T
2c300 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
2c310 73 20 61 20 73 69 6d 70 6c 65 20 63 6f 75 6e 74  s a simple count
2c320 28 2a 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  (*).**.** Return
2c330 20 54 52 55 45 20 69 66 20 74 68 65 20 6f 70 74   TRUE if the opt
2c340 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 6e 64  imization is und
2c350 65 72 74 61 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74  ertaken..*/.stat
2c360 69 63 20 69 6e 74 20 63 6f 75 6e 74 4f 66 56 69  ic int countOfVi
2c370 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28 50  ewOptimization(P
2c380 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
2c390 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65  lect *p){.  Sele
2c3a0 63 74 20 2a 70 53 75 62 2c 20 2a 70 50 72 69 6f  ct *pSub, *pPrio
2c3b0 72 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  r;.  Expr *pExpr
2c3c0 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 75 6e 74  ;.  Expr *pCount
2c3d0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
2c3e0 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
2c3f0 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
2c400 74 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  te)==0 ) return 
2c410 30 3b 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  0;   /* This is 
2c420 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a  an aggregate */.
2c430 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
2c440 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
2c450 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
2c460 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 72 65      /* Single re
2c470 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  sult column */. 
2c480 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   pExpr = p->pELi
2c490 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
2c4a0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
2c4b0 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
2c4c0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2c4d0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 69 73      /* Result is
2c4e0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f   an aggregate */
2c4f0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
2c500 74 72 69 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e  tricmp(pExpr->u.
2c510 7a 54 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22 29 20  zToken,"count") 
2c520 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
2c530 49 73 20 63 6f 75 6e 74 28 29 20 2a 2f 0a 20 20  Is count() */.  
2c540 69 66 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  if( pExpr->x.pLi
2c550 73 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st!=0 ) return 0
2c560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c570 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 75    /* Must be cou
2c580 6e 74 28 2a 29 20 2a 2f 0a 20 20 69 66 28 20 70  nt(*) */.  if( p
2c590 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ->pSrc->nSrc!=1 
2c5a0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
2c5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c5c0 4f 6e 65 20 74 61 62 6c 65 20 69 6e 20 46 52 4f  One table in FRO
2c5d0 4d 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70  M  */.  pSub = p
2c5e0 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ->pSrc->a[0].pSe
2c5f0 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 53 75 62  lect;.  if( pSub
2c600 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
2c610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2c630 20 46 52 4f 4d 20 69 73 20 61 20 73 75 62 71 75   FROM is a subqu
2c640 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ery */.  if( pSu
2c650 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72  b->pPrior==0 ) r
2c660 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
2c670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
2c680 73 74 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64  st be a compound
2c690 20 72 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20   ry */.  do{.   
2c6a0 20 69 66 28 20 70 53 75 62 2d 3e 6f 70 21 3d 54   if( pSub->op!=T
2c6b0 4b 5f 41 4c 4c 20 26 26 20 70 53 75 62 2d 3e 70  K_ALL && pSub->p
2c6c0 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30  Prior ) return 0
2c6d0 3b 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 55 4e  ;  /* Must be UN
2c6e0 49 4f 4e 20 41 4c 4c 20 2a 2f 0a 20 20 20 20 69  ION ALL */.    i
2c6f0 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20  f( pSub->pWhere 
2c700 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
2c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c720 20 2f 2a 20 4e 6f 20 57 48 45 52 45 20 63 6c 61   /* No WHERE cla
2c730 75 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  use */.    if( p
2c740 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
2c750 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 20 72  SF_Aggregate ) r
2c760 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20  eturn 0;     /* 
2c770 4e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  Not an aggregate
2c780 20 2a 2f 0a 20 20 20 20 70 53 75 62 20 3d 20 70   */.    pSub = p
2c790 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 20 20 20  Sub->pPrior;    
2c7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70            /* Rep
2c7c0 65 61 74 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e  eat over compoun
2c7d0 64 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 70  d */.  }while( p
2c7e0 53 75 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Sub );..  /* If 
2c7f0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
2c800 69 6e 74 20 74 68 65 6e 20 69 74 20 69 73 20 4f  int then it is O
2c810 4b 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65  K to perform the
2c820 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
2c830 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  */..  db = pPars
2c840 65 2d 3e 64 62 3b 0a 20 20 70 43 6f 75 6e 74 20  e->db;.  pCount 
2c850 3d 20 70 45 78 70 72 3b 0a 20 20 70 45 78 70 72  = pExpr;.  pExpr
2c860 20 3d 20 30 3b 0a 20 20 70 53 75 62 20 3d 20 70   = 0;.  pSub = p
2c870 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ->pSrc->a[0].pSe
2c880 6c 65 63 74 3b 0a 20 20 70 2d 3e 70 53 72 63 2d  lect;.  p->pSrc-
2c890 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20  >a[0].pSelect = 
2c8a0 30 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  0;.  sqlite3SrcL
2c8b0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
2c8c0 3e 70 53 72 63 29 3b 0a 20 20 70 2d 3e 70 53 72  >pSrc);.  p->pSr
2c8d0 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
2c8e0 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
2c8f0 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 2d 3e 70  db, sizeof(*p->p
2c900 53 72 63 29 29 3b 0a 20 20 77 68 69 6c 65 28 20  Src));.  while( 
2c910 70 53 75 62 20 29 7b 0a 20 20 20 20 45 78 70 72  pSub ){.    Expr
2c920 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 70 50 72   *pTerm;.    pPr
2c930 69 6f 72 20 3d 20 70 53 75 62 2d 3e 70 50 72 69  ior = pSub->pPri
2c940 6f 72 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 50  or;.    pSub->pP
2c950 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 53  rior = 0;.    pS
2c960 75 62 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ub->pNext = 0;. 
2c970 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67     pSub->selFlag
2c980 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74  s |= SF_Aggregat
2c990 65 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73 65 6c  e;.    pSub->sel
2c9a0 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d  Flags &= ~SF_Com
2c9b0 70 6f 75 6e 64 3b 0a 20 20 20 20 70 53 75 62 2d  pound;.    pSub-
2c9c0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b  >nSelectRow = 0;
2c9d0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2c9e0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2c9f0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
2ca00 20 20 70 54 65 72 6d 20 3d 20 70 50 72 69 6f 72    pTerm = pPrior
2ca10 20 3f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   ? sqlite3ExprDu
2ca20 70 28 64 62 2c 20 70 43 6f 75 6e 74 2c 20 30 29  p(db, pCount, 0)
2ca30 20 3a 20 70 43 6f 75 6e 74 3b 0a 20 20 20 20 70   : pCount;.    p
2ca40 53 75 62 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  Sub->pEList = sq
2ca50 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
2ca60 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 70  end(pParse, 0, p
2ca70 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d  Term);.    pTerm
2ca80 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2ca90 70 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43  pParse, TK_SELEC
2caa0 54 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  T, 0, 0);.    sq
2cab0 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65 6c  lite3PExprAddSel
2cac0 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 65 72  ect(pParse, pTer
2cad0 6d 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 69 66  m, pSub);.    if
2cae0 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
2caf0 20 20 20 20 70 45 78 70 72 20 3d 20 70 54 65 72      pExpr = pTer
2cb00 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  m;.    }else{.  
2cb10 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
2cb20 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2cb30 20 54 4b 5f 50 4c 55 53 2c 20 70 54 65 72 6d 2c   TK_PLUS, pTerm,
2cb40 20 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20   pExpr);.    }. 
2cb50 20 20 20 70 53 75 62 20 3d 20 70 50 72 69 6f 72     pSub = pPrior
2cb60 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 45 4c 69 73  ;.  }.  p->pELis
2cb70 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20  t->a[0].pExpr = 
2cb80 70 45 78 70 72 3b 0a 20 20 70 2d 3e 73 65 6c 46  pExpr;.  p->selF
2cb90 6c 61 67 73 20 26 3d 20 7e 53 46 5f 41 67 67 72  lags &= ~SF_Aggr
2cba0 65 67 61 74 65 3b 0a 0a 23 69 66 20 53 45 4c 45  egate;..#if SELE
2cbb0 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
2cbc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2cbd0 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
2cbe0 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
2cbf0 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
2cc00 2c 70 2c 28 22 41 66 74 65 72 20 63 6f 75 6e 74  ,p,("After count
2cc10 2d 6f 66 2d 76 69 65 77 20 6f 70 74 69 6d 69 7a  -of-view optimiz
2cc20 61 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20  ation:\n"));.   
2cc30 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2cc40 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2cc50 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
2cc60 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
2cc70 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54   /* SQLITE_COUNT
2cc80 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54  OFVIEW_OPTIMIZAT
2cc90 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65  ION */../*.** Ge
2cca0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
2ccb0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
2ccc0 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68  ment given in th
2ccd0 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a  e p argument.  .
2cce0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
2ccf0 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 61  s are returned a
2cd00 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
2cd10 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
2cd20 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d  ture..** See com
2cd30 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65 49  ments in sqliteI
2cd40 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65 72  nt.h for further
2cd50 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
2cd60 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2cd70 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
2cd80 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
2cd90 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
2cda0 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64  e.** encountered
2cdb0 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70  , then an approp
2cdc0 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
2cdd0 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a  age is left in.*
2cde0 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  * pParse->zErrMs
2cdf0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
2ce00 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66  utine does NOT f
2ce10 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73  ree the Select s
2ce20 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
2ce30 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  in.  The.** call
2ce40 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65  ing function nee
2ce50 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ds to do that..*
2ce60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
2ce70 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
2ce80 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
2ce90 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
2cea0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
2ceb0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
2cec0 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
2ced0 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
2cee0 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ded. */.  Select
2cef0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
2cf00 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
2cf10 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65  ith the query re
2cf20 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
2cf30 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
2cf40 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2cf50 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
2cf60 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
2cf70 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d    /* Return from
2cf80 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2cf90 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a  in() */.  Vdbe *
2cfa0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
2cfb0 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
2cfc0 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f  machine under co
2cfd0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
2cfe0 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20  int isAgg;      
2cff0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
2d000 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
2d010 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
2d020 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2d030 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c  EList = 0;  /* L
2d040 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
2d050 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20  o extract. */.  
2d060 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
2d070 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  t;     /* List o
2d080 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
2d090 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
2d0a0 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
2d0b0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2d0c0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
2d0d0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
2d0e0 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
2d0f0 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
2d100 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
2d110 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
2d120 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20   *pHaving;      
2d130 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47     /* The HAVING
2d140 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
2d150 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72   NULL */.  int r
2d160 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  c = 1;          
2d170 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
2d180 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66  turn from this f
2d190 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73  unction */.  Dis
2d1a0 74 69 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e  tinctCtx sDistin
2d1b0 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68  ct; /* Info on h
2d1c0 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44  ow to code the D
2d1d0 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
2d1e0 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53 6f  */.  SortCtx sSo
2d1f0 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  rt;         /* I
2d200 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f  nfo on how to co
2d210 64 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  de the ORDER BY 
2d220 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67 49  clause */.  AggI
2d230 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20  nfo sAggInfo;   
2d240 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
2d250 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67  n used by aggreg
2d260 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  ate queries */. 
2d270 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20   int iEnd;      
2d280 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
2d290 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66  ss of the end of
2d2a0 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
2d2b0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
2d2c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
2d2d0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2d2e0 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  n */.  ExprList 
2d2f0 2a 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 20  *pMinMaxOrderBy 
2d300 3d 20 30 3b 20 20 2f 2a 20 41 64 64 65 64 20 4f  = 0;  /* Added O
2d310 52 44 45 52 20 42 59 20 66 6f 72 20 6d 69 6e 2f  RDER BY for min/
2d320 6d 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  max queries */. 
2d330 20 75 38 20 6d 69 6e 4d 61 78 46 6c 61 67 3b 20   u8 minMaxFlag; 
2d340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d350 2f 2a 20 46 6c 61 67 20 66 6f 72 20 6d 69 6e 2f  /* Flag for min/
2d360 6d 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a 0a  max queries */..
2d370 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d380 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e  MIT_EXPLAIN.  in
2d390 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74  t iRestoreSelect
2d3a0 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65  Id = pParse->iSe
2d3b0 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73 65  lectId;.  pParse
2d3c0 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70 50  ->iSelectId = pP
2d3d0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
2d3e0 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  tId++;.#endif.. 
2d3f0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
2d400 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
2d410 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2d420 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
2d430 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
2d440 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
2d450 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
2d460 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
2d470 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  CT, 0, 0, 0) ) r
2d480 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65  eturn 1;.  memse
2d490 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20  t(&sAggInfo, 0, 
2d4a0 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29  sizeof(sAggInfo)
2d4b0 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
2d4c0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c  CE_ENABLED.  SEL
2d4d0 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
2d4e0 65 2c 70 2c 20 28 22 62 65 67 69 6e 20 70 72 6f  e,p, ("begin pro
2d4f0 63 65 73 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20  cessing:\n"));. 
2d500 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
2d510 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
2d520 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  ){.    sqlite3Tr
2d530 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
2d540 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
2d550 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  f..  assert( p->
2d560 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
2d570 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
2d580 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61  _DistFifo );.  a
2d590 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
2d5a0 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
2d5b0 65 44 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20  eDest!=SRT_Fifo 
2d5c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2d5d0 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
2d5e0 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
2d5f0 5f 44 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20  _DistQueue );.  
2d600 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
2d610 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
2d620 3e 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75  >eDest!=SRT_Queu
2d630 65 20 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72  e );.  if( Ignor
2d640 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
2d650 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  t) ){.    assert
2d660 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53  (pDest->eDest==S
2d670 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65  RT_Exists || pDe
2d680 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55  st->eDest==SRT_U
2d690 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20  nion || .       
2d6a0 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
2d6b0 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20  ==SRT_Except || 
2d6c0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2d6d0 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20  T_Discard ||.   
2d6e0 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
2d6f0 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20  Dest==SRT_Queue 
2d700 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2d710 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c  ==SRT_DistFifo |
2d720 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65  |.           pDe
2d730 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
2d740 69 73 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73  istQueue || pDes
2d750 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69  t->eDest==SRT_Fi
2d760 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f  fo);.    /* If O
2d770 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f  RDER BY makes no
2d780 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74   difference in t
2d790 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e  he output then n
2d7a0 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20  either does.    
2d7b0 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69  ** DISTINCT so i
2d7c0 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64  t can be removed
2d7d0 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c   too. */.    sql
2d7e0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
2d7f0 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  te(db, p->pOrder
2d800 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  By);.    p->pOrd
2d810 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  erBy = 0;.    p-
2d820 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
2d830 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20  _Distinct;.  }. 
2d840 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
2d850 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29  ep(pParse, p, 0)
2d860 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72  ;.  memset(&sSor
2d870 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f  t, 0, sizeof(sSo
2d880 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f  rt));.  sSort.pO
2d890 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
2d8a0 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74  erBy;.  pTabList
2d8b0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66   = p->pSrc;.  if
2d8c0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
2d8d0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
2d8e0 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  ed ){.    goto s
2d8f0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
2d900 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
2d910 73 74 21 3d 30 20 29 3b 0a 20 20 69 73 41 67 67  st!=0 );.  isAgg
2d920 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20   = (p->selFlags 
2d930 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21  & SF_Aggregate)!
2d940 3d 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  =0;.#if SELECTTR
2d950 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
2d960 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
2d970 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
2d980 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
2d990 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 20  0x100,pParse,p, 
2d9a0 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73  ("after name res
2d9b0 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20  olution:\n"));. 
2d9c0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2d9d0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
2d9e0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
2d9f0 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65   /* Get a pointe
2da00 72 20 74 68 65 20 56 44 42 45 20 75 6e 64 65 72  r the VDBE under
2da10 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2c 20 61   construction, a
2da20 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
2da30 56 44 42 45 20 69 66 20 6f 6e 65 0a 20 20 2a 2a  VDBE if one.  **
2da40 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
2da50 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 76 20 3d  y exist */.  v =
2da60 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
2da70 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
2da80 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
2da90 74 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 44 65  t_end;.  if( pDe
2daa0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
2dab0 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e  utput ){.    gen
2dac0 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
2dad0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d  (pParse, p);.  }
2dae0 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 6c  ..  /* Try to fl
2daf0 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
2db00 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2db10 75 73 65 20 75 70 20 69 6e 74 6f 20 74 68 65 20  use up into the 
2db20 6d 61 69 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a  main query.  */.
2db30 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
2db40 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
2db50 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
2db60 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
2db70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e  .  for(i=0; !p->
2db80 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62  pPrior && i<pTab
2db90 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
2dba0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
2dbb0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2dbc0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
2dbd0 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  i];.    Select *
2dbe0 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53  pSub = pItem->pS
2dbf0 65 6c 65 63 74 3b 0a 20 20 20 20 54 61 62 6c 65  elect;.    Table
2dc00 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e   *pTab = pItem->
2dc10 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 53  pTab;.    if( pS
2dc20 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ub==0 ) continue
2dc30 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 74 63 68 20  ;..    /* Catch 
2dc40 6d 69 73 6d 61 74 63 68 20 69 6e 20 74 68 65 20  mismatch in the 
2dc50 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73  declared columns
2dc60 20 6f 66 20 61 20 76 69 65 77 20 61 6e 64 20 74   of a view and t
2dc70 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  he number of.   
2dc80 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   ** columns in t
2dc90 68 65 20 53 45 4c 45 43 54 20 6f 6e 20 74 68 65  he SELECT on the
2dca0 20 52 48 53 20 2a 2f 0a 20 20 20 20 69 66 28 20   RHS */.    if( 
2dcb0 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62  pTab->nCol!=pSub
2dcc0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
2dcd0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2dce0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2dcf0 20 22 65 78 70 65 63 74 65 64 20 25 64 20 63 6f   "expected %d co
2dd00 6c 75 6d 6e 73 20 66 6f 72 20 27 25 73 27 20 62  lumns for '%s' b
2dd10 75 74 20 67 6f 74 20 25 64 22 2c 0a 20 20 20 20  ut got %d",.    
2dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd30 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54    pTab->nCol, pT
2dd40 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d  ab->zName, pSub-
2dd50 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  >pEList->nExpr);
2dd60 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
2dd70 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20  ct_end;.    }.. 
2dd80 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 74 72 79     /* Do not try
2dd90 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 6e 20 61   to flatten an a
2dda0 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
2ddb0 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
2ddc0 20 46 6c 61 74 74 65 6e 69 6e 67 20 61 6e 20 61   Flattening an a
2ddd0 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
2dde0 79 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62  y is only possib
2ddf0 6c 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  le if the outer 
2de00 71 75 65 72 79 0a 20 20 20 20 2a 2a 20 69 73 20  query.    ** is 
2de10 6e 6f 74 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74  not a join.  But
2de20 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
2de30 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
2de40 6e 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 71  n, then the subq
2de50 75 65 72 79 0a 20 20 20 20 2a 2a 20 77 69 6c 6c  uery.    ** will
2de60 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   be implemented 
2de70 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  as a co-routine 
2de80 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
2de90 61 64 76 61 6e 74 61 67 65 20 74 6f 0a 20 20 20  advantage to.   
2dea0 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   ** flattening i
2deb0 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
2dec0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 53 75   */.    if( (pSu
2ded0 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
2dee0 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 20 29  _Aggregate)!=0 )
2def0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
2df00 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 47 72  ssert( pSub->pGr
2df10 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20  oupBy==0 );..   
2df20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 65 72   /* If the outer
2df30 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20   query contains 
2df40 61 20 22 63 6f 6d 70 6c 65 78 22 20 72 65 73 75  a "complex" resu
2df50 6c 74 20 73 65 74 20 28 74 68 61 74 20 69 73 2c  lt set (that is,
2df60 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 72  .    ** if the r
2df70 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
2df80 20 6f 75 74 65 72 20 71 75 65 72 79 20 75 73 65   outer query use
2df90 73 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 73  s functions or s
2dfa0 75 62 71 75 65 72 69 65 73 29 0a 20 20 20 20 2a  ubqueries).    *
2dfb0 2a 20 61 6e 64 20 69 66 20 74 68 65 20 73 75 62  * and if the sub
2dfc0 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61  query contains a
2dfd0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
2dfe0 65 20 61 6e 64 20 69 66 0a 20 20 20 20 2a 2a 20  e and if.    ** 
2dff0 69 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65  it will be imple
2e000 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72  mented as a co-r
2e010 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 64 6f 20  outine, then do 
2e020 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 20 20 54 68  not flatten.  Th
2e030 69 73 0a 20 20 20 20 2a 2a 20 72 65 73 74 72 69  is.    ** restri
2e040 63 74 69 6f 6e 20 61 6c 6c 6f 77 73 20 53 51 4c  ction allows SQL
2e050 20 63 6f 6e 73 74 72 75 63 74 73 20 6c 69 6b 65   constructs like
2e060 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
2e070 20 20 2a 2a 20 20 53 45 4c 45 43 54 20 65 78 70    **  SELECT exp
2e080 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28  ensive_function(
2e090 78 29 0a 20 20 20 20 2a 2a 20 20 20 20 46 52 4f  x).    **    FRO
2e0a0 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  M (SELECT x FROM
2e0b0 20 74 61 62 20 4f 52 44 45 52 20 42 59 20 79 20   tab ORDER BY y 
2e0c0 4c 49 4d 49 54 20 31 30 29 3b 0a 20 20 20 20 2a  LIMIT 10);.    *
2e0d0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70  *.    ** The exp
2e0e0 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28  ensive_function(
2e0f0 29 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 75 74  ) is only comput
2e100 65 64 20 6f 6e 20 74 68 65 20 31 30 20 72 6f 77  ed on the 10 row
2e110 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 72  s that.    ** ar
2e120 65 20 6f 75 74 70 75 74 2c 20 72 61 74 68 65 72  e output, rather
2e130 20 74 68 61 6e 20 65 76 65 72 79 20 72 6f 77 20   than every row 
2e140 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  of the table..  
2e150 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
2e160 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74  requirement that
2e170 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
2e180 20 68 61 76 65 20 61 20 63 6f 6d 70 6c 65 78 20   have a complex 
2e190 72 65 73 75 6c 74 20 73 65 74 0a 20 20 20 20 2a  result set.    *
2e1a0 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 66 6c 61  * means that fla
2e1b0 74 74 65 6e 69 6e 67 20 64 6f 65 73 20 6f 63 63  ttening does occ
2e1c0 75 72 20 6f 6e 20 73 69 6d 70 6c 65 72 20 53 51  ur on simpler SQ
2e1d0 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69  L constraints wi
2e1e0 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 74 68 65  thout.    ** the
2e1f0 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74   expensive_funct
2e200 69 6f 6e 28 29 20 6c 69 6b 65 3a 0a 20 20 20 20  ion() like:.    
2e210 2a 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43  **.    **  SELEC
2e220 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T x FROM (SELECT
2e230 20 78 20 46 52 4f 4d 20 74 61 62 20 4f 52 44 45   x FROM tab ORDE
2e240 52 20 42 59 20 79 20 4c 49 4d 49 54 20 31 30 29  R BY y LIMIT 10)
2e250 3b 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ;.    */.    if(
2e260 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 21   pSub->pOrderBy!
2e270 3d 30 0a 20 20 20 20 20 26 26 20 69 3d 3d 30 0a  =0.     && i==0.
2e280 20 20 20 20 20 26 26 20 28 70 2d 3e 73 65 6c 46       && (p->selF
2e290 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6c 65  lags & SF_Comple
2e2a0 78 52 65 73 75 6c 74 29 21 3d 30 0a 20 20 20 20  xResult)!=0.    
2e2b0 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e   && (pTabList->n
2e2c0 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  Src==1.         
2e2d0 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  || (pTabList->a[
2e2e0 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28  1].fg.jointype&(
2e2f0 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
2e300 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  ))!=0).    ){.  
2e310 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2e320 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 66 6c 61    }..    if( fla
2e330 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61  ttenSubquery(pPa
2e340 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67  rse, p, i, isAgg
2e350 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
2e360 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e 20  is subquery can 
2e370 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f  be absorbed into
2e380 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a   its parent. */.
2e390 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20        i = -1;.  
2e3a0 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74    }.    pTabList
2e3b0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
2e3c0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2e3d0 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
2e3e0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  ct_end;.    if( 
2e3f0 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62  !IgnorableOrderb
2e400 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
2e410 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
2e420 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
2e430 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2e440 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2e450 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
2e460 45 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c  ELECT.  /* Handl
2e470 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  e compound SELEC
2e480 54 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69  T statements usi
2e490 6e 67 20 74 68 65 20 73 65 70 61 72 61 74 65 20  ng the separate 
2e4a0 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 0a 20 20  multiSelect().  
2e4b0 2a 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 20  ** procedure..  
2e4c0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
2e4d0 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d  or ){.    rc = m
2e4e0 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73  ultiSelect(pPars
2e4f0 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
2e500 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
2e510 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
2e520 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
2e530 65 6c 65 63 74 49 64 29 3b 0a 23 69 66 20 53 45  electId);.#if SE
2e540 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2e550 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  D.    SELECTTRAC
2e560 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65  E(1,pParse,p,("e
2e570 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  nd compound-sele
2e580 63 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22  ct processing\n"
2e590 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  ));.#endif.    r
2e5a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
2e5b0 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 6f 72 20 65  ndif..  /* For e
2e5c0 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ach term in the 
2e5d0 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 64 6f 20  FROM clause, do 
2e5e0 74 77 6f 20 74 68 69 6e 67 73 3a 0a 20 20 2a 2a  two things:.  **
2e5f0 20 28 31 29 20 41 75 74 68 6f 72 69 7a 65 64 20   (1) Authorized 
2e600 75 6e 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  unreferenced tab
2e610 6c 65 73 0a 20 20 2a 2a 20 28 32 29 20 47 65 6e  les.  ** (2) Gen
2e620 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
2e630 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 0a 20  ll sub-queries. 
2e640 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
2e650 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
2e660 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
2e670 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2e680 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
2e690 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c  t->a[i];.    Sel
2e6a0 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20  ectDest dest;.  
2e6b0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 0a    Select *pSub;.
2e6c0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
2e6d0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
2e6e0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
2e6f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
2e700 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2e710 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65  *zSavedAuthConte
2e720 78 74 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  xt;.#endif..    
2e730 2f 2a 20 49 73 73 75 65 20 53 51 4c 49 54 45 5f  /* Issue SQLITE_
2e740 52 45 41 44 20 61 75 74 68 6f 72 69 7a 61 74 69  READ authorizati
2e750 6f 6e 73 20 77 69 74 68 20 61 20 66 61 6b 65 20  ons with a fake 
2e760 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 66 6f 72 20  column name for 
2e770 61 6e 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  any.    ** table
2e780 73 20 74 68 61 74 20 61 72 65 20 72 65 66 65 72  s that are refer
2e790 65 6e 63 65 64 20 62 75 74 20 66 72 6f 6d 20 77  enced but from w
2e7a0 68 69 63 68 20 6e 6f 20 76 61 6c 75 65 73 20 61  hich no values a
2e7b0 72 65 20 65 78 74 72 61 63 74 65 64 2e 0a 20 20  re extracted..  
2e7c0 20 20 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66    ** Examples of
2e7d0 20 77 68 65 72 65 20 74 68 65 73 65 20 6b 69 6e   where these kin
2e7e0 64 73 20 6f 66 20 6e 75 6c 6c 20 53 51 4c 49 54  ds of null SQLIT
2e7f0 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a 61  E_READ authoriza
2e800 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 77 6f 75  tions.    ** wou
2e810 6c 64 20 6f 63 63 75 72 3a 0a 20 20 20 20 2a 2a  ld occur:.    **
2e820 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  .    **     SELE
2e830 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2e840 20 74 31 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45   t1;   -- SQLITE
2e850 5f 52 45 41 44 20 74 31 2e 22 22 0a 20 20 20 20  _READ t1."".    
2e860 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 74 31  **     SELECT t1
2e870 2e 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 3b 20  .* FROM t1, t2; 
2e880 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44    -- SQLITE_READ
2e890 20 74 32 2e 22 22 0a 20 20 20 20 2a 2a 0a 20 20   t2."".    **.  
2e8a0 20 20 2a 2a 20 54 68 65 20 66 61 6b 65 20 63 6f    ** The fake co
2e8b0 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 61 6e 20  lumn name is an 
2e8c0 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20 49  empty string.  I
2e8d0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
2e8e0 72 20 61 20 74 61 62 6c 65 20 74 6f 0a 20 20 20  r a table to.   
2e8f0 20 2a 2a 20 68 61 76 65 20 61 20 63 6f 6c 75 6d   ** have a colum
2e900 6e 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 65  n named by the e
2e910 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 69 6e 20  mpty string, in 
2e920 77 68 69 63 68 20 63 61 73 65 20 74 68 65 72 65  which case there
2e930 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 0a 20 20   is no way to.  
2e940 20 20 2a 2a 20 64 69 73 74 69 6e 67 75 69 73 68    ** distinguish
2e950 20 62 65 74 77 65 65 6e 20 61 6e 20 75 6e 72 65   between an unre
2e960 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20 61  ferenced table a
2e970 6e 64 20 61 6e 20 61 63 74 75 61 6c 20 72 65 66  nd an actual ref
2e980 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 20 20  erence to the.  
2e990 20 20 2a 2a 20 22 22 20 63 6f 6c 75 6d 6e 2e 20    ** "" column. 
2e9a0 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73  The original des
2e9b0 69 67 6e 20 77 61 73 20 66 6f 72 20 74 68 65 20  ign was for the 
2e9c0 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  fake column name
2e9d0 20 74 6f 20 62 65 20 61 20 4e 55 4c 4c 2c 0a 20   to be a NULL,. 
2e9e0 20 20 20 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c     ** which woul
2e9f0 64 20 62 65 20 75 6e 61 6d 62 69 67 75 6f 75 73  d be unambiguous
2ea00 2e 20 20 42 75 74 20 6c 65 67 61 63 79 20 61 75  .  But legacy au
2ea10 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c  thorization call
2ea20 62 61 63 6b 73 20 6d 69 67 68 74 0a 20 20 20 20  backs might.    
2ea30 2a 2a 20 61 73 73 75 6d 65 20 74 68 65 20 63 6f  ** assume the co
2ea40 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6e 6f 6e  lumn name is non
2ea50 2d 4e 55 4c 4c 20 61 6e 64 20 73 65 67 66 61 75  -NULL and segfau
2ea60 6c 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  lt.  The use of 
2ea70 61 6e 20 65 6d 70 74 79 0a 20 20 20 20 2a 2a 20  an empty.    ** 
2ea80 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 66  string for the f
2ea90 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ake column name 
2eaa0 73 65 65 6d 73 20 73 61 66 65 72 2e 0a 20 20 20  seems safer..   
2eab0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65   */.    if( pIte
2eac0 6d 2d 3e 63 6f 6c 55 73 65 64 3d 3d 30 20 29 7b  m->colUsed==0 ){
2ead0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75  .      sqlite3Au
2eae0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
2eaf0 53 51 4c 49 54 45 5f 52 45 41 44 2c 20 70 49 74  SQLITE_READ, pIt
2eb00 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 22 22 2c 20 70  em->zName, "", p
2eb10 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
2eb20 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65  ;.    }..#if !de
2eb30 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2eb40 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
2eb50 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2eb60 4d 49 54 5f 56 49 45 57 29 0a 20 20 20 20 2f 2a  MIT_VIEW).    /*
2eb70 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
2eb80 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69  or all sub-queri
2eb90 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
2eba0 6c 61 75 73 65 0a 20 20 20 20 2a 2f 0a 20 20 20  lause.    */.   
2ebb0 20 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70   pSub = pItem->p
2ebc0 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20  Select;.    if( 
2ebd0 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  pSub==0 ) contin
2ebe0 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d 65  ue;..    /* Some
2ebf0 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65 20 66  times the code f
2ec00 6f 72 20 61 20 73 75 62 71 75 65 72 79 20 77 69  or a subquery wi
2ec10 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  ll be generated 
2ec20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a  more than.    **
2ec30 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20 73 75   once, if the su
2ec40 62 71 75 65 72 79 20 69 73 20 70 61 72 74 20 6f  bquery is part o
2ec50 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2ec60 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f 49  se in a LEFT JOI
2ec70 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65 78  N,.    ** for ex
2ec80 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61 74 20  ample.  In that 
2ec90 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65 67  case, do not reg
2eca0 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
2ecb0 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20 20   to manifest.   
2ecc0 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20 74 68   ** a view or th
2ecd0 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20  e co-routine to 
2ece0 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69 65 77  implement a view
2ecf0 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 6e 73  .  The first ins
2ed00 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73 20  tance.    ** is 
2ed10 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68 6f 75  sufficient, thou
2ed20 67 68 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  gh the subroutin
2ed30 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20 74 68  e to manifest th
2ed40 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65 65 64  e view does need
2ed50 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e  .    ** to be in
2ed60 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a  voked again. */.
2ed70 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 61      if( pItem->a
2ed80 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20  ddrFillSub ){.  
2ed90 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
2eda0 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d  g.viaCoroutine==
2edb0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
2edc0 54 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  The subroutine t
2edd0 68 61 74 20 6d 61 6e 69 66 65 73 74 73 20 74 68  hat manifests th
2ede0 65 20 76 69 65 77 20 6d 69 67 68 74 20 62 65 20  e view might be 
2edf0 61 20 6f 6e 65 2d 74 69 6d 65 20 72 6f 75 74 69  a one-time routi
2ee00 6e 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ne,.        ** o
2ee10 72 20 69 74 20 6d 69 67 68 74 20 6e 65 65 64 20  r it might need 
2ee20 74 6f 20 62 65 20 72 65 72 75 6e 20 6f 6e 20 65  to be rerun on e
2ee30 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 62 65  ach iteration be
2ee40 63 61 75 73 65 20 69 74 0a 20 20 20 20 20 20 20  cause it.       
2ee50 20 2a 2a 20 65 6e 63 6f 64 65 73 20 61 20 63 6f   ** encodes a co
2ee60 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
2ee70 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 65  y. */.        te
2ee80 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 56  stcase( sqlite3V
2ee90 64 62 65 47 65 74 4f 70 28 76 2c 20 70 49 74 65  dbeGetOp(v, pIte
2eea0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 2d  m->addrFillSub)-
2eeb0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 6e 63 65  >opcode==OP_Once
2eec0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
2eed0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2eee0 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d   OP_Gosub, pItem
2eef0 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74  ->regReturn, pIt
2ef00 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29  em->addrFillSub)
2ef10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ef20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
2ef30 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
2ef40 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20  t Parse.nHeight 
2ef50 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66  by the height of
2ef60 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70   the largest exp
2ef70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74  ression.    ** t
2ef80 72 65 65 20 72 65 66 65 72 72 65 64 20 74 6f 20  ree referred to 
2ef90 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72  by this, the par
2efa0 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20  ent select. The 
2efb0 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20  child select.   
2efc0 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   ** may contain 
2efd0 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
2efe0 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20   of at most.    
2eff0 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ** (SQLITE_MAX_E
2f000 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e  XPR_DEPTH-Parse.
2f010 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e  nHeight) height.
2f020 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20   This is a bit. 
2f030 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65     ** more conse
2f040 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63  rvative than nec
2f050 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68  essary, but much
2f060 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66   easier than enf
2f070 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  orcing.    ** an
2f080 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20   exact limit..  
2f090 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d    */.    pParse-
2f0a0 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69  >nHeight += sqli
2f0b0 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
2f0c0 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  ght(p);..    /* 
2f0d0 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 63  Make copies of c
2f0e0 6f 6e 73 74 61 6e 74 20 57 48 45 52 45 2d 63 6c  onstant WHERE-cl
2f0f0 61 75 73 65 20 74 65 72 6d 73 20 69 6e 20 74 68  ause terms in th
2f100 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
2f110 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69 64 65  wn.    ** inside
2f120 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
2f130 54 68 69 73 20 63 61 6e 20 68 65 6c 70 20 74 68  This can help th
2f140 65 20 73 75 62 71 75 65 72 79 20 74 6f 20 72 75  e subquery to ru
2f150 6e 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  n more efficient
2f160 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ly..    */.    i
2f170 66 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f  f( (pItem->fg.jo
2f180 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
2f190 52 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 4f 70  R)==0.     && Op
2f1a0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
2f1b0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 50 75 73  d(db, SQLITE_Pus
2f1c0 68 44 6f 77 6e 29 0a 20 20 20 20 20 26 26 20 70  hDown).     && p
2f1d0 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d  ushDownWhereTerm
2f1e0 73 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20  s(pParse, pSub, 
2f1f0 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d  p->pWhere, pItem
2f200 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20 20 20 29  ->iCursor).    )
2f210 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  {.#if SELECTTRAC
2f220 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20  E_ENABLED.      
2f230 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
2f240 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
2f250 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  {.        SELECT
2f260 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
2f270 73 65 2c 70 2c 28 22 41 66 74 65 72 20 57 48 45  se,p,("After WHE
2f280 52 45 2d 63 6c 61 75 73 65 20 70 75 73 68 2d 64  RE-clause push-d
2f290 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20  own:\n"));.     
2f2a0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2f2b0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
2f2c0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
2f2d0 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
2f2e0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
2f2f0 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x100,pParse,p,("
2f300 50 75 73 68 2d 64 6f 77 6e 20 6e 6f 74 20 70 6f  Push-down not po
2f310 73 73 69 62 6c 65 5c 6e 22 29 29 3b 0a 20 20 20  ssible\n"));.   
2f320 20 7d 0a 0a 20 20 20 20 7a 53 61 76 65 64 41 75   }..    zSavedAu
2f330 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  thContext = pPar
2f340 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
2f350 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41  ;.    pParse->zA
2f360 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49 74  uthContext = pIt
2f370 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20  em->zName;..    
2f380 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
2f390 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
2f3a0 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a  e subquery.    *
2f3b0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 75 62  *.    ** The sub
2f3c0 71 75 65 72 79 20 69 73 20 69 6d 70 6c 65 6d 65  query is impleme
2f3d0 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75  nted as a co-rou
2f3e0 74 69 6e 65 20 69 66 20 74 68 65 20 73 75 62 71  tine if the subq
2f3f0 75 65 72 79 20 69 73 0a 20 20 20 20 2a 2a 20 67  uery is.    ** g
2f400 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
2f410 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 28  the outer loop (
2f420 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  so that it does 
2f430 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
2f440 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 6d     ** computed m
2f450 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a 20  ore than once). 
2f460 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f 44     **.    ** TOD
2f470 4f 3a 20 41 72 65 20 74 68 65 72 65 20 6f 74 68  O: Are there oth
2f480 65 72 20 72 65 61 73 6f 6e 73 20 62 65 73 69 64  er reasons besid
2f490 65 20 28 31 29 20 74 6f 20 75 73 65 20 61 20 63  e (1) to use a c
2f4a0 6f 2d 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  o-routine.    **
2f4b0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 3f   implementation?
2f4c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2f4d0 69 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  i==0.     && (pT
2f4e0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a  abList->nSrc==1.
2f4f0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
2f500 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66  pTabList->a[1].f
2f510 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c  g.jointype&(JT_L
2f520 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
2f530 30 29 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20  0)  /* (1) */.  
2f540 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d    ){.      /* Im
2f550 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75  plement a co-rou
2f560 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72  tine that will r
2f570 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72  eturn a single r
2f580 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
2f590 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e  .      ** set on
2f5a0 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e   each invocation
2f5b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2f5c0 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73   int addrTop = s
2f5d0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2f5e0 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20  tAddr(v)+1;.    
2f5f0 20 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72   .      pItem->r
2f600 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
2f610 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2f620 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f630 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
2f640 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72  outine, pItem->r
2f650 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64  egReturn, 0, add
2f660 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62  rTop);.      Vdb
2f670 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
2f680 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
2f690 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70  zName));.      p
2f6a0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2f6b0 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20  b = addrTop;.   
2f6c0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2f6d0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
2f6e0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70  SRT_Coroutine, p
2f6f0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
2f700 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
2f710 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
2f720 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
2f730 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
2f740 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
2f750 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
2f760 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
2f770 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
2f780 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
2f790 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52  = pSub->nSelectR
2f7a0 6f 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ow;.      pItem-
2f7b0 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
2f7c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65   = 1;.      pIte
2f7d0 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64  m->regResult = d
2f7e0 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20  est.iSdst;.     
2f7f0 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
2f800 6f 72 6f 75 74 69 6e 65 28 76 2c 20 70 49 74 65  oroutine(v, pIte
2f810 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
2f820 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f830 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
2f840 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  Top-1);.      sq
2f850 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65  lite3ClearTempRe
2f860 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a  gCache(pParse);.
2f870 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f880 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
2f890 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  ubroutine that w
2f8a0 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65  ill fill an ephe
2f8b0 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68  meral table with
2f8c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  .      ** the co
2f8d0 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75  ntent of this su
2f8e0 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e  bquery.  pItem->
2f8f0 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c  addrFillSub will
2f900 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20   point.      ** 
2f910 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  to the address o
2f920 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  f the generated 
2f930 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74  subroutine.  pIt
2f940 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20  em->regReturn.  
2f950 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69      ** is a regi
2f960 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74  ster allocated t
2f970 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f  o hold the subro
2f980 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64  utine return add
2f990 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ress.      */.  
2f9a0 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b      int topAddr;
2f9b0 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41  .      int onceA
2f9c0 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ddr = 0;.      i
2f9d0 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20  nt retAddr;.    
2f9e0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2f9f0 5f 69 74 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a  _item *pPrior;..
2fa00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
2fa10 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2fa20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74  ==0 );.      pIt
2fa30 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
2fa40 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2fa50 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20        topAddr = 
2fa60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2fa70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2fa80 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65   0, pItem->regRe
2fa90 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74  turn);.      pIt
2faa0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
2fab0 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20  = topAddr+1;.   
2fac0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
2fad0 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30  .isCorrelated==0
2fae0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
2faf0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
2fb00 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64  s not correlated
2fb10 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e   and if we are n
2fb20 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20  ot inside of.   
2fb30 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
2fb40 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20  r, then we only 
2fb50 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
2fb60 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2fb70 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20   subquery.      
2fb80 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20    ** once. */.  
2fb90 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d        onceAddr =
2fba0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2fbb0 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20  p0(v, OP_Once); 
2fbc0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2fbd0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
2fbe0 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69  ment((v, "materi
2fbf0 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70  alize \"%s\"", p
2fc00 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
2fc10 65 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  e));.      }else
2fc20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f  {.        VdbeNo
2fc30 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d  opComment((v, "m
2fc40 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c  aterialize \"%s\
2fc50 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  "", pItem->pTab-
2fc60 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
2fc70 7d 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d  }.      pPrior =
2fc80 20 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28   isSelfJoinView(
2fc90 70 54 61 62 4c 69 73 74 2c 20 70 49 74 65 6d 29  pTabList, pItem)
2fca0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
2fcb0 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  or ){.        sq
2fcc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2fcd0 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
2fce0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70  Item->iCursor, p
2fcf0 50 72 69 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b  Prior->iCursor);
2fd00 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e  .        explain
2fd10 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
2fd20 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 70 50 72  ->iSelectId, pPr
2fd30 69 6f 72 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b  ior->iSelectId);
2fd40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2fd50 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74   pPrior->pSelect
2fd60 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
2fd70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  Sub->nSelectRow 
2fd80 3d 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63  = pPrior->pSelec
2fd90 74 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  t->nSelectRow;. 
2fda0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2fdb0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
2fdc0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
2fdd0 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70   SRT_EphemTab, p
2fde0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
2fdf0 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53          explainS
2fe00 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
2fe10 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
2fe20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
2fe30 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 20 20  ectId);.        
2fe40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
2fe50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73  arse, pSub, &des
2fe60 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
2fe70 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e    pItem->pTab->n
2fe80 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62  RowLogEst = pSub
2fe90 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
2fea0 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72      if( onceAddr
2feb0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
2fec0 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64  mpHere(v, onceAd
2fed0 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64  dr);.      retAd
2fee0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
2fef0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
2ff00 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  urn, pItem->regR
2ff10 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64  eturn);.      Vd
2ff20 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
2ff30 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  nd %s", pItem->p
2ff40 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
2ff50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2ff60 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64  hangeP1(v, topAd
2ff70 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20  dr, retAddr);.  
2ff80 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
2ff90 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61  TempRegCache(pPa
2ffa0 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rse);.    }.    
2ffb0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2ffc0 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
2ffd0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61 72  ct_end;.    pPar
2ffe0 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73  se->nHeight -= s
2fff0 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
30000 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70  Height(p);.    p
30010 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
30020 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68  ext = zSavedAuth
30030 43 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a  Context;.#endif.
30040 20 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75    }..  /* Variou
30050 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  s elements of th
30060 65 20 53 45 4c 45 43 54 20 63 6f 70 69 65 64 20  e SELECT copied 
30070 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61  into local varia
30080 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f  bles for.  ** co
30090 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70  nvenience */.  p
300a0 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
300b0 74 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d  t;.  pWhere = p-
300c0 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75  >pWhere;.  pGrou
300d0 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
300e0 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70  y;.  pHaving = p
300f0 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69  ->pHaving;.  sDi
30100 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20  stinct.isTnct = 
30110 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
30120 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a  F_Distinct)!=0;.
30130 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
30140 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
30150 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
30160 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20  e & 0x400 ){.   
30170 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34   SELECTTRACE(0x4
30180 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
30190 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61  ter all FROM-cla
301a0 75 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22  use analysis:\n"
301b0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
301c0 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
301d0 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
301e0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
301f0 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50  E_COUNTOFVIEW_OP
30200 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  TIMIZATION.  if(
30210 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
30220 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
30230 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 7c 53  QueryFlattener|S
30240 51 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65  QLITE_CountOfVie
30250 77 29 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f 66  w).   && countOf
30260 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  ViewOptimization
30270 28 70 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b  (pParse, p).  ){
30280 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
30290 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
302a0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
302b0 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
302c0 69 73 74 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  ist;.    pTabLis
302d0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d  t = p->pSrc;.  }
302e0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
302f0 20 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49   the query is DI
30300 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f  STINCT with an O
30310 52 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e  RDER BY but is n
30320 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c  ot an aggregate,
30330 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68   and .  ** if th
30340 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73  e select-list is
30350 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
30360 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20   ORDER BY list, 
30370 74 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a  then this query.
30380 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72    ** can be rewr
30390 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50  itten as a GROUP
303a0 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f   BY. In other wo
303b0 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a  rds, this:.  **.
303c0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
303d0 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f  DISTINCT xyz FRO
303e0 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78  M ... ORDER BY x
303f0 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20  yz.  **.  ** is 
30400 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a  transformed to:.
30410 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
30420 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e  LECT xyz FROM ..
30430 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f  . GROUP BY xyz O
30440 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a  RDER BY xyz.  **
30450 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  .  ** The second
30460 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72   form is preferr
30470 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69  ed as a single i
30480 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61  ndex (or temp-ta
30490 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a  ble) may be .  *
304a0 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20  * used for both 
304b0 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64  the ORDER BY and
304c0 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
304d0 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61  sing. As origina
304e0 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65  lly .  ** writte
304f0 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74  n the query must
30500 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c   use a temp-tabl
30510 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f  e for at least o
30520 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ne of the ORDER 
30530 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53  .  ** BY and DIS
30540 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e  TINCT, and an in
30550 64 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20  dex or separate 
30560 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74  temp-table for t
30570 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20  he other..  */. 
30580 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
30590 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
305a0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
305b0 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20  =SF_Distinct .  
305c0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c   && sqlite3ExprL
305d0 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74  istCompare(sSort
305e0 2e 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73  .pOrderBy, pELis
305f0 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20  t, -1)==0.  ){. 
30600 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
30610 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
30620 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
30630 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
30640 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
30650 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a  db, pEList, 0);.
30660 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68      /* Notice th
30670 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20  at even thought 
30680 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20  SF_Distinct has 
30690 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f  been cleared fro
306a0 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20  m p->selFlags,. 
306b0 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69     ** the sDisti
306c0 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74  nct.isTnct is st
306d0 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c  ill set.  Hence,
306e0 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e   isTnct represen
306f0 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72  ts the.    ** or
30700 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f  iginal setting o
30710 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63  f the SF_Distinc
30720 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20  t flag, not the 
30730 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20  current setting 
30740 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
30750 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
30760 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52  );..#if SELECTTR
30770 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
30780 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
30790 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  tTrace & 0x400 )
307a0 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  {.      SELECTTR
307b0 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
307c0 2c 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20 44  ,p,("Transform D
307d0 49 53 54 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f  ISTINCT into GRO
307e0 55 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20  UP BY:\n"));.   
307f0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
30800 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
30810 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
30820 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
30830 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
30840 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63  Y clause, then c
30850 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72  reate an ephemer
30860 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a  al index to.  **
30870 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e   do the sorting.
30880 20 20 42 75 74 20 74 68 69 73 20 73 6f 72 74 69    But this sorti
30890 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  ng ephemeral ind
308a0 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a  ex might end up.
308b0 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65    ** being unuse
308c0 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61  d if the data ca
308d0 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20 69  n be extracted i
308e0 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64  n pre-sorted ord
308f0 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74  er..  ** If that
30900 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
30910 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  en the OP_OpenEp
30920 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
30930 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a  ion will be.  **
30940 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f   changed to an O
30950 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66  P_Noop once we f
30960 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74  igure out that t
30970 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
30980 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65   is.  ** not nee
30990 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e  ded.  The sSort.
309a0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61  addrSortIndex va
309b0 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
309c0 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a  o facilitate.  *
309d0 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20  * that change.. 
309e0 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e   */.  if( sSort.
309f0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
30a00 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
30a10 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  o;.    pKeyInfo 
30a20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
30a30 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73 53  rList(pParse, sS
30a40 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c  ort.pOrderBy, 0,
30a50 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
30a60 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72  .    sSort.iECur
30a70 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
30a80 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e  ab++;.    sSort.
30a90 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a  addrSortIndex =.
30aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30ab0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
30ac0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
30ad0 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43         sSort.iEC
30ae0 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72  ursor, sSort.pOr
30af0 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70  derBy->nExpr+1+p
30b00 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c  EList->nExpr, 0,
30b10 0a 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72  .          (char
30b20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
30b30 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a  EYINFO.      );.
30b40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f    }else{.    sSo
30b50 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
30b60 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
30b70 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
30b80 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
30b90 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
30ba0 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
30bb0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  e..  */.  if( pD
30bc0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
30bd0 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
30be0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30bf0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
30c00 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53  meral, pDest->iS
30c10 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e  DParm, pEList->n
30c20 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Expr);.  }..  /*
30c30 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
30c40 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20  ..  */.  iEnd = 
30c50 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
30c60 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 28  abel(v);.  if( (
30c70 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
30c80 5f 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20  _FixedLimit)==0 
30c90 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  ){.    p->nSelec
30ca0 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20  tRow = 320;  /* 
30cb0 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a  4 billion rows *
30cc0 2f 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c  /.  }.  computeL
30cd0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
30ce0 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a  arse, p, iEnd);.
30cf0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d    if( p->iLimit=
30d00 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72  =0 && sSort.addr
30d10 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a  SortIndex>=0 ){.
30d20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
30d30 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73  hangeOpcode(v, s
30d40 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
30d50 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  ex, OP_SorterOpe
30d60 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f  n);.    sSort.so
30d70 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46  rtFlags |= SORTF
30d80 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20  LAG_UseSorter;. 
30d90 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e   }..  /* Open an
30da0 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
30db0 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
30dc0 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
30dd0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
30de0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
30df0 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69  ct ){.    sDisti
30e00 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50  nct.tabTnct = pP
30e10 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
30e20 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72    sDistinct.addr
30e30 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Tnct = sqlite3Vd
30e40 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
30e50 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
30e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e70 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74             sDist
30e80 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c  inct.tabTnct, 0,
30e90 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
30ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30eb0 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46   (char*)keyInfoF
30ec0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
30ed0 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c  se, p->pEList,0,
30ee0 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
30ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f00 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
30f10 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
30f20 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55  ngeP5(v, BTREE_U
30f30 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73  NORDERED);.    s
30f40 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
30f50 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  pe = WHERE_DISTI
30f60 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20  NCT_UNORDERED;. 
30f70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73   }else{.    sDis
30f80 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
30f90 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
30fa0 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66  _NOOP;.  }..  if
30fb0 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f  ( !isAgg && pGro
30fc0 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  upBy==0 ){.    /
30fd0 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66  * No aggregate f
30fe0 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20  unctions and no 
30ff0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
31000 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c  */.    u16 wctrl
31010 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e  Flags = (sDistin
31020 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52  ct.isTnct ? WHER
31030 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
31040 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  : 0);.    assert
31050 28 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49  ( WHERE_USE_LIMI
31060 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69 74  T==SF_FixedLimit
31070 20 29 3b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61   );.    wctrlFla
31080 67 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  gs |= p->selFlag
31090 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69  s & SF_FixedLimi
310a0 74 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e  t;..    /* Begin
310b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
310c0 61 6e 2e 20 2a 2f 0a 20 20 20 20 53 45 4c 45 43  an. */.    SELEC
310d0 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
310e0 70 2c 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e  p,("WhereBegin\n
310f0 22 29 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20  "));.    pWInfo 
31100 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
31110 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
31120 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53  List, pWhere, sS
31130 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20  ort.pOrderBy,.  
31140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31150 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
31160 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61  pEList, wctrlFla
31170 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  gs, p->nSelectRo
31180 77 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  w);.    if( pWIn
31190 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
311a0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
311b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74   sqlite3WhereOut
311c0 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e  putRowCount(pWIn
311d0 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74  fo) < p->nSelect
311e0 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Row ){.      p->
311f0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
31200 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52  ite3WhereOutputR
31210 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b  owCount(pWInfo);
31220 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
31230 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
31240 26 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  && sqlite3WhereI
31250 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f  sDistinct(pWInfo
31260 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74  ) ){.      sDist
31270 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
31280 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
31290 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b  istinct(pWInfo);
312a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
312b0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
312c0 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42  .      sSort.nOB
312d0 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65  Sat = sqlite3Whe
312e0 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
312f0 66 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f 72 74  fo);.      sSort
31300 2e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  .bOrderedInnerLo
31310 6f 70 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  op = sqlite3Wher
31320 65 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f  eOrderedInnerLoo
31330 70 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  p(pWInfo);.     
31340 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61   if( sSort.nOBSa
31350 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  t==sSort.pOrderB
31360 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
31370 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72      sSort.pOrder
31380 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  By = 0;.      }.
31390 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
313a0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
313b0 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20  hat was created 
313c0 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70  by a prior OP_Op
313d0 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20  enEphemeral .   
313e0 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
313f0 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69  ended up not bei
31400 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  ng needed, then 
31410 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  change the OP_Op
31420 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20  enEphemeral.    
31430 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f  ** into an OP_No
31440 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  op..    */.    i
31450 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  f( sSort.addrSor
31460 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73 53 6f  tIndex>=0 && sSo
31470 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  rt.pOrderBy==0 )
31480 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
31490 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
314a0 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  v, sSort.addrSor
314b0 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a  tIndex);.    }..
314c0 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73      /* Use the s
314d0 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
314e0 6f 70 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  op. */.    asser
314f0 74 28 20 70 2d 3e 70 45 4c 69 73 74 3d 3d 70 45  t( p->pEList==pE
31500 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 65 6c 65  List );.    sele
31510 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
31520 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72  se, p, -1, &sSor
31530 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70  t, &sDistinct, p
31540 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
31550 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31560 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61  3WhereContinueLa
31570 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20  bel(pWInfo),.   
31580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31590 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
315a0 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29  akLabel(pWInfo))
315b0 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68  ;..    /* End th
315c0 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
315d0 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
315e0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
315f0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  (pWInfo);.  }els
31600 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  e{.    /* This c
31610 61 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65  ase when there e
31620 78 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66  xist aggregate f
31630 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52  unctions or a GR
31640 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20  OUP BY clause.  
31650 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a    ** or both */.
31660 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
31670 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  sNC;    /* Name 
31680 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63  context for proc
31690 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
316a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
316b0 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20      int iAMem;  
316c0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
316d0 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
316e0 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74   storing current
316f0 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
31700 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20   int iBMem;     
31710 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
31720 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72  m address for pr
31730 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20  evious GROUP BY 
31740 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46  */.    int iUseF
31750 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  lag;       /* Me
31760 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e  m address holdin
31770 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e  g flag indicatin
31780 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a  g that at least.
31790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317a0 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72          ** one r
317b0 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ow of the input 
317c0 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  to the aggregato
317d0 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  r has been.     
317e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317f0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
31800 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72  */.    int iAbor
31810 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65  tFlag;     /* Me
31820 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20  m address which 
31830 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f  causes query abo
31840 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  rt if positive *
31850 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42  /.    int groupB
31860 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77  ySort;    /* Row
31870 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72  s come from sour
31880 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ce in GROUP BY o
31890 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rder */.    int 
318a0 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20  addrEnd;        
318b0 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73  /* End of proces
318c0 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45  sing for this SE
318d0 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20  LECT */.    int 
318e0 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20  sortPTab = 0;   
318f0 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75  /* Pseudotable u
31900 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f  sed to decode so
31910 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  rting results */
31920 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74  .    int sortOut
31930 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70   = 0;    /* Outp
31940 75 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d  ut register from
31950 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20   the sorter */. 
31960 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72     int orderByGr
31970 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69  p = 0; /* True i
31980 66 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  f the GROUP BY a
31990 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72 65 20  nd ORDER BY are 
319a0 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20  the same */..   
319b0 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61   /* Remove any a
319c0 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62  nd all aliases b
319d0 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c  etween the resul
319e0 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20  t set and the.  
319f0 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c    ** GROUP BY cl
31a00 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ause..    */.   
31a10 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
31a20 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20  .      int k;   
31a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a40 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
31a50 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74  nter */.      st
31a60 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
31a70 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46  em *pItem;  /* F
31a80 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
31a90 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20  expression in a 
31aa0 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66  list */..      f
31ab0 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  or(k=p->pEList->
31ac0 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e  nExpr, pItem=p->
31ad0 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20  pEList->a; k>0; 
31ae0 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
31af0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
31b00 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  x.iAlias = 0;.  
31b10 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
31b20 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  k=pGroupBy->nExp
31b30 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42  r, pItem=pGroupB
31b40 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  y->a; k>0; k--, 
31b50 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
31b60 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
31b70 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
31b80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 36  .      assert( 6
31b90 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
31ba0 28 31 30 30 29 20 29 3b 0a 20 20 20 20 20 20 69  (100) );.      i
31bb0 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
31bc0 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  >66 ) p->nSelect
31bd0 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20 20 7d 65  Row = 66;.    }e
31be0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
31bf0 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  t( 0==sqlite3Log
31c00 45 73 74 28 31 29 20 29 3b 0a 20 20 20 20 20 20  Est(1) );.      
31c10 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
31c20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
31c30 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74   If there is bot
31c40 68 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64  h a GROUP BY and
31c50 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
31c60 75 73 65 20 61 6e 64 20 74 68 65 79 20 61 72 65  use and they are
31c70 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 63 61  .    ** identica
31c80 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62  l, then it may b
31c90 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 69  e possible to di
31ca0 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20  sable the ORDER 
31cb0 42 59 20 63 6c 61 75 73 65 20 0a 20 20 20 20 2a  BY clause .    *
31cc0 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64 73  * on the grounds
31cd0 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50 20   that the GROUP 
31ce0 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c  BY will cause el
31cf0 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f  ements to come o
31d00 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ut .    ** in th
31d10 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e  e correct order.
31d20 20 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74   It also may not
31d30 20 2d 20 74 68 65 20 47 52 4f 55 50 20 42 59 20   - the GROUP BY 
31d40 6d 69 67 68 74 20 75 73 65 20 61 0a 20 20 20 20  might use a.    
31d50 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  ** database inde
31d60 78 20 74 68 61 74 20 63 61 75 73 65 73 20 72 6f  x that causes ro
31d70 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70 65 64  ws to be grouped
31d80 20 74 6f 67 65 74 68 65 72 20 61 73 20 72 65 71   together as req
31d90 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62 75 74  uired.    ** but
31da0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 73 6f   not actually so
31db0 72 74 65 64 2e 20 45 69 74 68 65 72 20 77 61 79  rted. Either way
31dc0 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  , record the fac
31dd0 74 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  t that the.    *
31de0 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47  * ORDER BY and G
31df0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 73 20  ROUP BY clauses 
31e00 61 72 65 20 74 68 65 20 73 61 6d 65 20 62 79 20  are the same by 
31e10 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72 64 65  setting the orde
31e20 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20 76 61  rByGrp.    ** va
31e30 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  riable.  */.    
31e40 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
31e50 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72 6f 75  istCompare(pGrou
31e60 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  pBy, sSort.pOrde
31e70 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  rBy, -1)==0 ){. 
31e80 20 20 20 20 20 6f 72 64 65 72 42 79 47 72 70 20       orderByGrp 
31e90 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20  = 1;.    }. .   
31ea0 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62   /* Create a lab
31eb0 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68  el to jump to wh
31ec0 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62  en we want to ab
31ed0 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f  ort the query */
31ee0 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73  .    addrEnd = s
31ef0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
31f00 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  bel(v);..    /* 
31f10 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d  Convert TK_COLUM
31f20 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f  N nodes into TK_
31f30 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d  AGG_COLUMN and m
31f40 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  ake entries in. 
31f50 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66     ** sAggInfo f
31f60 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55  or all TK_AGG_FU
31f70 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20  NCTION nodes in 
31f80 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
31f90 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  he.    ** SELECT
31fa0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
31fb0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
31fc0 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
31fd0 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61  C));.    sNC.pPa
31fe0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
31ff0 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
32000 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73   pTabList;.    s
32010 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73  NC.pAggInfo = &s
32020 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67  AggInfo;.    sAg
32030 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50  gInfo.mnReg = pP
32040 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
32050 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
32060 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f  ingColumn = pGro
32070 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d  upBy ? pGroupBy-
32080 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20  >nExpr : 0;.    
32090 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42  sAggInfo.pGroupB
320a0 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
320b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
320c0 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
320d0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
320e0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
320f0 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73  eAggList(&sNC, s
32100 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a  Sort.pOrderBy);.
32110 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
32120 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 47 72  ){.      if( pGr
32130 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20  oupBy ){.       
32140 20 61 73 73 65 72 74 28 20 70 57 68 65 72 65 3d   assert( pWhere=
32150 3d 70 2d 3e 70 57 68 65 72 65 20 29 3b 0a 20 20  =p->pWhere );.  
32160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48        assert( pH
32170 61 76 69 6e 67 3d 3d 70 2d 3e 70 48 61 76 69 6e  aving==p->pHavin
32180 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  g );.        ass
32190 65 72 74 28 20 70 47 72 6f 75 70 42 79 3d 3d 70  ert( pGroupBy==p
321a0 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20  ->pGroupBy );.  
321b0 20 20 20 20 20 20 68 61 76 69 6e 67 54 6f 57 68        havingToWh
321c0 65 72 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ere(pParse, p);.
321d0 20 20 20 20 20 20 20 20 70 57 68 65 72 65 20 3d          pWhere =
321e0 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20   p->pWhere;.    
321f0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
32200 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
32210 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61  egates(&sNC, pHa
32220 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ving);.    }.   
32230 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d   sAggInfo.nAccum
32240 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66  ulator = sAggInf
32250 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69  o.nColumn;.    i
32260 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  f( p->pGroupBy==
32270 30 20 26 26 20 70 2d 3e 70 48 61 76 69 6e 67 3d  0 && p->pHaving=
32280 3d 30 20 26 26 20 73 41 67 67 49 6e 66 6f 2e 6e  =0 && sAggInfo.n
32290 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20  Func==1 ){.     
322a0 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20 6d 69   minMaxFlag = mi
322b0 6e 4d 61 78 51 75 65 72 79 28 64 62 2c 20 73 41  nMaxQuery(db, sA
322c0 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e  ggInfo.aFunc[0].
322d0 70 45 78 70 72 2c 20 26 70 4d 69 6e 4d 61 78 4f  pExpr, &pMinMaxO
322e0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 65 6c  rderBy);.    }el
322f0 73 65 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78  se{.      minMax
32300 46 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44  Flag = WHERE_ORD
32310 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  ERBY_NORMAL;.   
32320 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
32330 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63  i<sAggInfo.nFunc
32340 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
32350 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
32360 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e  operty(sAggInfo.
32370 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20  aFunc[i].pExpr, 
32380 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
32390 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
323a0 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75  gs |= NC_InAggFu
323b0 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
323c0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
323d0 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e  ist(&sNC, sAggIn
323e0 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
323f0 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
32400 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26     sNC.ncFlags &
32410 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b  = ~NC_InAggFunc;
32420 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
32430 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72  nfo.mxReg = pPar
32440 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66  se->nMem;.    if
32450 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
32460 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
32470 5f 65 6e 64 3b 0a 23 69 66 20 53 45 4c 45 43 54  _end;.#if SELECT
32480 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
32490 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
324a0 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
324b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
324c0 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  ;.      SELECTTR
324d0 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
324e0 2c 70 2c 28 22 41 66 74 65 72 20 61 67 67 72 65  ,p,("After aggre
324f0 67 61 74 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e  gate analysis:\n
32500 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
32510 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
32520 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20  (0, p, 0);.     
32530 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41   for(ii=0; ii<sA
32540 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
32550 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73  ii++){.        s
32560 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
32570 66 28 22 61 67 67 2d 63 6f 6c 75 6d 6e 5b 25 64  f("agg-column[%d
32580 5d 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20  ] iMem=%d\n",.  
32590 20 20 20 20 20 20 20 20 20 20 69 69 2c 20 73 41            ii, sA
325a0 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e  ggInfo.aCol[ii].
325b0 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  iMem);.        s
325c0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
325d0 70 72 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61  pr(0, sAggInfo.a
325e0 43 6f 6c 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30  Col[ii].pExpr, 0
325f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
32600 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41   for(ii=0; ii<sA
32610 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 69  ggInfo.nFunc; ii
32620 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
32630 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
32640 22 61 67 67 2d 66 75 6e 63 5b 25 64 5d 3a 20 69  "agg-func[%d]: i
32650 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  Mem=%d\n",.     
32660 20 20 20 20 20 20 20 69 69 2c 20 73 41 67 67 49         ii, sAggI
32670 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 69 4d  nfo.aFunc[ii].iM
32680 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
32690 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
326a0 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  (0, sAggInfo.aFu
326b0 6e 63 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 29  nc[ii].pExpr, 0)
326c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
326d0 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20 2f 2a 20  #endif...    /* 
326e0 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  Processing for a
326f0 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47  ggregates with G
32700 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20  ROUP BY is very 
32710 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20  different and.  
32720 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63    ** much more c
32730 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72  omplex than aggr
32740 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61  egates without a
32750 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a   GROUP BY..    *
32760 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
32770 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49  By ){.      KeyI
32780 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
32790 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d  /* Keying inform
327a0 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72  ation for the gr
327b0 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  oup by clause */
327c0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31  .      int addr1
327d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d  ;          /* A-
327e0 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e  vs-B comparision
327f0 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69   jump */.      i
32800 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  nt addrOutputRow
32810 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73  ;  /* Start of s
32820 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
32830 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20  utputs a result 
32840 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  row */.      int
32850 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20   regOutputRow;  
32860 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
32870 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
32880 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
32890 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
328a0 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f  ddrSetAbort;   /
328b0 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20  * Set the abort 
328c0 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20  flag and return 
328d0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
328e0 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20  rTopOfLoop;  /* 
328f0 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74  Top of the input
32900 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69   loop */.      i
32910 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  nt addrSortingId
32920 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65  x; /* The OP_Ope
32930 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74  nEphemeral for t
32940 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
32950 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
32960 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  drReset;      /*
32970 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   Subroutine for 
32980 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63  resetting the ac
32990 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20  cumulator */.   
329a0 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b     int regReset;
329b0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
329c0 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
329d0 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72  r for reset subr
329e0 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20  outine */..     
329f0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
32a00 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
32a10 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20  e we might need 
32a20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
32a30 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  to.      ** impl
32a40 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63  ement it.  Alloc
32a50 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67  ate that sorting
32a60 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20   index now.  If 
32a70 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20  it turns out.   
32a80 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
32a90 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74   not need it aft
32aa0 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53  er all, the OP_S
32ab0 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75  orterOpen instru
32ac0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77  ction.      ** w
32ad0 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
32ae0 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a   into a Noop.  .
32af0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
32b00 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
32b10 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
32b20 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  b++;.      pKeyI
32b30 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
32b40 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
32b50 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 73  , pGroupBy, 0, s
32b60 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29  AggInfo.nColumn)
32b70 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74  ;.      addrSort
32b80 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33  ingIdx = sqlite3
32b90 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
32ba0 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20  _SorterOpen, .  
32bb0 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
32bc0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67  .sortingIdx, sAg
32bd0 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
32be0 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  lumn, .         
32bf0 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49   0, (char*)pKeyI
32c00 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
32c10 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74  ;..      /* Init
32c20 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f  ialize memory lo
32c30 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20  cations used by 
32c40 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61  GROUP BY aggrega
32c50 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20  te processing.  
32c60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73      */.      iUs
32c70 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  eFlag = ++pParse
32c80 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41  ->nMem;.      iA
32c90 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61  bortFlag = ++pPa
32ca0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
32cb0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20   regOutputRow = 
32cc0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
32cd0 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
32ce0 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
32cf0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
32d00 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20       regReset = 
32d10 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
32d20 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20        addrReset 
32d30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
32d40 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
32d50 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iAMem = pParse-
32d60 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
32d70 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
32d80 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
32d90 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20  ;.      iBMem = 
32da0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
32db0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
32dc0 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
32dd0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->nExpr;.      s
32de0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
32df0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
32e00 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  0, iAbortFlag);.
32e10 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
32e20 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f  t((v, "clear abo
32e30 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
32e40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
32e50 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
32e60 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b  r, 0, iUseFlag);
32e70 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
32e80 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65  nt((v, "indicate
32e90 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70   accumulator emp
32ea0 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ty"));.      sql
32eb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
32ec0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41  , OP_Null, 0, iA
32ed0 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75  Mem, iAMem+pGrou
32ee0 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a  pBy->nExpr-1);..
32ef0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61        /* Begin a
32f00 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
32f10 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72  extract all sour
32f20 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50  ce rows in GROUP
32f30 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20   BY order..     
32f40 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69   ** This might i
32f50 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72  nvolve two separ
32f60 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61  ate loops with a
32f70 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74  n OP_Sort in bet
32f80 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a  ween, or.      *
32f90 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20  * it might be a 
32fa0 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74  single loop that
32fb0 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74   uses an index t
32fc0 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d  o extract inform
32fd0 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ation.      ** i
32fe0 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65  n the right orde
32ff0 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e  r to begin with.
33000 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
33010 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
33020 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
33030 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
33040 65 74 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  et);.      SELEC
33050 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
33060 70 2c 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e  p,("WhereBegin\n
33070 22 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  "));.      pWInf
33080 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
33090 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
330a0 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
330b0 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20  pGroupBy, 0,.   
330c0 20 20 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f         WHERE_GRO
330d0 55 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47  UPBY | (orderByG
330e0 72 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42  rp ? WHERE_SORTB
330f0 59 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20  YGROUP : 0), 0. 
33100 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
33110 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
33120 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
33130 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
33140 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
33150 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79  WInfo)==pGroupBy
33160 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
33170 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69     /* The optimi
33180 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64  zer is able to d
33190 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67  eliver rows in g
331a0 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f  roup by order so
331b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64  .        ** we d
331c0 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f  o not have to so
331d0 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e  rt.  The OP_Open
331e0 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  Ephemeral table 
331f0 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
33200 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74  ** cancelled lat
33210 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74  er because we st
33220 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20  ill need to use 
33230 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20  the pKeyInfo.   
33240 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
33250 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b  groupBySort = 0;
33260 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
33270 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72        /* Rows ar
33280 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20  e coming out in 
33290 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64  undetermined ord
332a0 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  er.  We have to 
332b0 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  push.        ** 
332c0 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20  each row into a 
332d0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74  sorting index, t
332e0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72  erminate the fir
332f0 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  st loop,.       
33300 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76   ** then loop ov
33310 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  er the sorting i
33320 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f  ndex in order to
33330 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a   get the output.
33340 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f          ** in so
33350 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20  rted order.     
33360 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
33370 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20  t regBase;.     
33380 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64     int regRecord
33390 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  ;.        int nC
333a0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ol;.        int 
333b0 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20  nGroupBy;..     
333c0 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61     explainTempTa
333d0 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  ble(pParse, .   
333e0 20 20 20 20 20 20 20 20 20 28 73 44 69 73 74 69           (sDisti
333f0 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70  nct.isTnct && (p
33400 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69  ->selFlags&SF_Di
33410 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20  stinct)==0) ?.  
33420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33430 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22    "DISTINCT" : "
33440 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20  GROUP BY");..   
33450 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
33460 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47   = 1;.        nG
33470 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
33480 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
33490 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42    nCol = nGroupB
334a0 79 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e  y;.        j = n
334b0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
334c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
334d0 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
334e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
334f0 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b  ( sAggInfo.aCol[
33500 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  i].iSorterColumn
33510 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=j ){.         
33520 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20     nCol++;.     
33530 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
33540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33550 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73  }.        regBas
33560 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  e = sqlite3GetTe
33570 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
33580 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
33590 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
335a0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
335b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
335c0 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
335d0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  arse, pGroupBy, 
335e0 72 65 67 42 61 73 65 2c 20 30 2c 20 30 29 3b 0a  regBase, 0, 0);.
335f0 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
33600 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f  upBy;.        fo
33610 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
33620 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
33630 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
33640 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
33650 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e  Col = &sAggInfo.
33660 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  aCol[i];.       
33670 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
33680 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
33690 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
336a0 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73   r1 = j + regBas
336b0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e;.            s
336c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
336d0 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 70 50 61  tColumnToReg(pPa
336e0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
336f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33700 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c       pCol->pTab,
33710 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20   pCol->iColumn, 
33720 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31  pCol->iTable, r1
33730 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
33740 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
33750 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33760 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
33770 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
33780 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
33790 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
337a0 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
337b0 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  ord, regBase, nC
337c0 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ol, regRecord);.
337d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
337e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
337f0 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41  SorterInsert, sA
33800 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
33810 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  x, regRecord);. 
33820 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
33830 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
33840 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
33850 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
33860 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
33870 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
33880 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
33890 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
338a0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
338b0 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
338c0 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74  ngIdxPTab = sort
338d0 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  PTab = pParse->n
338e0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73  Tab++;.        s
338f0 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ortOut = sqlite3
33900 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
33910 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
33920 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
33930 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
33940 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75  sortPTab, sortOu
33950 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, nCol);.      
33960 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
33970 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
33980 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Sort, sAggInfo.s
33990 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45  ortingIdx, addrE
339a0 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  nd);.        Vdb
339b0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52  eComment((v, "GR
339c0 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 20  OUP BY sort")); 
339d0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
339e0 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
339f0 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20  o.useSortingIdx 
33a00 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 1;.        sql
33a10 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
33a20 61 72 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20  ar(pParse);..   
33a30 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
33a40 66 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20 74  f the index or t
33a50 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 75  emporary table u
33a60 73 65 64 20 62 79 20 74 68 65 20 47 52 4f 55 50  sed by the GROUP
33a70 20 42 59 20 73 6f 72 74 0a 20 20 20 20 20 20 2a   BY sort.      *
33a80 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79  * will naturally
33a90 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e   deliver rows in
33aa0 20 74 68 65 20 6f 72 64 65 72 20 72 65 71 75 69   the order requi
33ab0 72 65 64 20 62 79 20 74 68 65 20 4f 52 44 45 52  red by the ORDER
33ac0 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61   BY.      ** cla
33ad0 75 73 65 2c 20 63 61 6e 63 65 6c 20 74 68 65 20  use, cancel the 
33ae0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
33af0 6f 70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c 69  open coded earli
33b00 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  er..      **.   
33b10 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 6e     ** This is an
33b20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20   optimization - 
33b30 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
33b40 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74  er should result
33b50 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20   regardless..   
33b60 20 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51     ** Use the SQ
33b70 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65  LITE_GroupByOrde
33b80 72 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49  r flag with SQLI
33b90 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
33ba0 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20 20 20 20  MIZER to .      
33bb0 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 69 73 20  ** disable this 
33bc0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
33bd0 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
33be0 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  s.  */.      if(
33bf0 20 6f 72 64 65 72 42 79 47 72 70 20 26 26 20 4f   orderByGrp && O
33c00 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
33c10 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72  ed(db, SQLITE_Gr
33c20 6f 75 70 42 79 4f 72 64 65 72 29 20 0a 20 20 20  oupByOrder) .   
33c30 20 20 20 20 26 26 20 28 67 72 6f 75 70 42 79 53      && (groupByS
33c40 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65 33 57 68  ort || sqlite3Wh
33c50 65 72 65 49 73 53 6f 72 74 65 64 28 70 57 49 6e  ereIsSorted(pWIn
33c60 66 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  fo)).      ){.  
33c70 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
33c80 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
33c90 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
33ca0 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f  ngeToNoop(v, sSo
33cb0 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
33cc0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
33cd0 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
33ce0 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
33cf0 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f  BY terms and sto
33d00 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32  re in b0, b1, b2
33d10 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30  ....      ** (b0
33d20 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74   is memory locat
33d30 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20  ion iBMem+0, b1 
33d40 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20  is iBMem+1, and 
33d50 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20  so forth).      
33d60 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20  ** Then compare 
33d70 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
33d80 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e  P BY terms again
33d90 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  st the GROUP BY 
33da0 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66  terms.      ** f
33db0 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
33dc0 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73   row currently s
33dd0 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c  tored in a0, a1,
33de0 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a   a2....      */.
33df0 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c        addrTopOfL
33e00 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
33e10 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
33e20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
33e30 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
33e40 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rse);.      if( 
33e50 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
33e60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
33e70 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
33e80 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67 67 49  orterData, sAggI
33e90 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a  nfo.sortingIdx,.
33ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33eb0 20 20 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75            sortOu
33ec0 74 2c 20 73 6f 72 74 50 54 61 62 29 3b 0a 20 20  t, sortPTab);.  
33ed0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
33ee0 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d  j=0; j<pGroupBy-
33ef0 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
33f00 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
33f10 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
33f20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
33f30 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
33f40 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20  n, sortPTab, j, 
33f50 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20  iBMem+j);.      
33f60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
33f70 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65     sAggInfo.dire
33f80 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20  ctMode = 1;.    
33f90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
33fa0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47  rCode(pParse, pG
33fb0 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78  roupBy->a[j].pEx
33fc0 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20  pr, iBMem+j);.  
33fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33fe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
33ff0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
34000 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42  mpare, iAMem, iB
34010 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  Mem, pGroupBy->n
34020 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
34030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34040 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65  (char*)sqlite3Ke
34050 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66  yInfoRef(pKeyInf
34060 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  o), P4_KEYINFO);
34070 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73  .      addr1 = s
34080 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
34090 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
340a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
340b0 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
340c0 64 72 31 2b 31 2c 20 30 2c 20 61 64 64 72 31 2b  dr1+1, 0, addr1+
340d0 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
340e0 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  (v);..      /* G
340f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
34100 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20  t runs whenever 
34110 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 68 61  the GROUP BY cha
34120 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43  nges..      ** C
34130 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52  hanges in the GR
34140 4f 55 50 20 42 59 20 61 72 65 20 64 65 74 65 63  OUP BY are detec
34150 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69  ted by the previ
34160 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a  ous code.      *
34170 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65  * block.  If the
34180 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67  re were no chang
34190 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69  es, this block i
341a0 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20  s skipped..     
341b0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69   **.      ** Thi
341c0 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75  s code copies cu
341d0 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74  rrent group by t
341e0 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32  erms in b0,b1,b2
341f0 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76  ,....      ** ov
34200 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20  er to a0,a1,a2. 
34210 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74   It then calls t
34220 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  he output subrou
34230 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e  tine.      ** an
34240 64 20 72 65 73 65 74 73 20 74 68 65 20 61 67 67  d resets the agg
34250 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
34260 6f 72 20 72 65 67 69 73 74 65 72 73 20 69 6e 20  or registers in 
34270 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20  preparation.    
34280 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78    ** for the nex
34290 74 20 47 52 4f 55 50 20 42 59 20 62 61 74 63 68  t GROUP BY batch
342a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
342b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
342c0 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d  Move(pParse, iBM
342d0 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75  em, iAMem, pGrou
342e0 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  pBy->nExpr);.   
342f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34300 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
34310 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20  , regOutputRow, 
34320 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
34330 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
34340 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e  t((v, "output on
34350 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20  e row"));.      
34360 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34370 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  2(v, OP_IfPos, i
34380 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45  AbortFlag, addrE
34390 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  nd); VdbeCoverag
343a0 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
343b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65  Comment((v, "che
343c0 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  ck abort flag"))
343d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
343e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
343f0 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c  Gosub, regReset,
34400 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20   addrReset);.   
34410 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
34420 76 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d 75  v, "reset accumu
34430 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  lator"));..     
34440 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
34450 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
34460 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74  ators based on t
34470 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20  he content of.  
34480 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
34490 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a  nt row.      */.
344a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
344b0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
344c0 72 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74  r1);.      updat
344d0 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
344e0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
344f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
34500 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
34510 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46  nteger, 1, iUseF
34520 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
34530 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
34540 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63  icate data in ac
34550 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
34560 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74       /* End of t
34570 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f  he loop.      */
34580 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70  .      if( group
34590 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
345a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
345b0 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
345c0 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Next, sAggInfo.s
345d0 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54  ortingIdx, addrT
345e0 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  opOfLoop);.     
345f0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
34600 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
34610 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34620 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
34630 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
34640 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
34650 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67  p(v, addrSorting
34660 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Idx);.      }.. 
34670 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74       /* Output t
34680 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20  he final row of 
34690 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a  result.      */.
346a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
346b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
346c0 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  sub, regOutputRo
346d0 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  w, addrOutputRow
346e0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
346f0 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
34700 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a   final row"));..
34710 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76        /* Jump ov
34720 65 72 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  er the subroutin
34730 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  es.      */.    
34740 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
34750 6f 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a  o(v, addrEnd);..
34760 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
34770 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
34780 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69  hat outputs a si
34790 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
347a0 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
347b0 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f  set.  This subro
347c0 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b  utine first look
347d0 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61  s at the iUseFla
347e0 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a  g.  If iUseFlag.
347f0 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73        ** is less
34800 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
34810 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72  o zero, the subr
34820 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
34830 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20  p.  If.      ** 
34840 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63  the processing c
34850 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65  alls for the que
34860 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69  ry to abort, thi
34870 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  s subroutine.   
34880 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73     ** increments
34890 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20   the iAbortFlag 
348a0 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
348b0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
348c0 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64   in.      ** ord
348d0 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65  er to signal the
348e0 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74   caller to abort
348f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
34900 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20   addrSetAbort = 
34910 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
34920 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
34930 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34940 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
34950 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29  , 1, iAbortFlag)
34960 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
34970 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f  ent((v, "set abo
34980 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
34990 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
349a0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
349b0 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
349c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
349d0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
349e0 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
349f0 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70  ;.      addrOutp
34a00 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  utRow = sqlite3V
34a10 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
34a20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
34a30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
34a40 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67  _IfPos, iUseFlag
34a50 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
34a60 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  2);.      VdbeCo
34a70 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
34a80 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
34a90 20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74   "Groupby result
34aa0 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79   generator entry
34ab0 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20   point"));.     
34ac0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34ad0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
34ae0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
34af0 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
34b00 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
34b10 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
34b20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
34b30 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
34b40 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74  pHaving, addrOut
34b50 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45  putRow+1, SQLITE
34b60 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
34b70 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
34b80 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d  oop(pParse, p, -
34b90 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20 20 20  1, &sSort,.     
34ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34bb0 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65   &sDistinct, pDe
34bc0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
34bd0 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75            addrOu
34be0 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53  tputRow+1, addrS
34bf0 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20  etAbort);.      
34c00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34c10 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
34c20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
34c30 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
34c40 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62  ((v, "end groupb
34c50 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
34c60 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
34c70 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
34c80 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
34c90 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70   reset the group
34ca0 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a  -by accumulator.
34cb0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
34cc0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
34cd0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65  eLabel(v, addrRe
34ce0 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65  set);.      rese
34cf0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
34d00 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
34d10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
34d20 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
34d30 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29  eturn, regReset)
34d40 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a  ;.     .    } /*
34d50 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e   endif pGroupBy.
34d60 20 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74    Begin aggregat
34d70 65 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75  e queries withou
34d80 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20  t GROUP BY: */. 
34d90 20 20 20 65 6c 73 65 20 7b 0a 23 69 66 6e 64 65     else {.#ifnde
34da0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54  f SQLITE_OMIT_BT
34db0 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54  REECOUNT.      T
34dc0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
34dd0 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 69 73    if( (pTab = is
34de0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26  SimpleCount(p, &
34df0 73 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b  sAggInfo))!=0 ){
34e00 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69  .        /* If i
34e10 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72  sSimpleCount() r
34e20 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
34e30 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75   to a Table stru
34e40 63 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20  cture, then.    
34e50 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73      ** the SQL s
34e60 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74  tatement is of t
34e70 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20  he form:.       
34e80 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
34e90 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
34ea0 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20   FROM <tbl>.    
34eb0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
34ec0 2a 20 77 68 65 72 65 20 74 68 65 20 54 61 62 6c  * where the Tabl
34ed0 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75  e structure retu
34ee0 72 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73 20  rned represents 
34ef0 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20  table <tbl>..   
34f00 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
34f10 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  ** This statemen
34f20 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74  t is so common t
34f30 68 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69  hat it is optimi
34f40 7a 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54  zed specially. T
34f50 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50  he.        ** OP
34f60 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69  _Count instructi
34f70 6f 6e 20 69 73 20 65 78 65 63 75 74 65 64 20 65  on is executed e
34f80 69 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74  ither on the int
34f90 6b 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20  key table that. 
34fa0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
34fb0 6e 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  ns the data for 
34fc0 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f  table <tbl> or o
34fd0 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64  n one of its ind
34fe0 65 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20  exes. It.       
34ff0 20 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f   ** is better to
35000 20 65 78 65 63 75 74 65 20 74 68 65 20 6f 70 20   execute the op 
35010 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20  on an index, as 
35020 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f  indexes are almo
35030 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  st.        ** al
35040 77 61 79 73 20 73 70 72 65 61 64 20 61 63 72 6f  ways spread acro
35050 73 73 20 6c 65 73 73 20 70 61 67 65 73 20 74 68  ss less pages th
35060 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73 70  an their corresp
35070 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20  onding tables.. 
35080 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
35090 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20    const int iDb 
350a0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
350b0 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
350c0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
350d0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  );.        const
350e0 20 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72   int iCsr = pPar
350f0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
35100 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61  /* Cursor to sca
35110 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20  n b-tree */.    
35120 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
35130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35140 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
35150 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
35160 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
35170 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20   *pKeyInfo = 0; 
35180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35190 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61   Keyinfo for sca
351a0 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20  nned index */.  
351b0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65        Index *pBe
351c0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
351d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
351e0 73 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73  st index found s
351f0 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
35200 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61   int iRoot = pTa
35210 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  b->tnum;        
35220 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
35230 67 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d  ge of scanned b-
35240 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  tree */..       
35250 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
35260 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
35270 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   iDb);.        s
35280 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
35290 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
352a0 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
352b0 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20  ->zName);..     
352c0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
352d0 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   the index that 
352e0 68 61 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73  has the lowest s
352f0 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20  can cost..      
35300 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
35310 28 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20  (2011-04-15) Do 
35320 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63  not do a full sc
35330 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72  an of an unorder
35340 65 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ed index..      
35350 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
35360 28 32 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20  (2013-10-03) Do 
35370 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e  not count the en
35380 74 72 69 65 73 20 69 6e 20 61 20 70 61 72 74 69  tries in a parti
35390 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  al index..      
353a0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
353b0 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20  In practice the 
353c0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
353d0 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  e will not be us
353e0 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a  ed. It is only .
353f0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65          ** passe
35400 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65  d to keep OP_Ope
35410 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20  nRead happy..   
35420 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
35430 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
35440 61 62 29 20 29 20 70 42 65 73 74 20 3d 20 73 71  ab) ) pBest = sq
35450 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
35460 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
35470 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
35480 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
35490 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
354a0 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t){.          if
354b0 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72  ( pIdx->bUnorder
354c0 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ed==0.          
354d0 20 26 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52   && pIdx->szIdxR
354e0 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  ow<pTab->szTabRo
354f0 77 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  w.           && 
35500 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
35510 65 72 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ere==0.         
35520 20 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20    && (!pBest || 
35530 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70  pIdx->szIdxRow<p
35540 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a  Best->szIdxRow).
35550 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
35560 20 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d           pBest =
35570 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20   pIdx;.         
35580 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
35590 20 20 20 20 20 69 66 28 20 70 42 65 73 74 20 29       if( pBest )
355a0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f  {.          iRoo
355b0 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b  t = pBest->tnum;
355c0 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49  .          pKeyI
355d0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
355e0 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72  InfoOfIndex(pPar
355f0 73 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20  se, pBest);.    
35600 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
35610 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e  * Open a read-on
35620 6c 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75  ly cursor, execu
35630 74 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c  te the OP_Count,
35640 20 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f   close the curso
35650 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  r. */.        sq
35660 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
35670 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  nt(v, OP_OpenRea
35680 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20  d, iCsr, iRoot, 
35690 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  iDb, 1);.       
356a0 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
356b0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
356c0 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
356d0 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b  , -1, (char *)pK
356e0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
356f0 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  FO);.        }. 
35700 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
35710 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
35720 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67  ount, iCsr, sAgg
35730 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d  Info.aFunc[0].iM
35740 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
35750 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
35760 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72  , OP_Close, iCsr
35770 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61  );.        expla
35780 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50  inSimpleCount(pP
35790 61 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73  arse, pTab, pBes
357a0 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  t);.      }else.
357b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
357c0 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
357d0 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20   */.      {.    
357e0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
357f0 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67   runs if the agg
35800 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52  regate has no GR
35810 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
35820 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  The.        ** p
35830 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63  rocessing is muc
35840 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20  h simpler since 
35850 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20  there is only a 
35860 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20  single row.     
35870 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e     ** of output.
35880 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
35890 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
358a0 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20  GroupBy==0 );.  
358b0 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
358c0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
358d0 73 41 67 67 49 6e 66 6f 29 3b 0a 0a 20 20 20 20  sAggInfo);..    
358e0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 71      /* If this q
358f0 75 65 72 79 20 69 73 20 61 20 63 61 6e 64 69 64  uery is a candid
35900 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f  ate for the min/
35910 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  max optimization
35920 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a  , then.        *
35930 2a 20 6d 69 6e 4d 61 78 46 6c 61 67 20 77 69 6c  * minMaxFlag wil
35940 6c 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 76  l have been prev
35950 69 6f 75 73 6c 79 20 73 65 74 20 74 6f 20 65 69  iously set to ei
35960 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ther.        ** 
35970 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
35980 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52  N or WHERE_ORDER
35990 42 59 5f 4d 41 58 20 61 6e 64 20 70 4d 69 6e 4d  BY_MAX and pMinM
359a0 61 78 4f 72 64 65 72 42 79 20 77 69 6c 6c 0a 20  axOrderBy will. 
359b0 20 20 20 20 20 20 20 2a 2a 20 62 65 20 61 6e 20         ** be an 
359c0 61 70 70 72 6f 70 72 69 61 74 65 20 4f 52 44 45  appropriate ORDE
359d0 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20  R BY expression 
359e0 66 6f 72 20 74 68 65 20 6f 70 74 69 6d 69 7a 61  for the optimiza
359f0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tion..        */
35a00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
35a10 20 6d 69 6e 4d 61 78 46 6c 61 67 3d 3d 57 48 45   minMaxFlag==WHE
35a20 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
35a30 4c 20 7c 7c 20 70 4d 69 6e 4d 61 78 4f 72 64 65  L || pMinMaxOrde
35a40 72 42 79 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy!=0 );.      
35a50 20 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61    assert( pMinMa
35a60 78 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  xOrderBy==0 || p
35a70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 2d 3e 6e  MinMaxOrderBy->n
35a80 45 78 70 72 3d 3d 31 20 29 3b 0a 0a 20 20 20 20  Expr==1 );..    
35a90 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
35aa0 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 57 68 65  1,pParse,p,("Whe
35ab0 72 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20 20  reBegin\n"));.  
35ac0 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
35ad0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
35ae0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
35af0 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d  t, pWhere, pMinM
35b00 61 78 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20  axOrderBy,.     
35b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
35b30 20 6d 69 6e 4d 61 78 46 6c 61 67 2c 20 30 29 3b   minMaxFlag, 0);
35b40 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49  .        if( pWI
35b50 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
35b60 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
35b70 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
35b80 20 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63         updateAcc
35b90 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
35ba0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
35bb0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
35bc0 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
35bd0 57 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20  WInfo)>0 ){.    
35be0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
35bf0 65 47 6f 74 6f 28 76 2c 20 73 71 6c 69 74 65 33  eGoto(v, sqlite3
35c00 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28  WhereBreakLabel(
35c10 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20  pWInfo));.      
35c20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
35c30 28 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64  (v, "%s() by ind
35c40 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ex",.           
35c50 20 20 20 20 20 28 6d 69 6e 4d 61 78 46 6c 61 67       (minMaxFlag
35c60 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  ==WHERE_ORDERBY_
35c70 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29  MIN?"min":"max")
35c80 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
35c90 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
35ca0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
35cb0 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41         finalizeA
35cc0 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
35cd0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
35ce0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
35cf0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
35d00 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
35d10 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
35d20 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
35d30 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  rEnd, SQLITE_JUM
35d40 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
35d50 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
35d60 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 30  pParse, p, -1, 0
35d70 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
35d80 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73              pDes
35d90 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72  t, addrEnd, addr
35da0 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  End);.    }.    
35db0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
35dc0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45  veLabel(v, addrE
35dd0 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a  nd);.    .  } /*
35de0 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65   endif aggregate
35df0 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28   query */..  if(
35e00 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
35e10 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
35e20 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
35e30 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
35e40 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22  pTable(pParse, "
35e50 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a  DISTINCT");.  }.
35e60 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
35e70 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
35e80 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65  ause, then we ne
35e90 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72  ed to sort the r
35ea0 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20  esults.  ** and 
35eb0 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65  send them to the
35ec0 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79   callback one by
35ed0 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   one..  */.  if(
35ee0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
35ef0 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65  ){.    explainTe
35f00 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 0a  mpTable(pParse,.
35f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61       sSort.nOBSa
35f30 74 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41 52  t>0 ? "RIGHT PAR
35f40 54 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22  T OF ORDER BY":"
35f50 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20  ORDER BY");.    
35f60 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
35f70 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f  (pParse, p, &sSo
35f80 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rt, pEList->nExp
35f90 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a  r, pDest);.  }..
35fa0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
35fb0 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72  o skip this quer
35fc0 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
35fd0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
35fe0 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a  (v, iEnd);..  /*
35ff0 20 54 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   The SELECT has 
36000 62 65 65 6e 20 63 6f 64 65 64 2e 20 49 66 20 74  been coded. If t
36010 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72  here is an error
36020 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74   in the Parse st
36030 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65  ructure,.  ** se
36040 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
36050 65 20 74 6f 20 31 2e 20 4f 74 68 65 72 77 69 73  e to 1. Otherwis
36060 65 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28  e 0. */.  rc = (
36070 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b  pParse->nErr>0);
36080 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
36090 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
360a0 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
360b0 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
360c0 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
360d0 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
360e0 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
360f0 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  /.select_end:.  
36100 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
36110 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  r(pParse->iSelec
36120 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c  tId, iRestoreSel
36130 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65  ectId);.  sqlite
36140 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
36150 64 62 2c 20 70 4d 69 6e 4d 61 78 4f 72 64 65 72  db, pMinMaxOrder
36160 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  By);.  sqlite3Db
36170 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66  Free(db, sAggInf
36180 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  o.aCol);.  sqlit
36190 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67  e3DbFree(db, sAg
361a0 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 23 69  gInfo.aFunc);.#i
361b0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
361c0 41 42 4c 45 44 0a 20 20 53 45 4c 45 43 54 54 52  ABLED.  SELECTTR
361d0 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(1,pParse,p,(
361e0 22 65 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 5c  "end processing\
361f0 6e 22 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  n"));.#endif.  r
36200 65 74 75 72 6e 20 72 63 3b 0a 7d 0a              eturn rc;.}.