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

Artifact 16d1f3510cef527e25067d04253e347c899346800d74f31629735295e9fac8ae:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 73 2f 25 70 3a 20 22 2c 28 53 29 2d 3e 7a  "%s/%p: ",(S)->z
02c0: 53 65 6c 4e 61 6d 65 2c 28 53 29 29 2c 5c 0a 20  SelName,(S)),\. 
02d0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
02e0: 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23 20  rintf X.#else.# 
02f0: 64 65 66 69 6e 65 20 53 45 4c 45 43 54 54 52 41  define SELECTTRA
0300: 43 45 28 4b 2c 50 2c 53 2c 58 29 0a 23 65 6e 64  CE(K,P,S,X).#end
0310: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  if.../*.** An in
0320: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
0330: 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20 69  llowing object i
0340: 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72 64  s used to record
0350: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
0360: 75 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70 72 6f  ut.** how to pro
0370: 63 65 73 73 20 74 68 65 20 44 49 53 54 49 4e 43  cess the DISTINC
0380: 54 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20 73 69  T keyword, to si
0390: 6d 70 6c 69 66 79 20 70 61 73 73 69 6e 67 20 74  mplify passing t
03a0: 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  hat information.
03b0: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 6c 65  ** into the sele
03c0: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 72 6f  ctInnerLoop() ro
03d0: 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65  utine..*/.typede
03e0: 66 20 73 74 72 75 63 74 20 44 69 73 74 69 6e 63  f struct Distinc
03f0: 74 43 74 78 20 44 69 73 74 69 6e 63 74 43 74 78  tCtx DistinctCtx
0400: 3b 0a 73 74 72 75 63 74 20 44 69 73 74 69 6e 63  ;.struct Distinc
0410: 74 43 74 78 20 7b 0a 20 20 75 38 20 69 73 54 6e  tCtx {.  u8 isTn
0420: 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ct;      /* True
0430: 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
0440: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
0450: 65 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54 6e 63  ent */.  u8 eTnc
0460: 74 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e 65 20  tType;   /* One 
0470: 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44 49 53  of the WHERE_DIS
0480: 54 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74 6f 72  TINCT_* operator
0490: 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 54 6e  s */.  int tabTn
04a0: 63 74 3b 20 20 20 20 2f 2a 20 45 70 68 65 6d 65  ct;    /* Epheme
04b0: 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20 66  ral table used f
04c0: 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63  or DISTINCT proc
04d0: 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  essing */.  int 
04e0: 61 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a 20 41  addrTnct;   /* A
04f0: 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65  ddress of OP_Ope
0500: 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f 64  nEphemeral opcod
0510: 65 20 66 6f 72 20 74 61 62 54 6e 63 74 20 2a 2f  e for tabTnct */
0520: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
0530: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
0540: 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20 69  llowing object i
0550: 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72 64  s used to record
0560: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
0570: 75 74 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  ut.** the ORDER 
0580: 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29  BY (or GROUP BY)
0590: 20 63 6c 61 75 73 65 20 6f 66 20 71 75 65 72 79   clause of query
05a0: 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64 2e   is being coded.
05b0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
05c0: 63 74 20 53 6f 72 74 43 74 78 20 53 6f 72 74 43  ct SortCtx SortC
05d0: 74 78 3b 0a 73 74 72 75 63 74 20 53 6f 72 74 43  tx;.struct SortC
05e0: 74 78 20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  tx {.  ExprList 
05f0: 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20  *pOrderBy;   /* 
0600: 54 68 65 20 4f 52 44 45 52 20 42 59 20 28 6f 72  The ORDER BY (or
0610: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
0620: 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61  ) */.  int nOBSa
0630: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
0640: 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20  Number of ORDER 
0650: 42 59 20 74 65 72 6d 73 20 73 61 74 69 73 66 69  BY terms satisfi
0660: 65 64 20 62 79 20 69 6e 64 69 63 65 73 20 2a 2f  ed by indices */
0670: 0a 20 20 69 6e 74 20 69 45 43 75 72 73 6f 72 3b  .  int iECursor;
0680: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
0690: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
06a0: 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e  e sorter */.  in
06b0: 74 20 72 65 67 52 65 74 75 72 6e 3b 20 20 20 20  t regReturn;    
06c0: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
06d0: 68 6f 6c 64 69 6e 67 20 62 6c 6f 63 6b 2d 6f 75  holding block-ou
06e0: 74 70 75 74 20 72 65 74 75 72 6e 20 61 64 64 72  tput return addr
06f0: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  ess */.  int lab
0700: 65 6c 42 6b 4f 75 74 3b 20 20 20 20 20 20 20 2f  elBkOut;       /
0710: 2a 20 53 74 61 72 74 20 6c 61 62 65 6c 20 66 6f  * Start label fo
0720: 72 20 74 68 65 20 62 6c 6f 63 6b 2d 6f 75 74 70  r the block-outp
0730: 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ut subroutine */
0740: 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 49  .  int addrSortI
0750: 6e 64 65 78 3b 20 20 20 20 2f 2a 20 41 64 64 72  ndex;    /* Addr
0760: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 53 6f  ess of the OP_So
0770: 72 74 65 72 4f 70 65 6e 20 6f 72 20 4f 50 5f 4f  rterOpen or OP_O
0780: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a 2f 0a  penEphemeral */.
0790: 20 20 69 6e 74 20 6c 61 62 65 6c 44 6f 6e 65 3b    int labelDone;
07a0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
07b0: 68 65 72 65 20 77 68 65 6e 20 64 6f 6e 65 2c 20  here when done, 
07c0: 65 78 3a 20 4c 49 4d 49 54 20 72 65 61 63 68 65  ex: LIMIT reache
07d0: 64 20 2a 2f 0a 20 20 75 38 20 73 6f 72 74 46 6c  d */.  u8 sortFl
07e0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ags;         /* 
07f0: 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53 4f 52  Zero or more SOR
0800: 54 46 4c 41 47 5f 2a 20 62 69 74 73 20 2a 2f 0a  TFLAG_* bits */.
0810: 20 20 75 38 20 62 4f 72 64 65 72 65 64 49 6e 6e    u8 bOrderedInn
0820: 65 72 4c 6f 6f 70 3b 20 2f 2a 20 4f 52 44 45 52  erLoop; /* ORDER
0830: 20 42 59 20 63 6f 72 72 65 63 74 6c 79 20 73 6f   BY correctly so
0840: 72 74 73 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f  rts the inner lo
0850: 6f 70 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65  op */.};.#define
0860: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
0870: 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a 20 55  ter  0x01   /* U
0880: 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e  se SorterOpen in
0890: 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45 70 68  stead of OpenEph
08a0: 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  emeral */../*.**
08b0: 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20   Delete all the 
08c0: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c  content of a Sel
08d0: 65 63 74 20 73 74 72 75 63 74 75 72 65 2e 20 20  ect structure.  
08e0: 44 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  Deallocate the s
08f0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65  tructure.** itse
0900: 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46 72 65 65  lf only if bFree
0910: 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
0920: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0930: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0940: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
0950: 20 62 46 72 65 65 29 7b 0a 20 20 77 68 69 6c 65   bFree){.  while
0960: 28 20 70 20 29 7b 0a 20 20 20 20 53 65 6c 65 63  ( p ){.    Selec
0970: 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
0980: 50 72 69 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74  Prior;.    sqlit
0990: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
09a0: 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  (db, p->pEList);
09b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
09c0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
09d0: 3e 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69  >pSrc);.    sqli
09e0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
09f0: 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  , p->pWhere);.  
0a00: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0a10: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
0a20: 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71  GroupBy);.    sq
0a30: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0a40: 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  db, p->pHaving);
0a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0a60: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0a70: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
0a80: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
0a90: 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
0aa0: 29 3b 0a 20 20 20 20 69 66 28 20 4f 4b 5f 49 46  );.    if( OK_IF
0ab0: 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70 2d 3e  _ALWAYS_TRUE(p->
0ac0: 70 57 69 74 68 29 20 29 20 73 71 6c 69 74 65 33  pWith) ) sqlite3
0ad0: 57 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20 70  WithDelete(db, p
0ae0: 2d 3e 70 57 69 74 68 29 3b 0a 20 20 20 20 69 66  ->pWith);.    if
0af0: 28 20 62 46 72 65 65 20 29 20 73 71 6c 69 74 65  ( bFree ) sqlite
0b00: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29  3DbFreeNN(db, p)
0b10: 3b 0a 20 20 20 20 70 20 3d 20 70 50 72 69 6f 72  ;.    p = pPrior
0b20: 3b 0a 20 20 20 20 62 46 72 65 65 20 3d 20 31 3b  ;.    bFree = 1;
0b30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
0b40: 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63  itialize a Selec
0b50: 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e  tDest structure.
0b60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0b70: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53  SelectDestInit(S
0b80: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
0b90: 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74  , int eDest, int
0ba0: 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74   iParm){.  pDest
0bb0: 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29 65 44  ->eDest = (u8)eD
0bc0: 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53  est;.  pDest->iS
0bd0: 44 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20  DParm = iParm;. 
0be0: 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74   pDest->zAffSdst
0bf0: 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69   = 0;.  pDest->i
0c00: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
0c10: 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a  t->nSdst = 0;.}.
0c20: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
0c30: 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74   a new Select st
0c40: 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75  ructure and retu
0c50: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
0c60: 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72  that.** structur
0c70: 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71  e..*/.Select *sq
0c80: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a  lite3SelectNew(.
0c90: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
0ca0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
0cb0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
0cc0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
0cd0: 2c 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63  ,     /* which c
0ce0: 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64  olumns to includ
0cf0: 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  e in the result 
0d00: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
0d10: 72 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  rc,        /* th
0d20: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d  e FROM clause --
0d30: 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f   which tables to
0d40: 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20   scan */.  Expr 
0d50: 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
0d60: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
0d70: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
0d80: 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20  st *pGroupBy,   
0d90: 2f 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  /* the GROUP BY 
0da0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
0db0: 20 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20   *pHaving,      
0dc0: 20 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20    /* the HAVING 
0dd0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
0de0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
0df0: 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42    /* the ORDER B
0e00: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 33  Y clause */.  u3
0e10: 32 20 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20  2 selFlags,     
0e20: 20 20 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61      /* Flag para
0e30: 6d 65 74 65 72 73 2c 20 73 75 63 68 20 61 73 20  meters, such as 
0e40: 53 46 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20  SF_Distinct */. 
0e50: 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 20 20   Expr *pLimit   
0e60: 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20         /* LIMIT 
0e70: 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61  value.  NULL mea
0e80: 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 29  ns not used */.)
0e90: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
0ea0: 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64  ;.  Select stand
0eb0: 69 6e 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  in;.  pNew = sql
0ec0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
0ed0: 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  N(pParse->db, si
0ee0: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
0ef0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
0f00: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
0f10: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
0f20: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
0f30: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d   = &standin;.  }
0f40: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
0f50: 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d   ){.    pEList =
0f60: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0f70: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
0f80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fa0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
0fb0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 54 4b 5f 41  (pParse->db,TK_A
0fc0: 53 54 45 52 49 53 4b 2c 30 29 29 3b 0a 20 20 7d  STERISK,0));.  }
0fd0: 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20  .  pNew->pEList 
0fe0: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77  = pEList;.  pNew
0ff0: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
1000: 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61  ;.  pNew->selFla
1010: 67 73 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20  gs = selFlags;. 
1020: 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20   pNew->iLimit = 
1030: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  0;.  pNew->iOffs
1040: 65 74 20 3d 20 30 3b 0a 23 69 66 20 53 45 4c 45  et = 0;.#if SELE
1050: 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
1060: 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65    pNew->zSelName
1070: 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  [0] = 0;.#endif.
1080: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
1090: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
10a0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
10b0: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
10c0: 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d  ew->nSelectRow =
10d0: 20 30 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d   0;.  if( pSrc==
10e0: 30 20 29 20 70 53 72 63 20 3d 20 73 71 6c 69 74  0 ) pSrc = sqlit
10f0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
1100: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
1110: 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65  f(*pSrc));.  pNe
1120: 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  w->pSrc = pSrc;.
1130: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
1140: 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d   pWhere;.  pNew-
1150: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
1160: 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  upBy;.  pNew->pH
1170: 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b  aving = pHaving;
1180: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
1190: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
11a0: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30  pNew->pPrior = 0
11b0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
11c0: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  = 0;.  pNew->pLi
11d0: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
11e0: 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 30 3b  pNew->pWith = 0;
11f0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
1200: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1210: 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c  ) {.    clearSel
1220: 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ect(pParse->db, 
1230: 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26 73 74 61  pNew, pNew!=&sta
1240: 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e 65 77 20  ndin);.    pNew 
1250: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1260: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
1270: 70 53 72 63 21 3d 30 20 7c 7c 20 70 50 61 72 73  pSrc!=0 || pPars
1280: 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20 20 7d  e->nErr>0 );.  }
1290: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 21  .  assert( pNew!
12a0: 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a 20 20 72  =&standin );.  r
12b0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 23  eturn pNew;.}..#
12c0: 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
12d0: 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 53 65 74  NABLED./*.** Set
12e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 53   the name of a S
12f0: 65 6c 65 63 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a  elect object.*/.
1300: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
1310: 63 74 53 65 74 4e 61 6d 65 28 53 65 6c 65 63 74  ctSetName(Select
1320: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
1330: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 70  *zName){.  if( p
1340: 20 26 26 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20   && zName ){.   
1350: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1360: 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a 53 65 6c  f(sizeof(p->zSel
1370: 4e 61 6d 65 29 2c 20 70 2d 3e 7a 53 65 6c 4e 61  Name), p->zSelNa
1380: 6d 65 2c 20 22 25 73 22 2c 20 7a 4e 61 6d 65 29  me, "%s", zName)
1390: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
13a0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
13b0: 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20 73  e given Select s
13c0: 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c  tructure and all
13d0: 20 6f 66 20 69 74 73 20 73 75 62 73 74 72 75 63   of its substruc
13e0: 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tures..*/.void s
13f0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
1400: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
1410: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66  Select *p){.  if
1420: 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54  ( OK_IF_ALWAYS_T
1430: 52 55 45 28 70 29 20 29 20 63 6c 65 61 72 53 65  RUE(p) ) clearSe
1440: 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29 3b 0a  lect(db, p, 1);.
1450: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1460: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1470: 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
1480: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
1490: 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73  a compound..*/.s
14a0: 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66 69  tatic Select *fi
14b0: 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c 65  ndRightmost(Sele
14c0: 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28  ct *p){.  while(
14d0: 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d 20   p->pNext ) p = 
14e0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74 75  p->pNext;.  retu
14f0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
1500: 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e  iven 1 to 3 iden
1510: 74 69 66 69 65 72 73 20 70 72 65 63 65 64 69 6e  tifiers precedin
1520: 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f  g the JOIN keywo
1530: 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68  rd, determine th
1540: 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69  e.** type of joi
1550: 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
1560: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74  teger constant t
1570: 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68  hat expresses th
1580: 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65  at type.** in te
1590: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  rms of the follo
15a0: 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a  wing bit values:
15b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e  .**.**     JT_IN
15c0: 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52  NER.**     JT_CR
15d0: 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55  OSS.**     JT_OU
15e0: 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41  TER.**     JT_NA
15f0: 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f  TURAL.**     JT_
1600: 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52  LEFT.**     JT_R
1610: 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c  IGHT.**.** A ful
1620: 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20  l outer join is 
1630: 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  the combination 
1640: 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a  of JT_LEFT and J
1650: 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49  T_RIGHT..**.** I
1660: 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20  f an illegal or 
1670: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
1680: 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74   type is seen, t
1690: 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  hen still return
16a0: 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c  .** a join type,
16b0: 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f   but put an erro
16c0: 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  r in the pParse 
16d0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
16e0: 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70  t sqlite3JoinTyp
16f0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1700: 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65   Token *pA, Toke
1710: 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43  n *pB, Token *pC
1720: 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70  ){.  int jointyp
1730: 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a  e = 0;.  Token *
1740: 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65  apAll[3];.  Toke
1750: 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20  n *p;.          
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37     /*   01234567
1780: 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
1790: 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20  456789 123 */.  
17a0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
17b0: 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22  r zKeyText[] = "
17c0: 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69  naturaleftouteri
17d0: 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73  ghtfullinnercros
17e0: 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  s";.  static con
17f0: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
1800: 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20  u8 i;        /* 
1810: 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79  Beginning of key
1820: 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65  word text in zKe
1830: 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75  yText[] */.    u
1840: 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c  8 nChar;    /* L
1850: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79  ength of the key
1860: 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74 65  word in characte
1870: 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64  rs */.    u8 cod
1880: 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74  e;     /* Join t
1890: 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20  ype mask */.  } 
18a0: 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20  aKeyword[] = {. 
18b0: 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f     /* natural */
18c0: 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54   { 0,  7, JT_NAT
18d0: 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20 20  URAL            
18e0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65      },.    /* le
18f0: 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34  ft    */ { 6,  4
1900: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
1910: 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ER          },. 
1920: 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f     /* outer   */
1930: 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54   { 10, 5, JT_OUT
1940: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1950: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69      },.    /* ri
1960: 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35  ght   */ { 14, 5
1970: 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  , JT_RIGHT|JT_OU
1980: 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  TER         },. 
1990: 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f     /* full    */
19a0: 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46   { 19, 4, JT_LEF
19b0: 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  T|JT_RIGHT|JT_OU
19c0: 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e  TER },.    /* in
19d0: 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35  ner   */ { 23, 5
19e0: 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20  , JT_INNER      
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1a00: 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f     /* cross   */
1a10: 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 28, 5, JT_INN
1a20: 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20  ER|JT_CROSS     
1a30: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e      },.  };.  in
1a40: 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b  t i, j;.  apAll[
1a50: 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c  0] = pA;.  apAll
1a60: 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c  [1] = pB;.  apAl
1a70: 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72  l[2] = pC;.  for
1a80: 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41  (i=0; i<3 && apA
1a90: 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll[i]; i++){.   
1aa0: 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20   p = apAll[i];. 
1ab0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72     for(j=0; j<Ar
1ac0: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
1ad0: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); j++){.      i
1ae0: 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72  f( p->n==aKeywor
1af0: 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20  d[j].nChar .    
1b00: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
1b10: 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
1b20: 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b  p->z, &zKeyText[
1b30: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20  aKeyword[j].i], 
1b40: 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p->n)==0 ){.    
1b50: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
1b60: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65  aKeyword[j].code
1b70: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1b80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b90: 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
1ba0: 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d  0 || j==1 || j==
1bb0: 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d  2 || j==3 || j==
1bc0: 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d  4 || j==5 || j==
1bd0: 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d  6 );.    if( j>=
1be0: 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f  ArraySize(aKeywo
1bf0: 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69  rd) ){.      joi
1c00: 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f  ntype |= JT_ERRO
1c10: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
1c20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a      }.  }.  if(.
1c30: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
1c40: 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55   (JT_INNER|JT_OU
1c50: 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52  TER))==(JT_INNER
1c60: 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20  |JT_OUTER) ||.  
1c70: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a     (jointype & J
1c80: 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b  T_ERROR)!=0.  ){
1c90: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1ca0: 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20  *zSp = " ";.    
1cb0: 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b  assert( pB!=0 );
1cc0: 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29  .    if( pC==0 )
1cd0: 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73  { zSp++; }.    s
1ce0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1cf0: 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
1d00: 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a  or unsupported j
1d10: 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20  oin type: ".    
1d20: 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c 20     "%T %T%s%T", 
1d30: 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29  pA, pB, zSp, pC)
1d40: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
1d50: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c   JT_INNER;.  }el
1d60: 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65  se if( (jointype
1d70: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
1d80: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f  .         && (jo
1d90: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
1da0: 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54  T|JT_RIGHT))!=JT
1db0: 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c  _LEFT ){.    sql
1dc0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1dd0: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47  rse, .      "RIG
1de0: 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45  HT and FULL OUTE
1df0: 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20  R JOINs are not 
1e00: 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72  currently suppor
1e10: 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74  ted");.    joint
1e20: 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a  ype = JT_INNER;.
1e30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69    }.  return joi
1e40: 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ntype;.}../*.** 
1e50: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1e60: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   of a column in 
1e70: 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  a table.  Return
1e80: 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d   -1 if the colum
1e90: 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74  n.** is not cont
1ea0: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62  ained in the tab
1eb0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1ec0: 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61  t columnIndex(Ta
1ed0: 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74  ble *pTab, const
1ee0: 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20   char *zCol){.  
1ef0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1f00: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
1f10: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
1f20: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61  lite3StrICmp(pTa
1f30: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  b->aCol[i].zName
1f40: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74  , zCol)==0 ) ret
1f50: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
1f60: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
1f70: 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72 73   Search the firs
1f80: 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53  t N tables in pS
1f90: 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  rc, from left to
1fa0: 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20   right, looking 
1fb0: 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74  for a.** table t
1fc0: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e  hat has a column
1fd0: 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a   named zCol.  .*
1fe0: 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c  *.** When found,
1ff0: 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20   set *piTab and 
2000: 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61  *piCol to the ta
2010: 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f  ble index and co
2020: 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66  lumn index.** of
2030: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f   the matching co
2040: 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20  lumn and return 
2050: 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  TRUE..**.** If n
2060: 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  ot found, return
2070: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
2080: 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f  c int tableAndCo
2090: 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63  lumnIndex(.  Src
20a0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
20b0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61    /* Array of ta
20c0: 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a  bles to search *
20d0: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
20e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
20f0: 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
2100: 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61  pSrc->a[] to sea
2110: 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  rch */.  const c
2120: 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a  har *zCol,    /*
2130: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
2140: 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  umn we are looki
2150: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ng for */.  int 
2160: 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  *piTab,         
2170: 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20   /* Write index 
2180: 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72  of pSrc->a[] her
2190: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f  e */.  int *piCo
21a0: 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l           /* W
21b0: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
21c0: 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54  rc->a[*piTab].pT
21d0: 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20  ab->aCol[] here 
21e0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2200: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
2210: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20   tables in pSrc 
2220: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
2230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2240: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74  ex of column mat
2250: 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20  ching zCol */.. 
2260: 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62 3d   assert( (piTab=
2270: 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20  =0)==(piCol==0) 
2280: 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e  );  /* Both or n
2290: 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20  either are NULL 
22a0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
22b0: 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f  N; i++){.    iCo
22c0: 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  l = columnIndex(
22d0: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c  pSrc->a[i].pTab,
22e0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20   zCol);.    if( 
22f0: 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
2300: 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20   if( piTab ){.  
2310: 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69        *piTab = i
2320: 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c  ;.        *piCol
2330: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d   = iCol;.      }
2340: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2350: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2360: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2370: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2380: 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65 72   used to add ter
2390: 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f  ms implied by JO
23a0: 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65  IN syntax to the
23b0: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
23c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61   expression of a
23d0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
23e0: 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c  t. The new term,
23f0: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44   which.** is AND
2400: 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69 73  ed with the exis
2410: 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73  ting WHERE claus
2420: 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  e, is of the for
2430: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62  m:.**.**    (tab
2440: 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f  1.col1 = tab2.co
2450: 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  l2).**.** where 
2460: 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72 63  tab1 is the iSrc
2470: 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63  'th table in Src
2480: 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74 61  List pSrc and ta
2490: 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69  b2 is the .** (i
24a0: 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d  Src+1)'th. Colum
24b0: 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e  n col1 is column
24c0: 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62   iColLeft of tab
24d0: 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a  1, and col2 is.*
24e0: 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67  * column iColRig
24f0: 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73  ht of tab2..*/.s
2500: 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68  tatic void addWh
2510: 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ereTerm(.  Parse
2520: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2540: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
2550: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
2560: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2570: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
2580: 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61  bles in FROM cla
2590: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  use */.  int iLe
25a0: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
25b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
25c0: 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65  x of first table
25d0: 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63   to join in pSrc
25e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65   */.  int iColLe
25f0: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
2600: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2610: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73  f column in firs
2620: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
2630: 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20 20   iRight,        
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2650: 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20  Index of second 
2660: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f  table in pSrc */
2670: 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74  .  int iColRight
2680: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2690: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
26a0: 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20  olumn in second 
26b0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
26c0: 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20  sOuterJoin,     
26d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
26e0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
26f0: 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20   OUTER join */. 
2700: 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20   Expr **ppWhere 
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2720: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20   /* IN/OUT: The 
2730: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
2740: 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  add to */.){.  s
2750: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
2760: 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
2770: 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45  *pE1;.  Expr *pE
2780: 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a  2;.  Expr *pEq;.
2790: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66 74  .  assert( iLeft
27a0: 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  <iRight );.  ass
27b0: 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e  ert( pSrc->nSrc>
27c0: 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65  iRight );.  asse
27d0: 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66  rt( pSrc->a[iLef
27e0: 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73  t].pTab );.  ass
27f0: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69  ert( pSrc->a[iRi
2800: 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20  ght].pTab );..  
2810: 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65  pE1 = sqlite3Cre
2820: 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62  ateColumnExpr(db
2830: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
2840: 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20  ColLeft);.  pE2 
2850: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43  = sqlite3CreateC
2860: 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53  olumnExpr(db, pS
2870: 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c  rc, iRight, iCol
2880: 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d  Right);..  pEq =
2890: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
28a0: 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31  arse, TK_EQ, pE1
28b0: 2c 20 70 45 32 29 3b 0a 20 20 69 66 28 20 70 45  , pE2);.  if( pE
28c0: 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e  q && isOuterJoin
28d0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
28e0: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
28f0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61  FromJoin);.    a
2900: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2910: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
2920: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
2930: 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70  uced) );.    Exp
2940: 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
2950: 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  pEq, EP_NoReduce
2960: 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69 67  );.    pEq->iRig
2970: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69  htJoinTable = (i
2980: 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a  16)pE2->iTable;.
2990: 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20 3d    }.  *ppWhere =
29a0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
29b0: 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70 45  db, *ppWhere, pE
29c0: 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  q);.}../*.** Set
29d0: 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   the EP_FromJoin
29e0: 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c   property on all
29f0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69   terms of the gi
2a00: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ven expression..
2a10: 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20 45  ** And set the E
2a20: 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61  xpr.iRightJoinTa
2a30: 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f  ble to iTable fo
2a40: 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  r every term in 
2a50: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
2a60: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f  n..**.** The EP_
2a70: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
2a80: 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72  y is used on ter
2a90: 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  ms of an express
2aa0: 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74  ion to tell.** t
2ab0: 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  he LEFT OUTER JO
2ac0: 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  IN processing lo
2ad0: 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65  gic that this te
2ae0: 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  rm is part of th
2af0: 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69  e.** join restri
2b00: 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20  ction specified 
2b10: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
2b20: 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f  NG clause and no
2b30: 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74  t a part.** of t
2b40: 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20  he more general 
2b50: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54  WHERE clause.  T
2b60: 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d  hese terms are m
2b70: 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65  oved over to the
2b80: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
2b90: 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f   during join pro
2ba0: 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e  cessing but we n
2bb0: 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
2bc0: 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69  that they.** ori
2bd0: 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f  ginated in the O
2be0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2bf0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70  e..**.** The Exp
2c00: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
2c10: 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52  e tells the WHER
2c20: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
2c30: 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ing that the.** 
2c40: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e  expression depen
2c50: 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67  ds on table iRig
2c60: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e  htJoinTable even
2c70: 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20 69   if that table i
2c80: 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69  s not.** explici
2c90: 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e  tly mentioned in
2ca0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
2cb0: 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69    That informati
2cc0: 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20  on is needed.** 
2cd0: 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74  for cases like t
2ce0: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  his:.**.**    SE
2cf0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
2d00: 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
2d10: 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e  1.a=t2.b AND t1.
2d20: 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68  x=5.**.** The wh
2d30: 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73  ere clause needs
2d40: 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68 61   to defer the ha
2d50: 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31  ndling of the t1
2d60: 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74  .x=5.** term unt
2d70: 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32 20  il after the t2 
2d80: 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e  loop of the join
2d90: 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20  .  In that way, 
2da0: 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77  a.** NULL t2 row
2db0: 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65   will be inserte
2dc0: 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21  d whenever t1.x!
2dd0: 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f  =5.  If we do no
2de0: 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68  t.** defer the h
2df0: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d  andling of t1.x=
2e00: 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72  5, it will be pr
2e10: 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74  ocessed immediat
2e20: 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65  ely.** after the
2e30: 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77   t1 loop and row
2e40: 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77  s with t1.x!=5 w
2e50: 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72  ill never appear
2e60: 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75   in.** the outpu
2e70: 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f  t, which is inco
2e80: 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrect..*/.static
2e90: 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70   void setJoinExp
2ea0: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  r(Expr *p, int i
2eb0: 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28  Table){.  while(
2ec0: 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65   p ){.    ExprSe
2ed0: 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  tProperty(p, EP_
2ee0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61  FromJoin);.    a
2ef0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2f00: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
2f10: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
2f20: 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53  ed) );.    ExprS
2f30: 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 2c  etVVAProperty(p,
2f40: 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
2f50: 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e     p->iRightJoin
2f60: 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61  Table = (i16)iTa
2f70: 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ble;.    if( p->
2f80: 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
2f90: 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  && p->x.pList ){
2fa0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
2fb0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2fc0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
2fd0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2fe0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78  setJoinExpr(p->x
2ff0: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
3000: 70 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr, iTable);.   
3010: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
3020: 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c  etJoinExpr(p->pL
3030: 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20  eft, iTable);.  
3040: 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b    p = p->pRight;
3050: 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 20 55 6e 64 6f  .  } .}../* Undo
3060: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 73 65 74   the work of set
3070: 4a 6f 69 6e 45 78 70 72 28 29 2e 20 20 49 6e 20  JoinExpr().  In 
3080: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
3090: 72 65 65 20 70 2c 20 63 6f 6e 76 65 72 74 20 65  ree p, convert e
30a0: 76 65 72 79 0a 2a 2a 20 74 65 72 6d 20 74 68 61  very.** term tha
30b0: 74 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  t is marked with
30c0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 61 6e 64   EP_FromJoin and
30d0: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
30e0: 3d 3d 69 54 61 62 6c 65 20 69 6e 74 6f 0a 2a 2a  ==iTable into.**
30f0: 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 65 72   an ordinary ter
3100: 6d 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65  m that omits the
3110: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 6d 61 72   EP_FromJoin mar
3120: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 68 61  k..**.** This ha
3130: 70 70 65 6e 73 20 77 68 65 6e 20 61 20 4c 45 46  ppens when a LEF
3140: 54 20 4a 4f 49 4e 20 69 73 20 73 69 6d 70 6c 69  T JOIN is simpli
3150: 66 69 65 64 20 69 6e 74 6f 20 61 6e 20 6f 72 64  fied into an ord
3160: 69 6e 61 72 79 20 4a 4f 49 4e 2e 0a 2a 2f 0a 73  inary JOIN..*/.s
3170: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 73 65 74  tatic void unset
3180: 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70  JoinExpr(Expr *p
3190: 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20  , int iTable){. 
31a0: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
31b0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
31c0: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
31d0: 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 28 69 54  oin).     && (iT
31e0: 61 62 6c 65 3c 30 20 7c 7c 20 70 2d 3e 69 52 69  able<0 || p->iRi
31f0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54  ghtJoinTable==iT
3200: 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 45  able) ){.      E
3210: 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79  xprClearProperty
3220: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
3230: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3240: 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  p->op==TK_FUNCTI
3250: 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74  ON && p->x.pList
3260: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
3270: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
3280: 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  i<p->x.pList->nE
3290: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
32a0: 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72     unsetJoinExpr
32b0: 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69  (p->x.pList->a[i
32c0: 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 29  ].pExpr, iTable)
32d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
32e0: 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70      unsetJoinExp
32f0: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  r(p->pLeft, iTab
3300: 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  le);.    p = p->
3310: 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a  pRight;.  } .}..
3320: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3330: 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65  ne processes the
3340: 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f   join informatio
3350: 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73  n for a SELECT s
3360: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20  tatement..** ON 
3370: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
3380: 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  s are converted 
3390: 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73  into extra terms
33a0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
33b0: 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c  ause..** NATURAL
33c0: 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61   joins also crea
33d0: 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63  te extra WHERE c
33e0: 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a  lause terms..**.
33f0: 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20  ** The terms of 
3400: 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72  a FROM clause ar
3410: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
3420: 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73  he Select.pSrc s
3430: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65  tructure..** The
3440: 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65   left most table
3450: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e   is the first en
3460: 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53  try in Select.pS
3470: 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d  rc.  The right-m
3480: 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  ost.** table is 
3490: 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20  the last entry. 
34a0: 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   The join operat
34b0: 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68  or is held in th
34c0: 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68  e entry to.** th
34d0: 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e  e left.  Thus en
34e0: 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74  try 0 contains t
34f0: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
3500: 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65   for the join be
3510: 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73  tween.** entries
3520: 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f   0 and 1.  Any O
3530: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
3540: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
3550: 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a  th the join are.
3560: 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64  ** also attached
3570: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74   to the left ent
3580: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
3590: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
35a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
35b0: 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  ors encountered.
35c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
35d0: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
35e0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
35f0: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72  Select *p){.  Sr
3600: 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3620: 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74   All tables in t
3630: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
3640: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
3650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3660: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
3670: 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ters */.  struct
3680: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
3690: 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66  Left;     /* Lef
36a0: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
36b0: 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ined */.  struct
36c0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
36d0: 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67  Right;    /* Rig
36e0: 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ht table being j
36f0: 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63  oined */..  pSrc
3700: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c   = p->pSrc;.  pL
3710: 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30  eft = &pSrc->a[0
3720: 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70  ];.  pRight = &p
3730: 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69  Left[1];.  for(i
3740: 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
3750: 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b  -1; i++, pRight+
3760: 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20  +, pLeft++){.   
3770: 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54 61   Table *pRightTa
3780: 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61 62  b = pRight->pTab
3790: 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74 65  ;.    int isOute
37a0: 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56 45  r;..    if( NEVE
37b0: 52 28 70 4c 65 66 74 2d 3e 70 54 61 62 3d 3d 30  R(pLeft->pTab==0
37c0: 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30   || pRightTab==0
37d0: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
37e0: 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69    isOuter = (pRi
37f0: 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  ght->fg.jointype
3800: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b   & JT_OUTER)!=0;
3810: 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68  ..    /* When th
3820: 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
3830: 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64  d is present, ad
3840: 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  d WHERE clause t
3850: 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20  erms for.    ** 
3860: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61  every column tha
3870: 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  t the two tables
3880: 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e   have in common.
3890: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
38a0: 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74  pRight->fg.joint
38b0: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
38c0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52   ){.      if( pR
38d0: 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69  ight->pOn || pRi
38e0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
38f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3900: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3910: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d  a NATURAL join m
3920: 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20  ay not have ".  
3930: 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20           "an ON 
3940: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22  or USING clause"
3950: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 0);.        re
3960: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
3970: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
3980: 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c  <pRightTab->nCol
3990: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
39a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f  char *zName;   /
39b0: 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e  * Name of column
39c0: 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 74 61   in the right ta
39d0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ble */.        i
39e0: 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a  nt iLeft;     /*
39f0: 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74   Matching left t
3a00: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
3a10: 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f  int iLeftCol;  /
3a20: 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  * Matching colum
3a30: 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61  n in the left ta
3a40: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ble */..        
3a50: 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61  zName = pRightTa
3a60: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
3a70: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 61  ;.        if( ta
3a80: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
3a90: 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61  x(pSrc, i+1, zNa
3aa0: 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65  me, &iLeft, &iLe
3ab0: 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  ftCol) ){.      
3ac0: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
3ad0: 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69  (pParse, pSrc, i
3ae0: 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20  Left, iLeftCol, 
3af0: 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20  i+1, j,.        
3b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
3b10: 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65  sOuter, &p->pWhe
3b20: 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  re);.        }. 
3b30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
3b40: 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f    /* Disallow bo
3b50: 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  th ON and USING 
3b60: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
3b70: 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a  ame join.    */.
3b80: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
3b90: 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70  pOn && pRight->p
3ba0: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  Using ){.      s
3bb0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3bc0: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68  Parse, "cannot h
3bd0: 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  ave both ON and 
3be0: 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20  USING ".        
3bf0: 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20  "clauses in the 
3c00: 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20  same join");.   
3c10: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3c20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74   }..    /* Add t
3c30: 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20  he ON clause to 
3c40: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
3c50: 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e  HERE clause, con
3c60: 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a  nected by.    **
3c70: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
3c80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
3c90: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a   pRight->pOn ){.
3ca0: 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74 65        if( isOute
3cb0: 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  r ) setJoinExpr(
3cc0: 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69  pRight->pOn, pRi
3cd0: 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  ght->iCursor);. 
3ce0: 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d       p->pWhere =
3cf0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
3d00: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
3d10: 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70  Where, pRight->p
3d20: 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68  On);.      pRigh
3d30: 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20  t->pOn = 0;.    
3d40: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
3d50: 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20   extra terms on 
3d60: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3d70: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
3d80: 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e   named.    ** in
3d90: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
3da0: 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20  e.  Example: If 
3db0: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74  the two tables t
3dc0: 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20  o be joined are 
3dd0: 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20  .    ** A and B 
3de0: 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c  and the USING cl
3df0: 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c  ause names X, Y,
3e00: 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64   and Z, then add
3e10: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20   this.    ** to 
3e20: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3e30: 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44  :    A.X=B.X AND
3e40: 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a   A.Y=B.Y AND A.Z
3e50: 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f  =B.Z.    ** Repo
3e60: 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61  rt an error if a
3e70: 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f  ny column mentio
3e80: 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47  ned in the USING
3e90: 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a   clause is.    *
3ea0: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  * not contained 
3eb0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74  in both tables t
3ec0: 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20  o be joined..   
3ed0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
3ee0: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
3ef0: 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73      IdList *pLis
3f00: 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69  t = pRight->pUsi
3f10: 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ng;.      for(j=
3f20: 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; j<pList->nId;
3f30: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
3f40: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
3f50: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
3f60: 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47  erm in the USING
3f70: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
3f80: 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20     int iLeft;   
3f90: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20      /* Table on 
3fa0: 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61  the left with ma
3fb0: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61  tching column na
3fc0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  me */.        in
3fd0: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f  t iLeftCol;    /
3fe0: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
3ff0: 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  of matching colu
4000: 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  mn on the left *
4010: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  /.        int iR
4020: 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f  ightCol;   /* Co
4030: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d  lumn number of m
4040: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f  atching column o
4050: 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a  n the right */..
4060: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
4070: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  pList->a[j].zNam
4080: 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67 68  e;.        iRigh
4090: 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64  tCol = columnInd
40a0: 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e  ex(pRightTab, zN
40b0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
40c0: 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20  ( iRightCol<0.  
40d0: 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65         || !table
40e0: 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
40f0: 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c  Src, i+1, zName,
4100: 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43   &iLeft, &iLeftC
4110: 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ol).        ){. 
4120: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4130: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4140: 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73   "cannot join us
4150: 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20  ing column %s - 
4160: 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20  column ".       
4170: 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e       "not presen
4180: 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  t in both tables
4190: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
41a0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
41b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
41c0: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50   addWhereTerm(pP
41d0: 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66  arse, pSrc, iLef
41e0: 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31  t, iLeftCol, i+1
41f0: 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20  , iRightCol,.   
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4210: 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70    isOuter, &p->p
4220: 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Where);.      }.
4230: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4240: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  rn 0;.}../* Forw
4250: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
4260: 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20  .static KeyInfo 
4270: 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  *keyInfoFromExpr
4280: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
4290: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
42a0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
42b0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
42c0: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72  List,     /* For
42d0: 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62  m the KeyInfo ob
42e0: 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45  ject from this E
42f0: 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  xprList */.  int
4300: 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20 20   iStart,        
4310: 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20    /* Begin with 
4320: 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70  this column of p
4330: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  List */.  int nE
4340: 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 2f  xtra           /
4350: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
4360: 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f  extra columns to
4370: 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a 0a   the end */.);..
4380: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
4390: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ode that will pu
43a0: 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  sh the record in
43b0: 20 72 65 67 69 73 74 65 72 73 20 72 65 67 44 61   registers regDa
43c0: 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65  ta.** through re
43d0: 67 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e  gData+nData-1 on
43e0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a  to the sorter..*
43f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75  /.static void pu
4400: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
4410: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4420: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
4430: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f   context */.  So
4440: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
4450: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
4460: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52  ion about the OR
4470: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
4480: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
4490: 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ct,       /* The
44a0: 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74   whole SELECT st
44b0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
44c0: 20 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20   regData,       
44d0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67      /* First reg
44e0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61  ister holding da
44f0: 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  ta to be sorted 
4500: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67  */.  int regOrig
4510: 44 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20 46  Data,       /* F
4520: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f  irst register ho
4530: 6c 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72  lding data befor
4540: 65 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20 69  e packing */.  i
4550: 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20  nt nData,       
4560: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4570: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  of elements in t
4580: 68 65 20 64 61 74 61 20 61 72 72 61 79 20 2a 2f  he data array */
4590: 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65  .  int nPrefixRe
45a0: 67 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e  g         /* No.
45b0: 20 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74 6f   of reg prior to
45c0: 20 72 65 67 44 61 74 61 20 61 76 61 69 6c 61 62   regData availab
45d0: 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b  le for use */.){
45e0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
45f0: 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4610: 20 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65      /* Stmt unde
4620: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
4630: 2f 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20 28  /.  int bSeq = (
4640: 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67  (pSort->sortFlag
4650: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
4660: 53 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69  Sorter)==0);.  i
4670: 6e 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72 74  nt nExpr = pSort
4680: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
4690: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
46a0: 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20  /* No. of ORDER 
46b0: 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e  BY terms */.  in
46c0: 74 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72 20  t nBase = nExpr 
46d0: 2b 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b 20  + bSeq + nData; 
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
46f0: 2a 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72 74  * Fields in sort
4700: 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  er record */.  i
4710: 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20  nt regBase;     
4720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4740: 2f 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72 74  /* Regs for sort
4750: 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  er record */.  i
4760: 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20 2b  nt regRecord = +
4770: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20  +pParse->nMem;  
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4790: 2f 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f 72  /* Assembled sor
47a0: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
47b0: 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f  int nOBSat = pSo
47c0: 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20  rt->nOBSat;     
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72   /* ORDER BY ter
47f0: 6d 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20  ms to skip */.  
4800: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4820: 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20     /* Opcode to 
4830: 61 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72  add sorter recor
4840: 64 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 20  d to sorter */. 
4850: 20 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20 20   int iLimit;    
4860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4870: 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f 75      /* LIMIT cou
4880: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
4890: 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53  t( bSeq==0 || bS
48a0: 65 71 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  eq==1 );.  asser
48b0: 74 28 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20 72  t( nData==1 || r
48c0: 65 67 44 61 74 61 3d 3d 72 65 67 4f 72 69 67 44  egData==regOrigD
48d0: 61 74 61 20 7c 7c 20 72 65 67 4f 72 69 67 44 61  ata || regOrigDa
48e0: 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e  ta==0 );.  if( n
48f0: 50 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20 20  PrefixReg ){.   
4900: 20 61 73 73 65 72 74 28 20 6e 50 72 65 66 69 78   assert( nPrefix
4910: 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71 20  Reg==nExpr+bSeq 
4920: 29 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d  );.    regBase =
4930: 20 72 65 67 44 61 74 61 20 2d 20 6e 45 78 70 72   regData - nExpr
4940: 20 2d 20 62 53 65 71 3b 0a 20 20 7d 65 6c 73 65   - bSeq;.  }else
4950: 7b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  {.    regBase = 
4960: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
4970: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
4980: 65 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d  em += nBase;.  }
4990: 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65  .  assert( pSele
49a0: 63 74 2d 3e 69 4f 66 66 73 65 74 3d 3d 30 20 7c  ct->iOffset==0 |
49b0: 7c 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69  | pSelect->iLimi
49c0: 74 21 3d 30 20 29 3b 0a 20 20 69 4c 69 6d 69 74  t!=0 );.  iLimit
49d0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66   = pSelect->iOff
49e0: 73 65 74 20 3f 20 70 53 65 6c 65 63 74 2d 3e 69  set ? pSelect->i
49f0: 4f 66 66 73 65 74 2b 31 20 3a 20 70 53 65 6c 65  Offset+1 : pSele
4a00: 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 70 53  ct->iLimit;.  pS
4a10: 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20 3d  ort->labelDone =
4a20: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
4a30: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 73 71 6c 69  Label(v);.  sqli
4a40: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
4a50: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ist(pParse, pSor
4a60: 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65 67  t->pOrderBy, reg
4a70: 42 61 73 65 2c 20 72 65 67 4f 72 69 67 44 61 74  Base, regOrigDat
4a80: 61 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a,.             
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
4aa0: 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 7c 20 28  ITE_ECEL_DUP | (
4ab0: 72 65 67 4f 72 69 67 44 61 74 61 3f 20 53 51 4c  regOrigData? SQL
4ac0: 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 3a 20 30  ITE_ECEL_REF : 0
4ad0: 29 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20 29  ));.  if( bSeq )
4ae0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
4af0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
4b00: 71 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69  quence, pSort->i
4b10: 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65  ECursor, regBase
4b20: 2b 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69  +nExpr);.  }.  i
4b30: 66 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 30  f( nPrefixReg==0
4b40: 20 26 26 20 6e 44 61 74 61 3e 30 20 29 7b 0a 20   && nData>0 ){. 
4b50: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
4b60: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
4b70: 65 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b  egData, regBase+
4b80: 6e 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61 74  nExpr+bSeq, nDat
4b90: 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  a);.  }.  sqlite
4ba0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4bb0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
4bc0: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
4bd0: 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 52  ase-nOBSat, regR
4be0: 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e 4f  ecord);.  if( nO
4bf0: 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e  BSat>0 ){.    in
4c00: 74 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20 20  t regPrevKey;   
4c10: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f 42  /* The first nOB
4c20: 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  Sat columns of t
4c30: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
4c40: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 46  */.    int addrF
4c50: 69 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64 72  irst;    /* Addr
4c60: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49 66  ess of the OP_If
4c70: 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  Not opcode */.  
4c80: 20 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20    int addrJmp;  
4c90: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4ca0: 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70  f the OP_Jump op
4cb0: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62 65  code */.    Vdbe
4cc0: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a  Op *pOp;      /*
4cd0: 20 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70 65   Opcode that ope
4ce0: 6e 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  ns the sorter */
4cf0: 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20  .    int nKey;  
4d00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4d10: 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79 20   of sorting key 
4d20: 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69  columns, includi
4d30: 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a  ng OP_Sequence *
4d40: 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
4d50: 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  KI;     /* Origi
4d60: 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74  nal KeyInfo on t
4d70: 68 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65 20  he sorter table 
4d80: 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72 65 76 4b  */..    regPrevK
4d90: 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ey = pParse->nMe
4da0: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
4db0: 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e  >nMem += pSort->
4dc0: 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79  nOBSat;.    nKey
4dd0: 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74   = nExpr - pSort
4de0: 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b  ->nOBSat + bSeq;
4df0: 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29 7b  .    if( bSeq ){
4e00: 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74  .      addrFirst
4e10: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4e20: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
4e30: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29  , regBase+nExpr)
4e40: 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ; .    }else{.  
4e50: 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20      addrFirst = 
4e60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4e70: 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  1(v, OP_Sequence
4e80: 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43  Test, pSort->iEC
4e90: 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
4ea0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
4eb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4ec0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
4ed0: 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b  ompare, regPrevK
4ee0: 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f  ey, regBase, pSo
4ef0: 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20  rt->nOBSat);.   
4f00: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
4f10: 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74  beGetOp(v, pSort
4f20: 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  ->addrSortIndex)
4f30: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
4f40: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
4f50: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ed ) return;.   
4f60: 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20   pOp->p2 = nKey 
4f70: 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49  + nData;.    pKI
4f80: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
4f90: 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  nfo;.    memset(
4fa0: 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  pKI->aSortOrder,
4fb0: 20 30 2c 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65   0, pKI->nKeyFie
4fc0: 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50  ld); /* Makes OP
4fd0: 5f 4a 75 6d 70 20 74 65 73 74 61 62 6c 65 20 2a  _Jump testable *
4fe0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
4ff0: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
5000: 20 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f   (char*)pKI, P4_
5010: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65  KEYINFO);.    te
5020: 73 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 41 6c  stcase( pKI->nAl
5030: 6c 46 69 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e 4b  lField > pKI->nK
5040: 65 79 46 69 65 6c 64 2b 32 20 29 3b 0a 20 20 20  eyField+2 );.   
5050: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
5060: 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
5070: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
5080: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
5090: 20 6e 4f 42 53 61 74 2c 0a 20 20 20 20 20 20 20   nOBSat,.       
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 20 20 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65      pKI->nAllFie
50d0: 6c 64 2d 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c  ld-pKI->nKeyFiel
50e0: 64 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d  d-1);.    addrJm
50f0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
5100: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
5110: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5120: 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
5130: 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20 61   addrJmp+1, 0, a
5140: 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65 43  ddrJmp+1); VdbeC
5150: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
5160: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
5170: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
5180: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
5190: 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72   pSort->regRetur
51a0: 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
51b0: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
51c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
51d0: 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65  Gosub, pSort->re
51e0: 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  gReturn, pSort->
51f0: 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20  labelBkOut);.   
5200: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5210: 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f  p1(v, OP_ResetSo
5220: 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43  rter, pSort->iEC
5230: 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ursor);.    if( 
5240: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
5250: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5260: 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69  2(v, OP_IfNot, i
5270: 4c 69 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c 61  Limit, pSort->la
5280: 62 65 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20  belDone);.      
5290: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
52a0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
52b0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
52c0: 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  , addrFirst);.  
52d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
52e0: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
52f0: 67 42 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65  gBase, regPrevKe
5300: 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  y, pSort->nOBSat
5310: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5320: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
5330: 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66  drJmp);.  }.  if
5340: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
5350: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
5360: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f  eSorter ){.    o
5370: 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  p = OP_SorterIns
5380: 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ert;.  }else{.  
5390: 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73    op = OP_IdxIns
53a0: 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ert;.  }.  sqlit
53b0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
53c0: 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45  v, op, pSort->iE
53d0: 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72  Cursor, regRecor
53e0: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
53f0: 20 20 20 20 20 20 20 20 20 20 72 65 67 42 61 73            regBas
5400: 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d  e+nOBSat, nBase-
5410: 6e 4f 42 53 61 74 29 3b 0a 20 20 69 66 28 20 69  nOBSat);.  if( i
5420: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74  Limit ){.    int
5430: 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20 72   addr;.    int r
5440: 31 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 46 69  1 = 0;.    /* Fi
5450: 6c 6c 20 74 68 65 20 73 6f 72 74 65 72 20 75 6e  ll the sorter un
5460: 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  til it contains 
5470: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 65 6e 74  LIMIT+OFFSET ent
5480: 72 69 65 73 2e 20 20 28 54 68 65 20 69 4c 69 6d  ries.  (The iLim
5490: 69 74 0a 20 20 20 20 2a 2a 20 72 65 67 69 73 74  it.    ** regist
54a0: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
54b0: 64 20 77 69 74 68 20 76 61 6c 75 65 20 6f 66 20  d with value of 
54c0: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 29 20 20  LIMIT+OFFSET.)  
54d0: 41 66 74 65 72 20 74 68 65 20 73 6f 72 74 65 72  After the sorter
54e0: 0a 20 20 20 20 2a 2a 20 66 69 6c 6c 73 20 75 70  .    ** fills up
54f0: 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 65 61  , delete the lea
5500: 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
5510: 73 6f 72 74 65 72 20 61 66 74 65 72 20 65 61 63  sorter after eac
5520: 68 20 69 6e 73 65 72 74 2e 0a 20 20 20 20 2a 2a  h insert..    **
5530: 20 54 68 75 73 20 77 65 20 6e 65 76 65 72 20 68   Thus we never h
5540: 6f 6c 64 20 6d 6f 72 65 20 74 68 61 6e 20 74 68  old more than th
5550: 65 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 72  e LIMIT+OFFSET r
5560: 6f 77 73 20 69 6e 20 6d 65 6d 6f 72 79 20 61 74  ows in memory at
5570: 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 61 64 64   once */.    add
5580: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
5590: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
55a0: 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 20  tZero, iLimit); 
55b0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
55c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
55d0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73  AddOp1(v, OP_Las
55e0: 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  t, pSort->iECurs
55f0: 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6f  or);.    if( pSo
5600: 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65  rt->bOrderedInne
5610: 72 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 72  rLoop ){.      r
5620: 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  1 = ++pParse->nM
5630: 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
5640: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5650: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 53 6f 72 74 2d  P_Column, pSort-
5660: 3e 69 45 43 75 72 73 6f 72 2c 20 6e 45 78 70 72  >iECursor, nExpr
5670: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
5680: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
5690: 71 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  q"));.    }.    
56a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
56b0: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
56c0: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29  pSort->iECursor)
56d0: 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d  ;.    if( pSort-
56e0: 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  >bOrderedInnerLo
56f0: 6f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  op ){.      /* I
5700: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
5710: 20 69 73 20 64 72 69 76 65 6e 20 62 79 20 61 6e   is driven by an
5720: 20 69 6e 64 65 78 20 73 75 63 68 20 74 68 61 74   index such that
5730: 20 76 61 6c 75 65 73 20 66 72 6f 6d 0a 20 20 20   values from.   
5740: 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 69     ** the same i
5750: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
5760: 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 72 65 20 69  inner loop are i
5770: 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20  n sorted order, 
5780: 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6d  then.      ** im
5790: 6d 65 64 69 61 74 65 6c 79 20 6a 75 6d 70 20 74  mediately jump t
57a0: 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
57b0: 74 69 6f 6e 20 6f 66 20 61 6e 20 69 6e 6e 65 72  tion of an inner
57c0: 20 6c 6f 6f 70 20 69 66 20 74 68 65 0a 20 20 20   loop if the.   
57d0: 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 72 6f 6d     ** entry from
57e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 74 65   the current ite
57f0: 72 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ration does not 
5800: 66 69 74 20 69 6e 74 6f 20 74 68 65 20 74 6f 70  fit into the top
5810: 0a 20 20 20 20 20 20 2a 2a 20 4c 49 4d 49 54 2b  .      ** LIMIT+
5820: 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 6f  OFFSET entries o
5830: 66 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f  f the sorter. */
5840: 0a 20 20 20 20 20 20 69 6e 74 20 69 42 72 6b 20  .      int iBrk 
5850: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
5860: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
5870: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5880: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
5890: 71 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  q, regBase+nExpr
58a0: 2c 20 69 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  , iBrk, r1);.   
58b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
58c0: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
58d0: 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
58e0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
58f0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5900: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
5910: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
5920: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
5930: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
5940: 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63  OFFSET.*/.static
5950: 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74   void codeOffset
5960: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
5970: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
5980: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
5990: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66   VM */.  int iOf
59a0: 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65  fset,      /* Re
59b0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
59c0: 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65  he offset counte
59d0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  r */.  int iCont
59e0: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
59f0: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
5a00: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
5a10: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66   */.){.  if( iOf
5a20: 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73 71  fset>0 ){.    sq
5a30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5a40: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66  v, OP_IfPos, iOf
5a50: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  fset, iContinue,
5a60: 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   1); VdbeCoverag
5a70: 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  e(v);.    VdbeCo
5a80: 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45  mment((v, "OFFSE
5a90: 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  T"));.  }.}../*.
5aa0: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74  ** Add code that
5ab0: 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d   will check to m
5ac0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72  ake sure the N r
5ad0: 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
5ae0: 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72  g at iMem.** for
5af0: 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74  m a distinct ent
5b00: 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73  ry.  iTab is a s
5b10: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
5b20: 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73  t holds previous
5b30: 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69  ly.** seen combi
5b40: 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e  nations of the N
5b50: 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20   values.  A new 
5b60: 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e  entry is made in
5b70: 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20   iTab.** if the 
5b80: 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73  current N values
5b90: 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20   are new..**.** 
5ba0: 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65  A jump to addrRe
5bb0: 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64  peat is made and
5bc0: 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20   the N+1 values 
5bd0: 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20  are popped from 
5be0: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20  the.** stack if 
5bf0: 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e  the top N elemen
5c00: 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69  ts are not disti
5c10: 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nct..*/.static v
5c20: 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74  oid codeDistinct
5c30: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5c40: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
5c50: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
5c60: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
5c70: 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20  .  int iTab,    
5c80: 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69        /* A sorti
5c90: 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  ng index used to
5ca0: 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e   test for distin
5cb0: 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20  ctness */.  int 
5cc0: 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f  addrRepeat,    /
5cd0: 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69  * Jump to here i
5ce0: 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a  f not distinct *
5cf0: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
5d00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5d10: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a   of elements */.
5d20: 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20    int iMem      
5d30: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c       /* First el
5d40: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  ement */.){.  Vd
5d50: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b  be *v;.  int r1;
5d60: 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ..  v = pParse->
5d70: 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71  pVdbe;.  r1 = sq
5d80: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
5d90: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
5da0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
5db0: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61  v, OP_Found, iTa
5dc0: 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69  b, addrRepeat, i
5dd0: 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76  Mem, N); VdbeCov
5de0: 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
5df0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5e00: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
5e10: 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20  iMem, N, r1);.  
5e20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5e30: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
5e40: 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 2c 20  sert, iTab, r1, 
5e50: 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69  iMem, N);.  sqli
5e60: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
5e70: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
5e80: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69  KRESULT);.  sqli
5e90: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5ea0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
5eb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5ec0: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
5ed0: 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  he code for the 
5ee0: 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e  inside of the in
5ef0: 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61  ner loop.** of a
5f00: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49   SELECT..**.** I
5f10: 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67 61  f srcTab is nega
5f20: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70  tive, then the p
5f30: 2d 3e 70 45 4c 69 73 74 20 65 78 70 72 65 73 73  ->pEList express
5f40: 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c  ions.** are eval
5f50: 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  uated in order t
5f60: 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66  o get the data f
5f70: 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66  or this row.  If
5f80: 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65   srcTab is.** ze
5f90: 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e  ro or more, then
5fa0: 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20   data is pulled 
5fb0: 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20  from srcTab and 
5fc0: 70 2d 3e 70 45 4c 69 73 74 20 69 73 20 75 73 65  p->pEList is use
5fd0: 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67 65  d only .** to ge
5fe0: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
5ff0: 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20  columns and the 
6000: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
6010: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
6020: 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  mn..*/.static vo
6030: 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  id selectInnerLo
6040: 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  op(.  Parse *pPa
6050: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
6060: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
6070: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
6080: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
6090: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65   /* The complete
60a0: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
60b0: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
60c0: 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20  .  int srcTab,  
60d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
60e0: 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  ll data from thi
60f0: 73 20 74 61 62 6c 65 20 69 66 20 6e 6f 6e 2d 6e  s table if non-n
6100: 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 53 6f 72  egative */.  Sor
6110: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
6120: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
6130: 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77  ULL, info on how
6140: 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52 44 45   to process ORDE
6150: 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e  R BY */.  Distin
6160: 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e 63 74  ctCtx *pDistinct
6170: 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  , /* If not NULL
6180: 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  , info on how to
6190: 20 70 72 6f 63 65 73 73 20 44 49 53 54 49 4e 43   process DISTINC
61a0: 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  T */.  SelectDes
61b0: 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
61c0: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
61d0: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
61e0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
61f0: 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ue,          /* 
6200: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e  Jump here to con
6210: 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20  tinue with next 
6220: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  row */.  int iBr
6230: 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  eak             
6240: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
6250: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
6260: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a  e inner loop */.
6270: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
6280: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
6290: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73  int i;.  int has
62a0: 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
62b0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
62c0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
62d0: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
62e0: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
62f0: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20   pDest->eDest;  
6300: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
6310: 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f  se of results */
6320: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
6330: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f  Dest->iSDParm; /
6340: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
6350: 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74   to disposal met
6360: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  hod */.  int nRe
6370: 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  sultCol;        
6380: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6390: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
63a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69   */.  int nPrefi
63b0: 78 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  xReg = 0;       
63c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
63d0: 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 62  xtra registers b
63e0: 65 66 6f 72 65 20 72 65 67 52 65 73 75 6c 74 20  efore regResult 
63f0: 2a 2f 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79  */..  /* Usually
6400: 2c 20 72 65 67 52 65 73 75 6c 74 20 69 73 20 74  , regResult is t
6410: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e  he first cell in
6420: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6d 65 6d   an array of mem
6430: 6f 72 79 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 63  ory cells.  ** c
6440: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75  ontaining the cu
6450: 72 72 65 6e 74 20 72 65 73 75 6c 74 20 72 6f 77  rrent result row
6460: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72  . In this case r
6470: 65 67 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f  egOrig is set to
6480: 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76   the.  ** same v
6490: 61 6c 75 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  alue. However, i
64a0: 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72  f the results ar
64b0: 65 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20  e being sent to 
64c0: 74 68 65 20 73 6f 72 74 65 72 2c 20 74 68 65 0a  the sorter, the.
64d0: 20 20 2a 2a 20 76 61 6c 75 65 73 20 66 6f 72 20    ** values for 
64e0: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 73 20  any expressions 
64f0: 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 70 61  that are also pa
6500: 72 74 20 6f 66 20 74 68 65 20 73 6f 72 74 2d 6b  rt of the sort-k
6510: 65 79 20 61 72 65 20 6f 6d 69 74 74 65 64 0a 20  ey are omitted. 
6520: 20 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20 61 72   ** from this ar
6530: 72 61 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ray. In this cas
6540: 65 20 72 65 67 4f 72 69 67 20 69 73 20 73 65 74  e regOrig is set
6550: 20 74 6f 20 7a 65 72 6f 2e 20 20 2a 2f 0a 20 20   to zero.  */.  
6560: 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20  int regResult;  
6570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
6580: 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68  tart of memory h
6590: 6f 6c 64 69 6e 67 20 63 75 72 72 65 6e 74 20 72  olding current r
65a0: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
65b0: 72 65 67 4f 72 69 67 3b 20 20 20 20 20 20 20 20  regOrig;        
65c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
65d0: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69   of memory holdi
65e0: 6e 67 20 66 75 6c 6c 20 72 65 73 75 6c 74 20 28  ng full result (
65f0: 6f 72 20 30 29 20 2a 2f 0a 0a 20 20 61 73 73 65  or 0) */..  asse
6600: 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72  rt( v );.  asser
6610: 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20  t( p->pEList!=0 
6620: 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74  );.  hasDistinct
6630: 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70   = pDistinct ? p
6640: 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54  Distinct->eTnctT
6650: 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54  ype : WHERE_DIST
6660: 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28  INCT_NOOP;.  if(
6670: 20 70 53 6f 72 74 20 26 26 20 70 53 6f 72 74 2d   pSort && pSort-
6680: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 70  >pOrderBy==0 ) p
6690: 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Sort = 0;.  if( 
66a0: 70 53 6f 72 74 3d 3d 30 20 26 26 20 21 68 61 73  pSort==0 && !has
66b0: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
66c0: 61 73 73 65 72 74 28 20 69 43 6f 6e 74 69 6e 75  assert( iContinu
66d0: 65 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64 65  e!=0 );.    code
66e0: 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
66f0: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29  fset, iContinue)
6700: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c  ;.  }..  /* Pull
6710: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
6720: 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e  olumns..  */.  n
6730: 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 2d 3e 70  ResultCol = p->p
6740: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20  EList->nExpr;.. 
6750: 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
6760: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  t==0 ){.    if( 
6770: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 6e  pSort ){.      n
6780: 50 72 65 66 69 78 52 65 67 20 3d 20 70 53 6f 72  PrefixReg = pSor
6790: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
67a0: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 21 28  pr;.      if( !(
67b0: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
67c0: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
67d0: 6f 72 74 65 72 29 20 29 20 6e 50 72 65 66 69 78  orter) ) nPrefix
67e0: 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61  Reg++;.      pPa
67f0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72  rse->nMem += nPr
6800: 65 66 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20  efixReg;.    }. 
6810: 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20     pDest->iSdst 
6820: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
6830: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
6840: 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  em += nResultCol
6850: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44  ;.  }else if( pD
6860: 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75  est->iSdst+nResu
6870: 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e  ltCol > pParse->
6880: 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54  nMem ){.    /* T
6890: 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 20  his is an error 
68a0: 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61 74 20 63  condition that c
68b0: 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f 72 20 65  an result, for e
68c0: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 53  xample, when a S
68d0: 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20  ELECT.    ** on 
68e0: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
68f0: 69 64 65 20 6f 66 20 61 6e 20 49 4e 53 45 52 54  ide of an INSERT
6900: 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72   contains more r
6910: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68  esult columns th
6920: 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20  an.    ** there 
6930: 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  are columns in t
6940: 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
6950: 6c 65 66 74 2e 20 20 54 68 65 20 65 72 72 6f 72  left.  The error
6960: 20 77 69 6c 6c 20 62 65 20 63 61 75 67 68 74 0a   will be caught.
6970: 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72      ** and repor
6980: 74 65 64 20 6c 61 74 65 72 2e 20 20 42 75 74 20  ted later.  But 
6990: 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  we need to make 
69a0: 73 75 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f  sure enough memo
69b0: 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a  ry is allocated.
69c0: 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20      ** to avoid 
69d0: 6f 74 68 65 72 20 73 70 75 72 69 6f 75 73 20 65  other spurious e
69e0: 72 72 6f 72 73 20 69 6e 20 74 68 65 20 6d 65 61  rrors in the mea
69f0: 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50  ntime. */.    pP
6a00: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
6a10: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20  esultCol;.  }.  
6a20: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e  pDest->nSdst = n
6a30: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67  ResultCol;.  reg
6a40: 4f 72 69 67 20 3d 20 72 65 67 52 65 73 75 6c 74  Orig = regResult
6a50: 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b   = pDest->iSdst;
6a60: 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30  .  if( srcTab>=0
6a70: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
6a80: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
6a90: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
6aa0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6ab0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61  OP_Column, srcTa
6ac0: 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b  b, i, regResult+
6ad0: 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  i);.      VdbeCo
6ae0: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
6af0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  p->pEList->a[i].
6b00: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
6b10: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
6b20: 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a  !=SRT_Exists ){.
6b30: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
6b40: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20  stination is an 
6b50: 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72  EXISTS(...) expr
6b60: 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75  ession, the actu
6b70: 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  al.    ** values
6b80: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
6b90: 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20   SELECT are not 
6ba0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
6bb0: 0a 20 20 20 20 75 38 20 65 63 65 6c 46 6c 61 67  .    u8 ecelFlag
6bc0: 73 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74  s;.    if( eDest
6bd0: 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
6be0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
6bf0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
6c00: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
6c10: 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c 49  ecelFlags = SQLI
6c20: 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20 20  TE_ECEL_DUP;.   
6c30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 63   }else{.      ec
6c40: 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  elFlags = 0;.   
6c50: 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74   }.    if( pSort
6c60: 20 26 26 20 68 61 73 44 69 73 74 69 6e 63 74 3d   && hasDistinct=
6c70: 3d 30 20 26 26 20 65 44 65 73 74 21 3d 53 52 54  =0 && eDest!=SRT
6c80: 5f 45 70 68 65 6d 54 61 62 20 26 26 20 65 44 65  _EphemTab && eDe
6c90: 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b  st!=SRT_Table ){
6ca0: 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61  .      /* For ea
6cb0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
6cc0: 20 70 2d 3e 70 45 4c 69 73 74 20 74 68 61 74 20   p->pEList that 
6cd0: 69 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20  is a copy of an 
6ce0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 0a 20 20  expression in.  
6cf0: 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52      ** the ORDER
6d00: 20 42 59 20 63 6c 61 75 73 65 20 28 70 53 6f 72   BY clause (pSor
6d10: 74 2d 3e 70 4f 72 64 65 72 42 79 29 2c 20 73 65  t->pOrderBy), se
6d20: 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  t the associated
6d30: 20 0a 20 20 20 20 20 20 2a 2a 20 69 4f 72 64 65   .      ** iOrde
6d40: 72 42 79 43 6f 6c 20 76 61 6c 75 65 20 74 6f 20  rByCol value to 
6d50: 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68  one more than th
6d60: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 4f  e index of the O
6d70: 52 44 45 52 20 42 59 20 0a 20 20 20 20 20 20 2a  RDER BY .      *
6d80: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  * expression wit
6d90: 68 69 6e 20 74 68 65 20 73 6f 72 74 2d 6b 65 79  hin the sort-key
6da0: 20 74 68 61 74 20 70 75 73 68 4f 6e 74 6f 53 6f   that pushOntoSo
6db0: 72 74 65 72 28 29 20 77 69 6c 6c 20 67 65 6e 65  rter() will gene
6dc0: 72 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54  rate..      ** T
6dd0: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 70  his allows the p
6de0: 2d 3e 70 45 4c 69 73 74 20 66 69 65 6c 64 20 74  ->pEList field t
6df0: 6f 20 62 65 20 6f 6d 69 74 74 65 64 20 66 72 6f  o be omitted fro
6e00: 6d 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 63  m the sorted rec
6e10: 6f 72 64 2c 0a 20 20 20 20 20 20 2a 2a 20 73 61  ord,.      ** sa
6e20: 76 69 6e 67 20 73 70 61 63 65 20 61 6e 64 20 43  ving space and C
6e30: 50 55 20 63 79 63 6c 65 73 2e 20 20 2a 2f 0a 20  PU cycles.  */. 
6e40: 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20 7c       ecelFlags |
6e50: 3d 20 28 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f  = (SQLITE_ECEL_O
6e60: 4d 49 54 52 45 46 7c 53 51 4c 49 54 45 5f 45 43  MITREF|SQLITE_EC
6e70: 45 4c 5f 52 45 46 29 3b 0a 20 20 20 20 20 20 66  EL_REF);.      f
6e80: 6f 72 28 69 3d 70 53 6f 72 74 2d 3e 6e 4f 42 53  or(i=pSort->nOBS
6e90: 61 74 3b 20 69 3c 70 53 6f 72 74 2d 3e 70 4f 72  at; i<pSort->pOr
6ea0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
6eb0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
6ec0: 6a 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  j;.        if( (
6ed0: 6a 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65  j = pSort->pOrde
6ee0: 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f  rBy->a[i].u.x.iO
6ef0: 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a  rderByCol)>0 ){.
6f00: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c            p->pEL
6f10: 69 73 74 2d 3e 61 5b 6a 2d 31 5d 2e 75 2e 78 2e  ist->a[j-1].u.x.
6f20: 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 69 2b  iOrderByCol = i+
6f30: 31 2d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  1-pSort->nOBSat;
6f40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6f50: 20 7d 0a 20 20 20 20 20 20 72 65 67 4f 72 69 67   }.      regOrig
6f60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
6f70: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  rt( eDest==SRT_S
6f80: 65 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  et || eDest==SRT
6f90: 5f 4d 65 6d 20 0a 20 20 20 20 20 20 20 20 20 20  _Mem .          
6fa0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
6fb0: 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65 73  oroutine || eDes
6fc0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
6fd0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 52 65 73 75  .    }.    nResu
6fe0: 6c 74 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 45  ltCol = sqlite3E
6ff0: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
7000: 70 50 61 72 73 65 2c 70 2d 3e 70 45 4c 69 73 74  pParse,p->pEList
7010: 2c 72 65 67 52 65 73 75 6c 74 2c 0a 20 20 20 20  ,regResult,.    
7020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7040: 20 20 20 20 20 30 2c 65 63 65 6c 46 6c 61 67 73       0,ecelFlags
7050: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
7060: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
7070: 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74  word was present
7080: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
7090: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e  tatement.  ** an
70a0: 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62  d this row has b
70b0: 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c  een seen before,
70c0: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b   then do not mak
70d0: 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20  e this row.  ** 
70e0: 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  part of the resu
70f0: 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68  lt..  */.  if( h
7100: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
7110: 20 20 73 77 69 74 63 68 28 20 70 44 69 73 74 69    switch( pDisti
7120: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29  nct->eTnctType )
7130: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  {.      case WHE
7140: 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
7150: 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56  RED: {.        V
7160: 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20  dbeOp *pOp;     
7170: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e         /* No lon
7180: 67 65 72 20 72 65 71 75 69 72 65 64 20 4f 70 65  ger required Ope
7190: 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
71a0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
71b0: 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20   iJump;         
71c0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73       /* Jump des
71d0: 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  tination */.    
71e0: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b      int regPrev;
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7200: 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74  revious row cont
7210: 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ent */..        
7220: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
7230: 65 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  e for the previo
7240: 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  us row */.      
7250: 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72    regPrev = pPar
7260: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
7270: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
7280: 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a   += nResultCol;.
7290: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  .        /* Chan
72a0: 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
72b0: 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61  hemeral coded ea
72c0: 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e  rlier to an OP_N
72d0: 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  ull.        ** s
72e0: 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61  ets the MEM_Clea
72f0: 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66  red bit on the f
7300: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 6f 66  irst register of
7310: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
7320: 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20  previous value. 
7330: 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
7340: 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77   the OP_Ne below
7350: 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20   to always.     
7360: 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68     ** fail on th
7370: 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
7380: 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76  n of the loop ev
7390: 65 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  en if the first.
73a0: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69          ** row i
73b0: 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20  s all NULLs..   
73c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
73d0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
73e0: 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74  eToNoop(v, pDist
73f0: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
7400: 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73  .        pOp = s
7410: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
7420: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
7430: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
7440: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
7450: 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  P_Null;.        
7460: 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20  pOp->p1 = 1;.   
7470: 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72       pOp->p2 = r
7480: 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20  egPrev;..       
7490: 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33   iJump = sqlite3
74a0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
74b0: 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  v) + nResultCol;
74c0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
74d0: 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  ; i<nResultCol; 
74e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
74f0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
7500: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
7510: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
7520: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
7530: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
7540: 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31  ( i<nResultCol-1
7550: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7560: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7570: 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52  3(v, OP_Ne, regR
7580: 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20  esult+i, iJump, 
7590: 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20  regPrev+i);.    
75a0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
75b0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
75c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
75d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
75e0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71  eAddOp3(v, OP_Eq
75f0: 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69  , regResult+i, i
7600: 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65  Continue, regPre
7610: 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  v+i);.          
7620: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
7630: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a  );.           }.
7640: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7650: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
7660: 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72   -1, (const char
7670: 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
7680: 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20  LSEQ);.         
7690: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
76a0: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
76b0: 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20  ULLEQ);.        
76c0: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
76d0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  ( sqlite3VdbeCur
76e0: 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75  rentAddr(v)==iJu
76f0: 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  mp || pParse->db
7700: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7710: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7720: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
7730: 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c  P_Copy, regResul
7740: 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73  t, regPrev, nRes
7750: 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20  ultCol-1);.     
7760: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7770: 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  }..      case WH
7780: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
7790: 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  QUE: {.        s
77a0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
77b0: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
77c0: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
77d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
77e0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65       }..      de
77f0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
7800: 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e   assert( pDistin
7810: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57  ct->eTnctType==W
7820: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
7830: 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20  ORDERED );.     
7840: 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
7850: 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63  pParse, pDistinc
7860: 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e  t->tabTnct, iCon
7870: 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f  tinue, nResultCo
7880: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
7890: 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c          regResul
78a0: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
78b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
78c0: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 3d 3d  .    if( pSort==
78d0: 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f  0 ){.      codeO
78e0: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
78f0: 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  set, iContinue);
7900: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77  .    }.  }..  sw
7910: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
7920: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f     /* In this mo
7930: 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71  de, write each q
7940: 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74  uery result to t
7950: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65  he key of the te
7960: 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74  mporary.    ** t
7970: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
7980: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
7990: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
79a0: 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20  SELECT.    case 
79b0: 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20  SRT_Union: {.   
79c0: 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
79d0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
79e0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
79f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7a00: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
7a10: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
7a20: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
7a30: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
7a40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
7a50: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
7a60: 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 65  t, iParm, r1, re
7a70: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
7a80: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Col);.      sqli
7a90: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
7aa0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
7ab0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7ac0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  }..    /* Constr
7ad0: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
7ae0: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
7af0: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
7b00: 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  of.    ** saving
7b10: 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73   that record, us
7b20: 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f  e it as a key to
7b30: 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73   delete elements
7b40: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
7b50: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
7b60: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
7b70: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
7b80: 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  pt: {.      sqli
7b90: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7ba0: 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69   OP_IdxDelete, i
7bb0: 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c  Parm, regResult,
7bc0: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
7bd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7be0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7bf0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
7c00: 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f  SELECT */..    /
7c10: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
7c20: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
7c30: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
7c40: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
7c50: 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61 73  RT_Fifo:.    cas
7c60: 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a  e SRT_DistFifo:.
7c70: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
7c80: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
7c90: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
7ca0: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
7cb0: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
7cc0: 70 50 61 72 73 65 2c 20 6e 50 72 65 66 69 78 52  pParse, nPrefixR
7cd0: 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 74 65 73  eg+1);.      tes
7ce0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
7cf0: 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  T_Table );.     
7d00: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
7d10: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
7d20: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7d30: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66  ( eDest==SRT_Fif
7d40: 6f 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  o );.      testc
7d50: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
7d60: 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 20 20  DistFifo );.    
7d70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7d80: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
7d90: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
7da0: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b   nResultCol, r1+
7db0: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 23 69 66  nPrefixReg);.#if
7dc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7dd0: 5f 43 54 45 0a 20 20 20 20 20 20 69 66 28 20 65  _CTE.      if( e
7de0: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69  Dest==SRT_DistFi
7df0: 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  fo ){.        /*
7e00: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
7e10: 69 6f 6e 20 69 73 20 44 69 73 74 46 69 66 6f 2c  ion is DistFifo,
7e20: 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50   then cursor (iP
7e30: 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20  arm+1) is open. 
7e40: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20         ** on an 
7e50: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e  ephemeral index.
7e60: 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
7e70: 72 6f 77 20 69 73 20 61 6c 72 65 61 64 79 20 70  row is already p
7e80: 72 65 73 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  resent.        *
7e90: 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20  * in the index, 
7ea0: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20  do not write it 
7eb0: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 49  to the output. I
7ec0: 66 20 6e 6f 74 2c 20 61 64 64 20 74 68 65 0a 20  f not, add the. 
7ed0: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
7ee0: 74 20 72 6f 77 20 74 6f 20 74 68 65 20 69 6e 64  t row to the ind
7ef0: 65 78 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77  ex and proceed w
7f00: 69 74 68 20 77 72 69 74 69 6e 67 20 69 74 20 74  ith writing it t
7f10: 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
7f20: 20 6f 75 74 70 75 74 20 74 61 62 6c 65 20 61 73   output table as
7f30: 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20   well.  */.     
7f40: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
7f50: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
7f60: 41 64 64 72 28 76 29 20 2b 20 34 3b 0a 20 20 20  Addr(v) + 4;.   
7f70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7f80: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
7f90: 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20  Found, iParm+1, 
7fa0: 61 64 64 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20  addr, r1, 0);.  
7fb0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
7fc0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
7fd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
7fe0: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
7ff0: 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31  ert, iParm+1, r1
8000: 2c 72 65 67 52 65 73 75 6c 74 2c 6e 52 65 73 75  ,regResult,nResu
8010: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
8020: 61 73 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30  assert( pSort==0
8030: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
8040: 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  if.      if( pSo
8050: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  rt ){.        pu
8060: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
8070: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
8080: 31 2b 6e 50 72 65 66 69 78 52 65 67 2c 72 65 67  1+nPrefixReg,reg
8090: 52 65 73 75 6c 74 2c 31 2c 6e 50 72 65 66 69 78  Result,1,nPrefix
80a0: 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
80b0: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e{.        int r
80c0: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
80d0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
80e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
80f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
8100: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
8110: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r2);.        sql
8120: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8130: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
8140: 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
8150: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8160: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
8170: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
8180: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
8190: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
81a0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
81b0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
81c0: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
81d0: 72 73 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78  rse, r1, nPrefix
81e0: 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72  Reg+1);.      br
81f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
8200: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8210: 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
8220: 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
8230: 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
8240: 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
8250: 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
8260: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
8270: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
8280: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
8290: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
82a0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
82b0: 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
82c0: 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
82d0: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
82e0: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
82f0: 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74  .      if( pSort
8300: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
8310: 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79  t first glance y
8320: 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77  ou would think w
8330: 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65  e could optimize
8340: 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 20   out the.       
8350: 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20   ** ORDER BY in 
8360: 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65 20  this case since 
8370: 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74  the order of ent
8380: 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a  ries in the set.
8390: 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20          ** does 
83a0: 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74  not matter.  But
83b0: 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   there might be 
83c0: 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20  a LIMIT clause, 
83d0: 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  in which.       
83e0: 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64   ** case the ord
83f0: 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a  er does matter *
8400: 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  /.        pushOn
8410: 74 6f 53 6f 72 74 65 72 28 0a 20 20 20 20 20 20  toSorter(.      
8420: 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53        pParse, pS
8430: 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c  ort, p, regResul
8440: 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73  t, regOrig, nRes
8450: 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52  ultCol, nPrefixR
8460: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
8470: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  {.        int r1
8480: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
8490: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
84a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
84b0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44  lite3Strlen30(pD
84c0: 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 3d 3d  est->zAffSdst)==
84d0: 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a 20 20  nResultCol );.  
84e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
84f0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
8500: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
8510: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  ult, nResultCol,
8520: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 31   .            r1
8530: 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73  , pDest->zAffSds
8540: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
8550: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
8560: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
8570: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
8580: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
8590: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
85a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
85b0: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
85c0: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
85d0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
85e0: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
85f0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
8600: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
8610: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8620: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
8630: 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77     /* If any row
8640: 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65   exist in the re
8650: 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64  sult set, record
8660: 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61   that fact and a
8670: 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  bort..    */.   
8680: 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73   case SRT_Exists
8690: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
86a0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
86b0: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50  P_Integer, 1, iP
86c0: 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  arm);.      /* T
86d0: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
86e0: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
86f0: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
8700: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
8710: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
8720: 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72  this is a scalar
8730: 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20   select that is 
8740: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
8750: 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ssion, then.    
8760: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
8770: 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
8780: 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
8790: 65 6c 6c 20 6f 72 20 61 72 72 61 79 20 6f 66 20  ell or array of 
87a0: 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63  .    ** memory c
87b0: 65 6c 6c 73 20 61 6e 64 20 62 72 65 61 6b 20 6f  ells and break o
87c0: 75 74 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ut of the scan l
87d0: 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
87e0: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
87f0: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
8800: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
8810: 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3c 3d 70  t( nResultCol<=p
8820: 44 65 73 74 2d 3e 6e 53 64 73 74 20 29 3b 0a 20  Dest->nSdst );. 
8830: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
8840: 6f 72 74 65 72 28 0a 20 20 20 20 20 20 20 20 20  orter(.         
8850: 20 20 20 70 50 61 72 73 65 2c 20 70 53 6f 72 74     pParse, pSort
8860: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  , p, regResult, 
8870: 72 65 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74  regOrig, nResult
8880: 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65 67 29  Col, nPrefixReg)
8890: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
88a0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
88b0: 52 65 73 75 6c 74 43 6f 6c 3d 3d 70 44 65 73 74  ResultCol==pDest
88c0: 2d 3e 6e 53 64 73 74 20 29 3b 0a 20 20 20 20 20  ->nSdst );.     
88d0: 20 20 20 61 73 73 65 72 74 28 20 72 65 67 52 65     assert( regRe
88e0: 73 75 6c 74 3d 3d 69 50 61 72 6d 20 29 3b 0a 20  sult==iParm );. 
88f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49         /* The LI
8900: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
8910: 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  jump out of the 
8920: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
8930: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
8940: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
8950: 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
8960: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
8970: 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53 52   */..    case SR
8980: 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20  T_Coroutine:    
8990: 20 20 20 2f 2a 20 53 65 6e 64 20 64 61 74 61 20     /* Send data 
89a0: 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  to a co-routine 
89b0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
89c0: 4f 75 74 70 75 74 3a 20 7b 20 20 20 20 20 20 20  Output: {       
89d0: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72   /* Return the r
89e0: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20  esults */.      
89f0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
8a00: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
8a10: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8a20: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
8a30: 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  put );.      if(
8a40: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
8a50: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
8a60: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20  (pParse, pSort, 
8a70: 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65  p, regResult, re
8a80: 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f  gOrig, nResultCo
8a90: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
8aa0: 20 20 20 20 20 20 20 20 20 20 6e 50 72 65 66 69            nPrefi
8ab0: 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xReg);.      }el
8ac0: 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  se if( eDest==SR
8ad0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
8ae0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8af0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
8b00: 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44  ield, pDest->iSD
8b10: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Parm);.      }el
8b20: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
8b30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8b40: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72   OP_ResultRow, r
8b50: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
8b60: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
8b70: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
8b80: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
8b90: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
8ba0: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
8bb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
8bc0: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
8bd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
8be0: 45 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  E.    /* Write t
8bf0: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  he results into 
8c00: 61 20 70 72 69 6f 72 69 74 79 20 71 75 65 75 65  a priority queue
8c10: 20 74 68 61 74 20 69 73 20 6f 72 64 65 72 20 61   that is order a
8c20: 63 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20 20 20  ccording to.    
8c30: 2a 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72  ** pDest->pOrder
8c40: 42 79 20 28 69 6e 20 70 53 4f 29 2e 20 20 70 44  By (in pSO).  pD
8c50: 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e  est->iSDParm (in
8c60: 20 69 50 61 72 6d 29 20 69 73 20 74 68 65 20 63   iParm) is the c
8c70: 75 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20  ursor for an.   
8c80: 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 70   ** index with p
8c90: 53 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75  SO->nExpr+2 colu
8ca0: 6d 6e 73 2e 20 20 42 75 69 6c 64 20 61 20 6b 65  mns.  Build a ke
8cb0: 79 20 75 73 69 6e 67 20 70 53 4f 20 66 6f 72 20  y using pSO for 
8cc0: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a  the first.    **
8cd0: 20 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75   pSO->nExpr colu
8ce0: 6d 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  mns, then make s
8cf0: 75 72 65 20 61 6c 6c 20 6b 65 79 73 20 61 72 65  ure all keys are
8d00: 20 75 6e 69 71 75 65 20 62 79 20 61 64 64 69 6e   unique by addin
8d10: 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c  g a.    ** final
8d20: 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c   OP_Sequence col
8d30: 75 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74 20 63  umn.  The last c
8d40: 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 72 65 63  olumn is the rec
8d50: 6f 72 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20  ord as a blob.. 
8d60: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
8d70: 52 54 5f 44 69 73 74 51 75 65 75 65 3a 0a 20 20  RT_DistQueue:.  
8d80: 20 20 63 61 73 65 20 53 52 54 5f 51 75 65 75 65    case SRT_Queue
8d90: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b  : {.      int nK
8da0: 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  ey;.      int r1
8db0: 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20 20 20 20  , r2, r3;.      
8dc0: 69 6e 74 20 61 64 64 72 54 65 73 74 20 3d 20 30  int addrTest = 0
8dd0: 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  ;.      ExprList
8de0: 20 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f   *pSO;.      pSO
8df0: 20 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72   = pDest->pOrder
8e00: 42 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  By;.      assert
8e10: 28 20 70 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e  ( pSO );.      n
8e20: 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72  Key = pSO->nExpr
8e30: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
8e40: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
8e50: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 32  Parse);.      r2
8e60: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
8e70: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
8e80: 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 72 33  Key+2);.      r3
8e90: 20 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20   = r2+nKey+1;.  
8ea0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
8eb0: 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a  RT_DistQueue ){.
8ec0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
8ed0: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
8ee0: 20 44 69 73 74 51 75 65 75 65 2c 20 74 68 65 6e   DistQueue, then
8ef0: 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31   cursor (iParm+1
8f00: 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20  ) is open.      
8f10: 20 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64    ** on a second
8f20: 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
8f30: 20 74 68 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20   that holds all 
8f40: 76 61 6c 75 65 73 20 65 76 65 72 79 20 70 72 65  values every pre
8f50: 76 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 20 20  viously.        
8f60: 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ** added to the 
8f70: 71 75 65 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20  queue. */.      
8f80: 20 20 61 64 64 72 54 65 73 74 20 3d 20 73 71 6c    addrTest = sql
8f90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
8fa0: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
8fb0: 50 61 72 6d 2b 31 2c 20 30 2c 20 0a 20 20 20 20  Parm+1, 0, .    
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fe0: 20 20 20 20 72 65 67 52 65 73 75 6c 74 2c 20 6e      regResult, n
8ff0: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
9000: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
9010: 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
9020: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9030: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
9040: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
9050: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33  , nResultCol, r3
9060: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
9070: 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st==SRT_DistQueu
9080: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
9090: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
90a0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
90b0: 69 50 61 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20  iParm+1, r3);.  
90c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
90d0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
90e0: 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
90f0: 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T);.      }.    
9100: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65    for(i=0; i<nKe
9110: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
9120: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9130: 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a  p2(v, OP_SCopy,.
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9150: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
9160: 75 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e  ult + pSO->a[i].
9170: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
9180: 2d 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  - 1,.           
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
91a0: 32 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  2+i);.      }.  
91b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
91c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp2(v, OP_Sequ
91d0: 65 6e 63 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b  ence, iParm, r2+
91e0: 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 73 71 6c  nKey);.      sql
91f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
9200: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
9210: 20 72 32 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29   r2, nKey+2, r1)
9220: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9230: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
9240: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
9250: 61 72 6d 2c 20 72 31 2c 20 72 32 2c 20 6e 4b 65  arm, r1, r2, nKe
9260: 79 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  y+2);.      if( 
9270: 61 64 64 72 54 65 73 74 20 29 20 73 71 6c 69 74  addrTest ) sqlit
9280: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
9290: 2c 20 61 64 64 72 54 65 73 74 29 3b 0a 20 20 20  , addrTest);.   
92a0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
92b0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
92c0: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
92d0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
92e0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 32 2c 20  nge(pParse, r2, 
92f0: 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 62  nKey+2);.      b
9300: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
9310: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
9320: 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20  T_CTE */....#if 
9330: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9340: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20  OMIT_TRIGGER).  
9350: 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
9360: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20   results.  This 
9370: 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45  is used for SELE
9380: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  CT statements in
9390: 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  side.    ** the 
93a0: 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45  body of a TRIGGE
93b0: 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  R.  The purpose 
93c0: 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20  of such selects 
93d0: 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a  is to call.    *
93e0: 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  * user-defined f
93f0: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  unctions that ha
9400: 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e  ve side effects.
9410: 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65    We do not care
9420: 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68  .    ** about th
9430: 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73  e actual results
9440: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a   of the select..
9450: 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
9460: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
9470: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  rt( eDest==SRT_D
9480: 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20  iscard );.      
9490: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
94a0: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  dif.  }..  /* Ju
94b0: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
94c0: 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
94d0: 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
94e0: 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20  d.  Except, if. 
94f0: 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 73   ** there is a s
9500: 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20  orter, in which 
9510: 63 61 73 65 20 74 68 65 20 73 6f 72 74 65 72 20  case the sorter 
9520: 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69  has already limi
9530: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74  ted.  ** the out
9540: 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f  put for us..  */
9550: 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20  .  if( pSort==0 
9560: 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  && p->iLimit ){.
9570: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9580: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
9590: 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  JumpZero, p->iLi
95a0: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  mit, iBreak); Vd
95b0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
95c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
95d0: 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f  cate a KeyInfo o
95e0: 62 6a 65 63 74 20 73 75 66 66 69 63 69 65 6e 74  bject sufficient
95f0: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66   for an index of
9600: 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61   N key columns a
9610: 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f  nd.** X extra co
9620: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  lumns..*/.KeyInf
9630: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
9640: 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a  oAlloc(sqlite3 *
9650: 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58  db, int N, int X
9660: 29 7b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  ){.  int nExtra 
9670: 3d 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28  = (N+X)*(sizeof(
9680: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 2d 20 73  CollSeq*)+1) - s
9690: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 3b  izeof(CollSeq*);
96a0: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20  .  KeyInfo *p = 
96b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
96c0: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
96d0: 4b 65 79 49 6e 66 6f 29 20 2b 20 6e 45 78 74 72  KeyInfo) + nExtr
96e0: 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  a);.  if( p ){. 
96f0: 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72     p->aSortOrder
9700: 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c   = (u8*)&p->aCol
9710: 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e  l[N+X];.    p->n
9720: 4b 65 79 46 69 65 6c 64 20 3d 20 28 75 31 36 29  KeyField = (u16)
9730: 4e 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 46 69  N;.    p->nAllFi
9740: 65 6c 64 20 3d 20 28 75 31 36 29 28 4e 2b 58 29  eld = (u16)(N+X)
9750: 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45  ;.    p->enc = E
9760: 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64  NC(db);.    p->d
9770: 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e  b = db;.    p->n
9780: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d  Ref = 1;.    mem
9790: 73 65 74 28 26 70 5b 31 5d 2c 20 30 2c 20 6e 45  set(&p[1], 0, nE
97a0: 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xtra);.  }else{.
97b0: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
97c0: 75 6c 74 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ult(db);.  }.  r
97d0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
97e0: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b  * Deallocate a K
97f0: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
9800: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79  .void sqlite3Key
9810: 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66  InfoUnref(KeyInf
9820: 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  o *p){.  if( p )
9830: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
9840: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70  >nRef>0 );.    p
9850: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
9860: 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73  ( p->nRef==0 ) s
9870: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 70  qlite3DbFreeNN(p
9880: 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  ->db, p);.  }.}.
9890: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65  ./*.** Make a ne
98a0: 77 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  w pointer to a K
98b0: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
98c0: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
98d0: 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49  3KeyInfoRef(KeyI
98e0: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  nfo *p){.  if( p
98f0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9900: 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  p->nRef>0 );.   
9910: 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a   p->nRef++;.  }.
9920: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23    return p;.}..#
9930: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
9940: 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
9950: 54 52 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66  TRUE if a KeyInf
9960: 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20  o object can be 
9970: 63 68 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79  change.  The Key
9980: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63  Info object.** c
9990: 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67  an only be chang
99a0: 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6a 75  ed if this is ju
99b0: 73 74 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65  st a single refe
99c0: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a  rence to the obj
99d0: 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ect..**.** This 
99e0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
99f0: 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61  only inside of a
9a00: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
9a10: 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
9a20: 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
9a30: 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29  able(KeyInfo *p)
9a40: 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66  { return p->nRef
9a50: 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  ==1; }.#endif /*
9a60: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
9a70: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
9a80: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
9a90: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79  , generate a Key
9aa0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
9ab0: 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74  hat records.** t
9ac0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
9ad0: 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65  uence for each e
9ae0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61  xpression in tha
9af0: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
9b00: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
9b10: 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f  ExprList is an O
9b20: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
9b30: 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20   BY clause then 
9b40: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  the resulting.**
9b50: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
9b60: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
9b70: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
9b80: 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64  ng a virtual ind
9b90: 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ex to.** impleme
9ba0: 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20  nt that clause. 
9bb0: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
9bc0: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73   is the result s
9bd0: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a  et of a SELECT.*
9be0: 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e  * then the KeyIn
9bf0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
9c00: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
9c10: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
9c20: 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20  irtual.** index 
9c30: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44  to implement a D
9c40: 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a  ISTINCT test..**
9c50: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
9c60: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
9c70: 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69  ructure is obtai
9c80: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
9c90: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a    The calling.**
9ca0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
9cb0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65  ponsible for see
9cc0: 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
9cd0: 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
9ce0: 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a  ually.** freed..
9cf0: 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66  */.static KeyInf
9d00: 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  o *keyInfoFromEx
9d10: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
9d20: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
9d30: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
9d40: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
9d50: 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46  *pList,     /* F
9d60: 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  orm the KeyInfo 
9d70: 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73  object from this
9d80: 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69   ExprList */.  i
9d90: 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20  nt iStart,      
9da0: 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74      /* Begin wit
9db0: 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66  h this column of
9dc0: 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
9dd0: 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  nExtra          
9de0: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
9df0: 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  y extra columns 
9e00: 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 7b  to the end */.){
9e10: 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20  .  int nExpr;.  
9e20: 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a  KeyInfo *pInfo;.
9e30: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
9e40: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
9e50: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9e60: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
9e70: 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70   i;..  nExpr = p
9e80: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
9e90: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
9ea0: 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
9eb0: 45 78 70 72 2d 69 53 74 61 72 74 2c 20 6e 45 78  Expr-iStart, nEx
9ec0: 74 72 61 2b 31 29 3b 0a 20 20 69 66 28 20 70 49  tra+1);.  if( pI
9ed0: 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nfo ){.    asser
9ee0: 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
9ef0: 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 49 6e  oIsWriteable(pIn
9f00: 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  fo) );.    for(i
9f10: 3d 69 53 74 61 72 74 2c 20 70 49 74 65 6d 3d 70  =iStart, pItem=p
9f20: 4c 69 73 74 2d 3e 61 2b 69 53 74 61 72 74 3b 20  List->a+iStart; 
9f30: 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  i<nExpr; i++, pI
9f40: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49  tem++){.      pI
9f50: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74  nfo->aColl[i-iSt
9f60: 61 72 74 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  art] = sqlite3Ex
9f70: 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72  prNNCollSeq(pPar
9f80: 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
9f90: 29 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  );.      pInfo->
9fa0: 61 53 6f 72 74 4f 72 64 65 72 5b 69 2d 69 53 74  aSortOrder[i-iSt
9fb0: 61 72 74 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f  art] = pItem->so
9fc0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
9fd0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66   }.  return pInf
9fe0: 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  o;.}../*.** Name
9ff0: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
a000: 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65  on operator, use
a010: 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  d for error mess
a020: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
a030: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65  const char *sele
a040: 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29  ctOpName(int id)
a050: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  {.  char *z;.  s
a060: 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20  witch( id ){.   
a070: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
a080: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41      z = "UNION A
a090: 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  LL";   break;.  
a0a0: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
a0b0: 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53  ECT: z = "INTERS
a0c0: 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ECT";   break;. 
a0d0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
a0e0: 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50  T:    z = "EXCEP
a0f0: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
a100: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
a110: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
a120: 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  N";       break;
a130: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b  .  }.  return z;
a140: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
a150: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
a160: 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20  /*.** Unless an 
a170: 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
a180: 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  LAN" command is 
a190: 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c  being processed,
a1a0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
a1b0: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  * is a no-op. Ot
a1c0: 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73  herwise, it adds
a1d0: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
a1e0: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45   output to the E
a1f0: 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68  QP result,.** wh
a200: 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20  ere the caption 
a210: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
a220: 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45 4d  **.**   "USE TEM
a230: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78 78  P B-TREE FOR xxx
a240: 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78  ".**.** where xx
a250: 78 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49 53  x is one of "DIS
a260: 54 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20 42  TINCT", "ORDER B
a270: 59 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59 22  Y" or "GROUP BY"
a280: 2e 20 45 78 61 63 74 6c 79 20 77 68 69 63 68 0a  . Exactly which.
a290: 2a 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  ** is determined
a2a0: 20 62 79 20 74 68 65 20 7a 55 73 61 67 65 20 61   by the zUsage a
a2b0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
a2c0: 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 54  ic void explainT
a2d0: 65 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  empTable(Parse *
a2e0: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
a2f0: 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69  ar *zUsage){.  i
a300: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
a310: 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62  in==2 ){.    Vdb
a320: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
a330: 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Vdbe;.    char *
a340: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
a350: 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
a360: 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52  , "USE TEMP B-TR
a370: 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61  EE FOR %s", zUsa
a380: 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ge);.    sqlite3
a390: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
a3a0: 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
a3b0: 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
a3c0: 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  0, zMsg, P4_DYNA
a3d0: 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  MIC);.  }.}../*.
a3e0: 2a 2a 20 41 73 73 69 67 6e 20 65 78 70 72 65 73  ** Assign expres
a3f0: 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65  sion b to lvalue
a400: 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f   a. A second, no
a410: 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20  -op, version of 
a420: 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73  this macro.** is
a430: 20 70 72 6f 76 69 64 65 64 20 77 68 65 6e 20 53   provided when S
a440: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
a450: 49 4e 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54  IN is defined. T
a460: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  his allows the c
a470: 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65  ode.** in sqlite
a480: 33 53 65 6c 65 63 74 28 29 20 74 6f 20 61 73 73  3Select() to ass
a490: 69 67 6e 20 76 61 6c 75 65 73 20 74 6f 20 73 74  ign values to st
a4a0: 72 75 63 74 75 72 65 20 6d 65 6d 62 65 72 20 76  ructure member v
a4b0: 61 72 69 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a  ariables that.**
a4c0: 20 6f 6e 6c 79 20 65 78 69 73 74 20 69 66 20 53   only exist if S
a4d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
a4e0: 49 4e 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  IN is not define
a4f0: 64 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74  d without pollut
a500: 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  ing the.** code 
a510: 77 69 74 68 20 23 69 66 6e 64 65 66 20 64 69 72  with #ifndef dir
a520: 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65  ectives..*/.# de
a530: 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49  fine explainSetI
a540: 6e 74 65 67 65 72 28 61 2c 20 62 29 20 61 20 3d  nteger(a, b) a =
a550: 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d   b..#else./* No-
a560: 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  op versions of t
a570: 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20  he explainXXX() 
a580: 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61  functions and ma
a590: 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e  cros. */.# defin
a5a0: 65 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62  e explainTempTab
a5b0: 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65  le(y,z).# define
a5c0: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
a5d0: 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  er(y,z).#endif..
a5e0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
a5f0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
a600: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
a610: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
a620: 4e 44 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a  ND_SELECT)./*.**
a630: 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c   Unless an "EXPL
a640: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20  AIN QUERY PLAN" 
a650: 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67  command is being
a660: 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73   processed, this
a670: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
a680: 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
a690: 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69  se, it adds a si
a6a0: 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70  ngle row of outp
a6b0: 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65  ut to the EQP re
a6c0: 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74  sult,.** where t
a6d0: 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66  he caption is of
a6e0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20   one of the two 
a6f0: 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  forms:.**.**   "
a700: 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45  COMPOSITE SUBQUE
a710: 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69  RIES iSub1 and i
a720: 53 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20  Sub2 (op)".**   
a730: 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55  "COMPOSITE SUBQU
a740: 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20  ERIES iSub1 and 
a750: 69 53 75 62 32 20 55 53 49 4e 47 20 54 45 4d 50  iSub2 USING TEMP
a760: 20 42 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a   B-TREE (op)".**
a770: 0a 2a 2a 20 77 68 65 72 65 20 69 53 75 62 31 20  .** where iSub1 
a780: 61 6e 64 20 69 53 75 62 32 20 61 72 65 20 74 68  and iSub2 are th
a790: 65 20 69 6e 74 65 67 65 72 73 20 70 61 73 73 65  e integers passe
a7a0: 64 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70  d as the corresp
a7b0: 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  onding.** functi
a7c0: 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61  on parameters, a
a7d0: 6e 64 20 6f 70 20 69 73 20 74 68 65 20 74 65 78  nd op is the tex
a7e0: 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
a7f0: 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   of the paramete
a800: 72 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65  r.** of the same
a810: 20 6e 61 6d 65 2e 20 54 68 65 20 70 61 72 61 6d   name. The param
a820: 65 74 65 72 20 22 6f 70 22 20 6d 75 73 74 20 62  eter "op" must b
a830: 65 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f  e one of TK_UNIO
a840: 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a  N, TK_EXCEPT,.**
a850: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f 72   TK_INTERSECT or
a860: 20 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72   TK_ALL. The fir
a870: 73 74 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20  st form is used 
a880: 69 66 20 61 72 67 75 6d 65 6e 74 20 62 55 73 65  if argument bUse
a890: 54 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65  Tmp is .** false
a8a0: 2c 20 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20  , or the second 
a8b0: 66 6f 72 6d 20 69 66 20 69 74 20 69 73 20 74 72  form if it is tr
a8c0: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
a8d0: 69 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73  id explainCompos
a8e0: 69 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ite(.  Parse *pP
a8f0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
a900: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
a910: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
a920: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
a930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a940: 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c  One of TK_UNION,
a950: 20 54 4b 5f 45 58 43 45 50 54 20 65 74 63 2e 20   TK_EXCEPT etc. 
a960: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 31 2c 20  */.  int iSub1, 
a970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a980: 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79       /* Subquery
a990: 20 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69   id 1 */.  int i
a9a0: 53 75 62 32 2c 20 20 20 20 20 20 20 20 20 20 20  Sub2,           
a9b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
a9c0: 62 71 75 65 72 79 20 69 64 20 32 20 2a 2f 0a 20  bquery id 2 */. 
a9d0: 20 69 6e 74 20 62 55 73 65 54 6d 70 20 20 20 20   int bUseTmp    
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9f0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74 65   /* True if a te
aa00: 6d 70 20 74 61 62 6c 65 20 77 61 73 20 75 73 65  mp table was use
aa10: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
aa20: 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c  ( op==TK_UNION |
aa30: 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  | op==TK_EXCEPT 
aa40: 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  || op==TK_INTERS
aa50: 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c  ECT || op==TK_AL
aa60: 4c 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  L );.  if( pPars
aa70: 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
aa80: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70  .    Vdbe *v = p
aa90: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
aaa0: 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73    char *zMsg = s
aab0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20  qlite3MPrintf(. 
aac0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64         pParse->d
aad0: 62 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42  b, "COMPOUND SUB
aae0: 51 55 45 52 49 45 53 20 25 64 20 41 4e 44 20 25  QUERIES %d AND %
aaf0: 64 20 25 73 28 25 73 29 22 2c 20 69 53 75 62 31  d %s(%s)", iSub1
ab00: 2c 20 69 53 75 62 32 2c 0a 20 20 20 20 20 20 20  , iSub2,.       
ab10: 20 62 55 73 65 54 6d 70 3f 22 55 53 49 4e 47 20   bUseTmp?"USING 
ab20: 54 45 4d 50 20 42 2d 54 52 45 45 20 22 3a 22 22  TEMP B-TREE ":""
ab30: 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f  , selectOpName(o
ab40: 70 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  p).    );.    sq
ab50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
ab60: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  v, OP_Explain, p
ab70: 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
ab80: 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  , 0, 0, zMsg, P4
ab90: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
aba0: 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20  .#else./* No-op 
abb0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
abc0: 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e  explainXXX() fun
abd0: 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f  ctions and macro
abe0: 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s. */.# define e
abf0: 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
ac00: 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  v,w,x,y,z).#endi
ac10: 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
ac20: 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67  inner loop was g
ac30: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61  enerated using a
ac40: 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72   non-null pOrder
ac50: 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  By argument,.** 
ac60: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  then the results
ac70: 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20   were placed in 
ac80: 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72  a sorter.  After
ac90: 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72   the loop is ter
aca0: 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65  minated.** we ne
acb0: 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f  ed to run the so
acc0: 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20  rter and output 
acd0: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
ace0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
acf0: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
ad00: 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64   the code needed
ad10: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
ad20: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
ad30: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20  rateSortTail(.  
ad40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
ad50: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
ad60: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
ad70: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *p,        /* T
ad80: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
ad90: 65 6e 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78  ent */.  SortCtx
ada0: 20 2a 70 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e   *pSort,   /* In
adb0: 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65  formation on the
adc0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
add0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
ade0: 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  n,      /* Numbe
adf0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
ae00: 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
ae10: 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57  Dest *pDest /* W
ae20: 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20  rite the sorted 
ae30: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
ae40: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
ae50: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae70: 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
ae80: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
ae90: 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 20 3d   int addrBreak =
aea0: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e   pSort->labelDon
aeb0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
aec0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65 78   Jump here to ex
aed0: 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  it loop */.  int
aee0: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20   addrContinue = 
aef0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
af00: 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d  abel(v);  /* Jum
af10: 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20  p here for next 
af20: 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61  cycle */.  int a
af30: 64 64 72 3b 0a 20 20 69 6e 74 20 61 64 64 72 4f  ddr;.  int addrO
af40: 6e 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  nce = 0;.  int i
af50: 54 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  Tab;.  ExprList 
af60: 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 6f 72  *pOrderBy = pSor
af70: 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  t->pOrderBy;.  i
af80: 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74  nt eDest = pDest
af90: 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69  ->eDest;.  int i
afa0: 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53  Parm = pDest->iS
afb0: 44 50 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65 67  DParm;.  int reg
afc0: 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f  Row;.  int regRo
afd0: 77 69 64 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  wid;.  int iCol;
afe0: 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69  .  int nKey;.  i
aff0: 6e 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20  nt iSortTab;    
b000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b010: 2a 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20  * Sorter cursor 
b020: 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
b030: 20 20 69 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b    int nSortData;
b040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b050: 20 20 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76 61    /* Trailing va
b060: 6c 75 65 73 20 74 6f 20 72 65 61 64 20 66 72 6f  lues to read fro
b070: 6d 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e  m sorter */.  in
b080: 74 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b  t i;.  int bSeq;
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0a0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
b0b0: 66 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  f sorter record 
b0c0: 69 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f  includes seq. no
b0d0: 2e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78  . */.  struct Ex
b0e0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75  prList_item *aOu
b0f0: 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  tEx = p->pEList-
b100: 3e 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  >a;..  assert( a
b110: 64 64 72 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20  ddrBreak<0 );.  
b120: 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  if( pSort->label
b130: 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c  BkOut ){.    sql
b140: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b150: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72  , OP_Gosub, pSor
b160: 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53  t->regReturn, pS
b170: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
b180: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b190: 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 42 72 65  eGoto(v, addrBre
b1a0: 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ak);.    sqlite3
b1b0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
b1c0: 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  (v, pSort->label
b1d0: 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54  BkOut);.  }.  iT
b1e0: 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75  ab = pSort->iECu
b1f0: 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73  rsor;.  if( eDes
b200: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
b210: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
b220: 75 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d  utine || eDest==
b230: 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 72  SRT_Mem ){.    r
b240: 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20  egRowid = 0;.   
b250: 20 72 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d   regRow = pDest-
b260: 3e 69 53 64 73 74 3b 0a 20 20 20 20 6e 53 6f 72  >iSdst;.    nSor
b270: 74 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b  tData = nColumn;
b280: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
b290: 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  gRowid = sqlite3
b2a0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
b2b0: 65 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d  e);.    regRow =
b2c0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
b2d0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
b2e0: 6c 75 6d 6e 29 3b 0a 20 20 20 20 6e 53 6f 72 74  lumn);.    nSort
b2f0: 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a  Data = nColumn;.
b300: 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72    }.  nKey = pOr
b310: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70  derBy->nExpr - p
b320: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20  Sort->nOBSat;.  
b330: 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46  if( pSort->sortF
b340: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
b350: 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  UseSorter ){.   
b360: 20 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20   int regSortOut 
b370: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
b380: 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d  ;.    iSortTab =
b390: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
b3a0: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  .    if( pSort->
b3b0: 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20  labelBkOut ){.  
b3c0: 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73      addrOnce = s
b3d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
b3e0: 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
b3f0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
b400: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
b410: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b420: 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f  _OpenPseudo, iSo
b430: 72 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75  rtTab, regSortOu
b440: 74 2c 20 6e 4b 65 79 2b 31 2b 6e 53 6f 72 74 44  t, nKey+1+nSortD
b450: 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 61 64  ata);.    if( ad
b460: 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33  drOnce ) sqlite3
b470: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
b480: 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61  addrOnce);.    a
b490: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
b4a0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b4b0: 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54  P_SorterSort, iT
b4c0: 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  ab, addrBreak);.
b4d0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
b4e0: 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  (v);.    codeOff
b4f0: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
b500: 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  t, addrContinue)
b510: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b520: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
b530: 72 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20  rterData, iTab, 
b540: 72 65 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72  regSortOut, iSor
b550: 74 54 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20  tTab);.    bSeq 
b560: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
b570: 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c    addr = 1 + sql
b580: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b590: 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c  , OP_Sort, iTab,
b5a0: 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62   addrBreak); Vdb
b5b0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b5c0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
b5d0: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
b5e0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69  Continue);.    i
b5f0: 53 6f 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a  SortTab = iTab;.
b600: 20 20 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20      bSeq = 1;.  
b610: 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f  }.  for(i=0, iCo
b620: 6c 3d 6e 4b 65 79 2b 62 53 65 71 2d 31 3b 20 69  l=nKey+bSeq-1; i
b630: 3c 6e 53 6f 72 74 44 61 74 61 3b 20 69 2b 2b 29  <nSortData; i++)
b640: 7b 0a 20 20 20 20 69 66 28 20 61 4f 75 74 45 78  {.    if( aOutEx
b650: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
b660: 43 6f 6c 3d 3d 30 20 29 20 69 43 6f 6c 2b 2b 3b  Col==0 ) iCol++;
b670: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6e 53 6f  .  }.  for(i=nSo
b680: 72 74 44 61 74 61 2d 31 3b 20 69 3e 3d 30 3b 20  rtData-1; i>=0; 
b690: 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 69 52  i--){.    int iR
b6a0: 65 61 64 3b 0a 20 20 20 20 69 66 28 20 61 4f 75  ead;.    if( aOu
b6b0: 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  tEx[i].u.x.iOrde
b6c0: 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  rByCol ){.      
b6d0: 69 52 65 61 64 20 3d 20 61 4f 75 74 45 78 5b 69  iRead = aOutEx[i
b6e0: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
b6f0: 6c 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  l-1;.    }else{.
b700: 20 20 20 20 20 20 69 52 65 61 64 20 3d 20 69 43        iRead = iC
b710: 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ol--;.    }.    
b720: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b730: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
b740: 69 53 6f 72 74 54 61 62 2c 20 69 52 65 61 64 2c  iSortTab, iRead,
b750: 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20   regRow+i);.    
b760: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
b770: 22 25 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e  "%s", aOutEx[i].
b780: 7a 4e 61 6d 65 20 3f 20 61 4f 75 74 45 78 5b 69  zName ? aOutEx[i
b790: 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78  ].zName : aOutEx
b7a0: 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 7d  [i].zSpan));.  }
b7b0: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
b7c0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54   ){.    case SRT
b7d0: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
b7e0: 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
b7f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b800: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
b810: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
b820: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
b830: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b840: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
b850: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20   iParm, regRow, 
b860: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
b870: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
b880: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
b890: 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72  PPEND);.      br
b8a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
b8b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
b8c0: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
b8d0: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
b8e0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
b8f0: 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  n==sqlite3Strlen
b900: 33 30 28 70 44 65 73 74 2d 3e 7a 41 66 66 53 64  30(pDest->zAffSd
b910: 73 74 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  st) );.      sql
b920: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
b930: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
b940: 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e   regRow, nColumn
b950: 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20  , regRowid,.    
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b970: 20 20 20 20 70 44 65 73 74 2d 3e 7a 41 66 66 53      pDest->zAffS
b980: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
b990: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b9a0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
b9b0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
b9c0: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ow, nColumn);.  
b9d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b9e0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
b9f0: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
ba00: 20 72 65 67 52 6f 77 69 64 2c 20 72 65 67 52 6f   regRowid, regRo
ba10: 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  w, nColumn);.   
ba20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ba30: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
ba40: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
ba50: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
ba60: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
ba70: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
ba80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ba90: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
baa0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
bab0: 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52  ssert( eDest==SR
bac0: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
bad0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
bae0: 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63   ); .      testc
baf0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
bb00: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
bb10: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
bb20: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
bb30: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
bb40: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
bb50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bb60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
bb70: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65 73  _ResultRow, pDes
bb80: 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d  t->iSdst, nColum
bb90: 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
bba0: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
bbb0: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
bbc0: 65 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  e, pDest->iSdst,
bbd0: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
bbe0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
bbf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bc00: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
bc10: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
bc20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
bc30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
bc40: 20 69 66 28 20 72 65 67 52 6f 77 69 64 20 29 7b   if( regRowid ){
bc50: 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d  .    if( eDest==
bc60: 53 52 54 5f 53 65 74 20 29 7b 0a 20 20 20 20 20  SRT_Set ){.     
bc70: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
bc80: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
bc90: 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e   regRow, nColumn
bca0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
bcb0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
bcc0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
bcd0: 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 7d  , regRow);.    }
bce0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
bcf0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
bd00: 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  e, regRowid);.  
bd10: 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f  }.  /* The botto
bd20: 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  m of the loop.  
bd30: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
bd40: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
bd50: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
bd60: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
bd70: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
bd80: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
bd90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bda0: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
bdb0: 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
bdc0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
bdd0: 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  v);.  }else{.   
bde0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bdf0: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
be00: 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65  Tab, addr); Vdbe
be10: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
be20: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 72 65  .  if( pSort->re
be30: 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69 74 65  gReturn ) sqlite
be40: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
be50: 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d  P_Return, pSort-
be60: 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 73  >regReturn);.  s
be70: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
be80: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72  eLabel(v, addrBr
be90: 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  eak);.}../*.** R
bea0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
beb0: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  to a string cont
bec0: 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c  aining the 'decl
bed0: 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66  aration type' of
bee0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
bef0: 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74  on pExpr. The st
bf00: 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61  ring may be trea
bf10: 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79  ted as static by
bf20: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
bf30: 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20 65  ** Also try to e
bf40: 73 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a 65  stimate the size
bf50: 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   of the returned
bf60: 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72   value and retur
bf70: 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74  n that.** result
bf80: 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e 0a   in *pEstWidth..
bf90: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  **.** The declar
bfa0: 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68  ation type is th
bfb0: 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65  e exact datatype
bfc0: 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72   definition extr
bfd0: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  acted from the.*
bfe0: 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54  * original CREAT
bff0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
c000: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
c010: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
c020: 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74   The.** declarat
c030: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52  ion type for a R
c040: 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e  OWID field is IN
c050: 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77  TEGER. Exactly w
c060: 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  hen an expressio
c070: 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  n.** is consider
c080: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  ed a column can 
c090: 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68  be complex in th
c0a0: 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75  e presence of su
c0b0: 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a  bqueries. The.**
c0c0: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
c0d0: 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66  ession in all of
c0e0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53   the following S
c0f0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
c100: 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72   is .** consider
c110: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74  ed a column by t
c120: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
c130: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c  .**   SELECT col
c140: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
c150: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
c160: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
c170: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
c180: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   col FROM tbl);.
c190: 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20  **   SELECT abc 
c1a0: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c  FROM (SELECT col
c1b0: 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c   AS abc FROM tbl
c1c0: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65  );.** .** The de
c1d0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
c1e0: 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  or any expressio
c1f0: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  n other than a c
c200: 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a  olumn is NULL..*
c210: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c220: 65 20 68 61 73 20 65 69 74 68 65 72 20 33 20 6f  e has either 3 o
c230: 72 20 36 20 70 61 72 61 6d 65 74 65 72 73 20 64  r 6 parameters d
c240: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
c250: 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68  her or not.** th
c260: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
c270: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20  COLUMN_METADATA 
c280: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
c290: 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a  ion is used..*/.
c2a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c2b0: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
c2c0: 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63 6f  DATA.# define co
c2d0: 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44  lumnType(A,B,C,D
c2e0: 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ,E) columnTypeIm
c2f0: 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 29 0a 23 65  pl(A,B,C,D,E).#e
c300: 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e  lse /* if !defin
c310: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
c320: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
c330: 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f  ) */.# define co
c340: 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44  lumnType(A,B,C,D
c350: 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ,E) columnTypeIm
c360: 70 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 0a 73  pl(A,B).#endif.s
c370: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c380: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c   *columnTypeImpl
c390: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
c3a0: 2a 70 4e 43 2c 20 0a 23 69 66 6e 64 65 66 20 53  *pNC, .#ifndef S
c3b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
c3c0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 45  UMN_METADATA.  E
c3d0: 78 70 72 20 2a 70 45 78 70 72 0a 23 65 6c 73 65  xpr *pExpr.#else
c3e0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a  .  Expr *pExpr,.
c3f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
c400: 7a 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74  zOrigDb,.  const
c410: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61   char **pzOrigTa
c420: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
c430: 2a 2a 70 7a 4f 72 69 67 43 6f 6c 0a 23 65 6e 64  **pzOrigCol.#end
c440: 69 66 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  if.){.  char con
c450: 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  st *zType = 0;. 
c460: 20 69 6e 74 20 6a 3b 0a 23 69 66 64 65 66 20 53   int j;.#ifdef S
c470: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
c480: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 63  UMN_METADATA.  c
c490: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
c4a0: 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  Db = 0;.  char c
c4b0: 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d  onst *zOrigTab =
c4c0: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
c4d0: 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a   *zOrigCol = 0;.
c4e0: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
c4f0: 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ( pExpr!=0 );.  
c500: 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72  assert( pNC->pSr
c510: 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73  cList!=0 );.  as
c520: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
c530: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
c540: 3b 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  ;  /* This routi
c550: 6e 65 20 72 75 6e 65 73 20 62 65 66 6f 72 65 20  ne runes before 
c560: 61 67 67 72 65 67 61 74 65 73 0a 20 20 20 20 20  aggregates.     
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c590: 20 20 2a 2a 20 61 72 65 20 70 72 6f 63 65 73 73    ** are process
c5a0: 65 64 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20  ed */.  switch( 
c5b0: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
c5c0: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
c5d0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
c5e0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
c5f0: 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74  column. Locate t
c600: 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c  he table the col
c610: 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20  umn is being.   
c620: 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20     ** extracted 
c630: 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74  from in NameCont
c640: 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68  ext.pSrcList. Th
c650: 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20  is table may be 
c660: 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61  real.      ** da
c670: 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20  tabase table or 
c680: 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  a subquery..    
c690: 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
c6a0: 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
c6b0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
c6c0: 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e  structure column
c6d0: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
c6e0: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65  om */.      Sele
c6f0: 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20  ct *pS = 0;     
c700: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
c710: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  t the column is 
c720: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a  extracted from *
c730: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  /.      int iCol
c740: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
c750: 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20  n;  /* Index of 
c760: 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a  column in pTab *
c770: 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  /.      while( p
c780: 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20  NC && !pTab ){. 
c790: 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a         SrcList *
c7a0: 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pTabList = pNC->
c7b0: 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20  pSrcList;.      
c7c0: 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62    for(j=0;j<pTab
c7d0: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
c7e0: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
c7f0: 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61  rsor!=pExpr->iTa
c800: 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20  ble;j++);.      
c810: 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74    if( j<pTabList
c820: 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ->nSrc ){.      
c830: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
c840: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
c850: 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70            pS = p
c860: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53  TabList->a[j].pS
c870: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d  elect;.        }
c880: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
c890: 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74  pNC = pNC->pNext
c8a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c8b0: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
c8c0: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
c8d0: 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65    /* At one time
c8e0: 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20 22  , code such as "
c8f0: 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69  SELECT new.x" wi
c900: 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20 77  thin a trigger w
c910: 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ould.        ** 
c920: 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69  cause this condi
c930: 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69  tion to run.  Si
c940: 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76  nce then, we hav
c950: 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20 68  e restructured h
c960: 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  ow.        ** tr
c970: 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67 65  igger code is ge
c980: 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74  nerated and so t
c990: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  his condition is
c9a0: 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20   no longer .    
c9b0: 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e      ** possible.
c9c0: 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e   However, it can
c9d0: 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66   still be true f
c9e0: 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69  or statements li
c9f0: 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ke.        ** th
ca00: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20  e following:.   
ca10: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
ca20: 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
ca30: 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52  E t1(col INTEGER
ca40: 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  );.        **   
ca50: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74  SELECT (SELECT t
ca60: 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d  1.col) FROM FROM
ca70: 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a   t1;.        **.
ca80: 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20          ** when 
ca90: 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20  columnType() is 
caa0: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78  called on the ex
cab0: 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c  pression "t1.col
cac0: 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20  " in the .      
cad0: 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e    ** sub-select.
cae0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73   In this case, s
caf0: 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  et the column ty
cb00: 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e  pe to NULL, even
cb10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75  .        ** thou
cb20: 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61  gh it should rea
cb30: 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52 22  lly be "INTEGER"
cb40: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
cb50: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
cb60: 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61  not a problem, a
cb70: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  s the column typ
cb80: 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73  e of "t1.col" is
cb90: 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a   never.        *
cba0: 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c  * used. When col
cbb0: 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c  umnType() is cal
cbc0: 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65  led on the expre
cbd0: 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a  ssion .        *
cbe0: 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f  * "(SELECT t1.co
cbf0: 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74  l)", the correct
cc00: 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e 65   type is returne
cc10: 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45  d (see the TK_SE
cc20: 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20  LECT.        ** 
cc30: 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a  branch below.  *
cc40: 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
cc50: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
cc60: 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20  assert( pTab && 
cc70: 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61  pExpr->pTab==pTa
cc80: 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b );.      if( p
cc90: 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  S ){.        /* 
cca0: 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61  The "table" is a
ccb0: 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65  ctually a sub-se
ccc0: 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69  lect or a view i
ccd0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
cce0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
ccf0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
cd00: 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65  ment. Return the
cd10: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
cd20: 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20  e and origin.   
cd30: 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72       ** data for
cd40: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20   the result-set 
cd50: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75  column of the su
cd60: 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20  b-select..      
cd70: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
cd80: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
cd90: 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <pS->pEList->nEx
cda0: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pr ){.          
cdb0: 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65  /* If iCol is le
cdc0: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
cdd0: 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
cde0: 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20  n requests the. 
cdf0: 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69           ** rowi
ce00: 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  d of the sub-sel
ce10: 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69  ect or view. Thi
ce20: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
ce30: 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20  legal (see .    
ce40: 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61        ** test ca
ce50: 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20  se misc2.2.2) - 
ce60: 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61  it always evalua
ce70: 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20  tes to NULL..   
ce80: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
ce90: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
cea0: 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45  sNC;.          E
ceb0: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
cec0: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
ced0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  pr;.          sN
cee0: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
cef0: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20  >pSrc;.         
cf00: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43   sNC.pNext = pNC
cf10: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
cf20: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
cf30: 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  arse;.          
cf40: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
cf50: 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69  pe(&sNC, p,&zOri
cf60: 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a  gDb,&zOrigTab,&z
cf70: 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20 20 20  OrigCol); .     
cf80: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
cf90: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72  {.        /* A r
cfa0: 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 61 20 43  eal table or a C
cfb0: 54 45 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  TE table */.    
cfc0: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20      assert( !pS 
cfd0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
cfe0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
cff0: 45 54 41 44 41 54 41 0a 20 20 20 20 20 20 20 20  ETADATA.        
d000: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
d010: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
d020: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d030: 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20   iCol==XN_ROWID 
d040: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
d050: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
d060: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
d070: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
d080: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
d090: 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20  GER";.          
d0a0: 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69  zOrigCol = "rowi
d0b0: 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d";.        }els
d0c0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  e{.          zOr
d0d0: 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43  igCol = pTab->aC
d0e0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
d0f0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
d100: 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54  = sqlite3ColumnT
d110: 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  ype(&pTab->aCol[
d120: 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20  iCol],0);.      
d130: 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69    }.        zOri
d140: 67 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  gTab = pTab->zNa
d150: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
d160: 70 4e 43 2d 3e 70 50 61 72 73 65 20 26 26 20 70  pNC->pParse && p
d170: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  Tab->pSchema ){.
d180: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
d190: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
d1a0: 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50  aToIndex(pNC->pP
d1b0: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
d1c0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
d1d0: 20 20 20 20 7a 4f 72 69 67 44 62 20 3d 20 70 4e      zOrigDb = pN
d1e0: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  C->pParse->db->a
d1f0: 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
d200: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73  ;.        }.#els
d210: 65 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  e.        assert
d220: 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44  ( iCol==XN_ROWID
d230: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
d240: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
d250: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
d260: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
d270: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
d280: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 7d  EGER";.        }
d290: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d2a0: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43  zType = sqlite3C
d2b0: 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62 2d  olumnType(&pTab-
d2c0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a  >aCol[iCol],0);.
d2d0: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
d2e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
d2f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
d300: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d310: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
d320: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
d330: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
d340: 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d  ession is a sub-
d350: 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74  select. Return t
d360: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
d370: 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ype and.      **
d380: 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72   origin info for
d390: 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75   the single colu
d3a0: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
d3b0: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
d3c0: 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  CT.      ** stat
d3d0: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
d3e0: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
d3f0: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c  t sNC;.      Sel
d400: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
d410: 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >x.pSelect;.    
d420: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
d430: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
d440: 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
d450: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
d460: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
d470: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
d480: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
d490: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73  S->pSrc;.      s
d4a0: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
d4b0: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
d4c0: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
d4d0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
d4e0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
d4f0: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
d500: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
d510: 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
d520: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
d530: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
d540: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
d550: 45 54 41 44 41 54 41 20 20 0a 20 20 69 66 28 20  ETADATA  .  if( 
d560: 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20  pzOrigDb ){.    
d570: 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61  assert( pzOrigTa
d580: 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29  b && pzOrigCol )
d590: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20  ;.    *pzOrigDb 
d5a0: 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a  = zOrigDb;.    *
d5b0: 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69  pzOrigTab = zOri
d5c0: 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  gTab;.    *pzOri
d5d0: 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b  gCol = zOrigCol;
d5e0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
d5f0: 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f  turn zType;.}../
d600: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
d610: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
d620: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 64  l the VDBE the d
d630: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73  eclaration types
d640: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
d650: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
d660: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d670: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
d680: 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ypes(.  Parse *p
d690: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
d6a0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
d6b0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
d6c0: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
d6d0: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
d6e0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
d6f0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
d700: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
d710: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23  sult set */.){.#
d720: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d730: 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64  IT_DECLTYPE.  Vd
d740: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
d750: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
d760: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
d770: 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  C;.  sNC.pSrcLis
d780: 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
d790: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
d7a0: 72 73 65 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74  rse;.  sNC.pNext
d7b0: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
d7c0: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
d7d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
d7e0: 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *p = pEList->a[
d7f0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f  i].pExpr;.    co
d800: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
d810: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d820: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
d830: 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20  ADATA.    const 
d840: 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20  char *zOrigDb = 
d850: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
d860: 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b  r *zOrigTab = 0;
d870: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
d880: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20  *zOrigCol = 0;. 
d890: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
d8a0: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
d8b0: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
d8c0: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a  ab, &zOrigCol);.
d8d0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65  .    /* The vdbe
d8e0: 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20 6f   must make its o
d8f0: 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  wn copy of the c
d900: 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f  olumn-type and o
d910: 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c  ther .    ** col
d920: 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74 72  umn specific str
d930: 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68  ings, in case th
d940: 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73 65  e schema is rese
d950: 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20  t before this.  
d960: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63    ** virtual mac
d970: 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e  hine is deleted.
d980: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
d990: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d9a0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d9b0: 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44  DATABASE, zOrigD
d9c0: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
d9d0: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
d9e0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d9f0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41  v, i, COLNAME_TA
da00: 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53  BLE, zOrigTab, S
da10: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
da20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
da30: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
da40: 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e  , COLNAME_COLUMN
da50: 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49  , zOrigCol, SQLI
da60: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23  TE_TRANSIENT);.#
da70: 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65 20 3d  else.    zType =
da80: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
da90: 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23  , p, 0, 0, 0);.#
daa0: 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
dab0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
dac0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45  v, i, COLNAME_DE
dad0: 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53  CLTYPE, zType, S
dae0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
daf0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
db00: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
db10: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 29 20 2a  OMIT_DECLTYPE) *
db20: 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  /.}.../*.** Comp
db30: 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ute the column n
db40: 61 6d 65 73 20 66 6f 72 20 61 20 53 45 4c 45 43  ames for a SELEC
db50: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  T statement..**.
db60: 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 67 75 61 72  ** The only guar
db70: 61 6e 74 65 65 20 74 68 61 74 20 53 51 4c 69 74  antee that SQLit
db80: 65 20 6d 61 6b 65 73 20 61 62 6f 75 74 20 63 6f  e makes about co
db90: 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 73 20 74 68  lumn names is th
dba0: 61 74 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f 6c  at if the.** col
dbb0: 75 6d 6e 20 68 61 73 20 61 6e 20 41 53 20 63 6c  umn has an AS cl
dbc0: 61 75 73 65 20 61 73 73 69 67 6e 69 6e 67 20 69  ause assigning i
dbd0: 74 20 61 20 6e 61 6d 65 2c 20 74 68 61 74 20 77  t a name, that w
dbe0: 69 6c 6c 20 62 65 20 74 68 65 20 6e 61 6d 65 20  ill be the name 
dbf0: 75 73 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69 73  used..** That is
dc00: 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65   the only docume
dc10: 6e 74 65 64 20 67 75 61 72 61 6e 74 65 65 2e 20  nted guarantee. 
dc20: 20 48 6f 77 65 76 65 72 2c 20 63 6f 75 6e 74 6c   However, countl
dc30: 65 73 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  ess applications
dc40: 0a 2a 2a 20 64 65 76 65 6c 6f 70 65 64 20 6f 76  .** developed ov
dc50: 65 72 20 74 68 65 20 79 65 61 72 73 20 68 61 76  er the years hav
dc60: 65 20 6d 61 64 65 20 62 61 73 65 6c 65 73 73 20  e made baseless 
dc70: 61 73 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f 75  assumptions abou
dc80: 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 2a  t column names.*
dc90: 2a 20 61 6e 64 20 77 69 6c 6c 20 62 72 65 61 6b  * and will break
dca0: 20 69 66 20 74 68 6f 73 65 20 61 73 73 75 6d 70   if those assump
dcb0: 74 69 6f 6e 73 20 63 68 61 6e 67 65 73 2e 20 20  tions changes.  
dcc0: 48 65 6e 63 65 2c 20 75 73 65 20 65 78 74 72 65  Hence, use extre
dcd0: 6d 65 20 63 61 75 74 69 6f 6e 0a 2a 2a 20 77 68  me caution.** wh
dce0: 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 69  en modifying thi
dcf0: 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 61 76 6f  s routine to avo
dd00: 69 64 20 62 72 65 61 6b 69 6e 67 20 6c 65 67 61  id breaking lega
dd10: 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41 6c  cy..**.** See Al
dd20: 73 6f 3a 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  so: sqlite3Colum
dd30: 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29  nsFromExprList()
dd40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 52 41 47 4d  .**.** The PRAGM
dd50: 41 20 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e  A short_column_n
dd60: 61 6d 65 73 20 61 6e 64 20 50 52 41 47 4d 41 20  ames and PRAGMA 
dd70: 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  full_column_name
dd80: 73 20 73 65 74 74 69 6e 67 73 20 61 72 65 0a 2a  s settings are.*
dd90: 2a 20 64 65 70 72 65 63 61 74 65 64 2e 20 20 54  * deprecated.  T
dda0: 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  he default setti
ddb0: 6e 67 20 69 73 20 73 68 6f 72 74 3d 4f 4e 2c 20  ng is short=ON, 
ddc0: 66 75 6c 6c 3d 4f 46 46 2e 20 20 39 39 2e 39 25  full=OFF.  99.9%
ddd0: 20 6f 66 20 61 6c 6c 0a 2a 2a 20 61 70 70 6c 69   of all.** appli
dde0: 63 61 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20 6f  cations should o
ddf0: 70 65 72 61 74 65 20 74 68 69 73 20 77 61 79 2e  perate this way.
de00: 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
de10: 77 65 20 6e 65 65 64 20 74 6f 20 73 75 70 70 6f  we need to suppo
de20: 72 74 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20  rt the.** other 
de30: 6d 6f 64 65 73 20 66 6f 72 20 6c 65 67 61 63 79  modes for legacy
de40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74  :.**.**    short
de50: 3d 4f 46 46 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20  =OFF, full=OFF: 
de60: 20 20 20 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65       Column name
de70: 20 69 73 20 74 68 65 20 74 65 78 74 20 6f 66 20   is the text of 
de80: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68  the expression h
de90: 61 73 20 69 74 0a 2a 2a 20 20 20 20 20 20 20 20  as it.**        
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
deb0: 20 20 20 20 20 20 6f 72 69 67 69 6e 61 6c 6c 79        originally
dec0: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20   appears in the 
ded0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
dee0: 2e 20 20 49 6e 0a 2a 2a 20 20 20 20 20 20 20 20  .  In.**        
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df00: 20 20 20 20 20 20 6f 74 68 65 72 20 77 6f 72 64        other word
df10: 73 2c 20 74 68 65 20 7a 53 70 61 6e 20 6f 66 20  s, the zSpan of 
df20: 74 68 65 20 72 65 73 75 6c 74 20 65 78 70 72 65  the result expre
df30: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ssion..**.**    
df40: 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f  short=ON, full=O
df50: 46 46 3a 20 20 20 20 20 20 20 28 54 68 69 73 20  FF:       (This 
df60: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 73  is the default s
df70: 65 74 74 69 6e 67 29 2e 20 20 49 66 20 74 68 65  etting).  If the
df80: 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20   result.**      
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfa0: 20 20 20 20 20 20 20 20 72 65 66 65 72 73 20 64          refers d
dfb0: 69 72 65 63 74 6c 79 20 74 6f 20 61 20 74 61 62  irectly to a tab
dfc0: 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20  le column, then 
dfd0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 20 20 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d      result colum
e000: 6e 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 74  n name is just t
e010: 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a  he table column.
e020: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e040: 6e 61 6d 65 3a 20 43 4f 4c 55 4d 4e 2e 20 20 4f  name: COLUMN.  O
e050: 74 68 65 72 77 69 73 65 20 75 73 65 20 7a 53 70  therwise use zSp
e060: 61 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 66 75 6c  an..**.**    ful
e070: 6c 3d 4f 4e 2c 20 73 68 6f 72 74 3d 41 4e 59 3a  l=ON, short=ANY:
e080: 20 20 20 20 20 20 20 49 66 20 74 68 65 20 72 65         If the re
e090: 73 75 6c 74 20 72 65 66 65 72 73 20 64 69 72 65  sult refers dire
e0a0: 63 74 6c 79 20 74 6f 20 61 20 74 61 62 6c 65 20  ctly to a table 
e0b0: 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 20 20 20 20 20  column,.**      
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0d0: 20 20 20 20 20 20 20 20 74 68 65 6e 20 74 68 65          then the
e0e0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e   result column n
e0f0: 61 6d 65 20 77 69 74 68 20 74 68 65 20 74 61 62  ame with the tab
e100: 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 20 20 20  le name.**      
e110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e120: 20 20 20 20 20 20 20 20 70 72 65 66 69 78 2c 20          prefix, 
e130: 65 78 3a 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e  ex: TABLE.COLUMN
e140: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 75 73 65  .  Otherwise use
e150: 20 7a 53 70 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69   zSpan..*/.stati
e160: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
e170: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61  olumnNames(.  Pa
e180: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
e190: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
e1a0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
e1b0: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 2f 2a 20  *pSelect     /* 
e1c0: 47 65 6e 65 72 61 74 65 20 63 6f 6c 75 6d 6e 20  Generate column 
e1d0: 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 53  names for this S
e1e0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
e1f0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
e200: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
e210: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54 61 62 6c  .  int i;.  Tabl
e220: 65 20 2a 70 54 61 62 3b 0a 20 20 53 72 63 4c 69  e *pTab;.  SrcLi
e230: 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
e240: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
e250: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
e260: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
e270: 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 3b 20 20 20  int fullName;   
e280: 20 2f 2a 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e   /* TABLE.COLUMN
e290: 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75 73 65   if no AS clause
e2a0: 20 61 6e 64 20 69 73 20 61 20 64 69 72 65 63 74   and is a direct
e2b0: 20 74 61 62 6c 65 20 72 65 66 20 2a 2f 0a 20 20   table ref */.  
e2c0: 69 6e 74 20 73 72 63 4e 61 6d 65 3b 20 20 20 20  int srcName;    
e2d0: 20 2f 2a 20 43 4f 4c 55 4d 4e 20 6f 72 20 54 41   /* COLUMN or TA
e2e0: 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f  BLE.COLUMN if no
e2f0: 20 41 53 20 63 6c 61 75 73 65 20 61 6e 64 20 69   AS clause and i
e300: 73 20 64 69 72 65 63 74 20 2a 2f 0a 0a 23 69 66  s direct */..#if
e310: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e320: 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66  _EXPLAIN.  /* If
e330: 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c   this is an EXPL
e340: 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73  AIN, skip this s
e350: 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  tep */.  if( pPa
e360: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
e370: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
e380: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50  #endif..  if( pP
e390: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
e3a0: 74 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  t || db->mallocF
e3b0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
e3c0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
e3d0: 73 20 61 72 65 20 64 65 74 65 72 6d 69 6e 65 64  s are determined
e3e0: 20 62 79 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   by the left-mos
e3f0: 74 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70  t term of a comp
e400: 6f 75 6e 64 20 73 65 6c 65 63 74 20 2a 2f 0a 20  ound select */. 
e410: 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d   while( pSelect-
e420: 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63  >pPrior ) pSelec
e430: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  t = pSelect->pPr
e440: 69 6f 72 3b 0a 20 20 53 45 4c 45 43 54 54 52 41  ior;.  SELECTTRA
e450: 43 45 28 31 2c 70 50 61 72 73 65 2c 70 53 65 6c  CE(1,pParse,pSel
e460: 65 63 74 2c 28 22 67 65 6e 65 72 61 74 69 6e 67  ect,("generating
e470: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 5c 6e 22   column names\n"
e480: 29 29 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  ));.  pTabList =
e490: 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
e4a0: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
e4b0: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73  ct->pEList;.  as
e4c0: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
e4d0: 61 73 73 65 72 74 28 20 70 54 61 62 4c 69 73 74  assert( pTabList
e4e0: 21 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  !=0 );.  pParse-
e4f0: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31  >colNamesSet = 1
e500: 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 20 3d 20 28  ;.  fullName = (
e510: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
e520: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
e530: 21 3d 30 3b 0a 20 20 73 72 63 4e 61 6d 65 20 3d  !=0;.  srcName =
e540: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
e550: 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
e560: 65 73 29 21 3d 30 20 7c 7c 20 66 75 6c 6c 4e 61  es)!=0 || fullNa
e570: 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  me;.  sqlite3Vdb
e580: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70  eSetNumCols(v, p
e590: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
e5a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
e5b0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
e5c0: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
e5d0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
e5e0: 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  r;..    assert( 
e5f0: 70 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  p!=0 );.    asse
e600: 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 47  rt( p->op!=TK_AG
e610: 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20  G_COLUMN );  /* 
e620: 41 67 67 20 70 72 6f 63 65 73 73 69 6e 67 20 68  Agg processing h
e630: 61 73 20 6e 6f 74 20 72 75 6e 20 79 65 74 20 2a  as not run yet *
e640: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
e650: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
e660: 7c 20 70 2d 3e 70 54 61 62 21 3d 30 20 29 3b 20  | p->pTab!=0 ); 
e670: 2f 2a 20 43 6f 76 65 72 69 6e 67 20 69 64 78 20  /* Covering idx 
e680: 6e 6f 74 20 79 65 74 20 63 6f 64 65 64 20 2a 2f  not yet coded */
e690: 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d  .    if( pEList-
e6a0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20  >a[i].zName ){. 
e6b0: 20 20 20 20 20 2f 2a 20 41 6e 20 41 53 20 63 6c       /* An AS cl
e6c0: 61 75 73 65 20 61 6c 77 61 79 73 20 74 61 6b 65  ause always take
e6d0: 73 20 66 69 72 73 74 20 70 72 69 6f 72 69 74 79  s first priority
e6e0: 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
e6f0: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
e700: 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[i].zName;.    
e710: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
e720: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
e730: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
e740: 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  e, SQLITE_TRANSI
e750: 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ENT);.    }else 
e760: 69 66 28 20 73 72 63 4e 61 6d 65 20 26 26 20 70  if( srcName && p
e770: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
e780: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
e790: 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Col;.      int i
e7a0: 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e  Col = p->iColumn
e7b0: 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
e7c0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 61 73  ->pTab;.      as
e7d0: 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
e7e0: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
e7f0: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
e800: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73  >iPKey;.      as
e810: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
e820: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
e830: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
e840: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
e850: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  <0 ){.        zC
e860: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
e870: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e880: 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     zCol = pTab->
e890: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
e8a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e8b0: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 20 29 7b 0a  if( fullName ){.
e8c0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
e8d0: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
e8e0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
e8f0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
e900: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
e910: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , zCol);.       
e920: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
e930: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
e940: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
e950: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
e960: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
e970: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e980: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
e990: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
e9a0: 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  , zCol, SQLITE_T
e9b0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
e9c0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
e9d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e9e0: 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  z = pEList->a[i]
e9f0: 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20  .zSpan;.      z 
ea00: 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33  = z==0 ? sqlite3
ea10: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c  MPrintf(db, "col
ea20: 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73  umn%d", i+1) : s
ea30: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
ea40: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  b, z);.      sql
ea50: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
ea60: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
ea70: 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45  _NAME, z, SQLITE
ea80: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d  _DYNAMIC);.    }
ea90: 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43  .  }.  generateC
eaa0: 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73  olumnTypes(pPars
eab0: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
eac0: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ist);.}../*.** G
ead0: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
eae0: 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20 69  on list (which i
eaf0: 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73  s really the lis
eb00: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
eb10: 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68  .** that form th
eb20: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
eb30: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
eb40: 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72  nt) compute appr
eb50: 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d  opriate.** colum
eb60: 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61  n names for a ta
eb70: 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68  ble that would h
eb80: 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
eb90: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41  on list..**.** A
eba0: 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ll column names 
ebb0: 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a  will be unique..
ebc0: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63  **.** Only the c
ebd0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20  olumn names are 
ebe0: 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d  computed.  Colum
ebf0: 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e  n.zType, Column.
ec00: 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74  zColl,.** and ot
ec10: 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f  her fields of Co
ec20: 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e  lumn are zeroed.
ec30: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
ec40: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
ec50: 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  ss.  If a memory
ec60: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
ec70: 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f  r occurs,.** sto
ec80: 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f  re NULL in *paCo
ec90: 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f  l and 0 in *pnCo
eca0: 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  l and return SQL
ecb0: 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a  ITE_NOMEM..**.**
ecc0: 20 54 68 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e   The only guaran
ecd0: 74 65 65 20 74 68 61 74 20 53 51 4c 69 74 65 20  tee that SQLite 
ece0: 6d 61 6b 65 73 20 61 62 6f 75 74 20 63 6f 6c 75  makes about colu
ecf0: 6d 6e 20 6e 61 6d 65 73 20 69 73 20 74 68 61 74  mn names is that
ed00: 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   if the.** colum
ed10: 6e 20 68 61 73 20 61 6e 20 41 53 20 63 6c 61 75  n has an AS clau
ed20: 73 65 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20  se assigning it 
ed30: 61 20 6e 61 6d 65 2c 20 74 68 61 74 20 77 69 6c  a name, that wil
ed40: 6c 20 62 65 20 74 68 65 20 6e 61 6d 65 20 75 73  l be the name us
ed50: 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69 73 20 74  ed..** That is t
ed60: 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74  he only document
ed70: 65 64 20 67 75 61 72 61 6e 74 65 65 2e 20 20 48  ed guarantee.  H
ed80: 6f 77 65 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73  owever, countles
ed90: 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a  s applications.*
eda0: 2a 20 64 65 76 65 6c 6f 70 65 64 20 6f 76 65 72  * developed over
edb0: 20 74 68 65 20 79 65 61 72 73 20 68 61 76 65 20   the years have 
edc0: 6d 61 64 65 20 62 61 73 65 6c 65 73 73 20 61 73  made baseless as
edd0: 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20  sumptions about 
ede0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20  column names.** 
edf0: 61 6e 64 20 77 69 6c 6c 20 62 72 65 61 6b 20 69  and will break i
ee00: 66 20 74 68 6f 73 65 20 61 73 73 75 6d 70 74 69  f those assumpti
ee10: 6f 6e 73 20 63 68 61 6e 67 65 73 2e 20 20 48 65  ons changes.  He
ee20: 6e 63 65 2c 20 75 73 65 20 65 78 74 72 65 6d 65  nce, use extreme
ee30: 20 63 61 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e   caution.** when
ee40: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 69 73 20   modifying this 
ee50: 72 6f 75 74 69 6e 65 20 74 6f 20 61 76 6f 69 64  routine to avoid
ee60: 20 62 72 65 61 6b 69 6e 67 20 6c 65 67 61 63 79   breaking legacy
ee70: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f  ..**.** See Also
ee80: 3a 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  : generateColumn
ee90: 4e 61 6d 65 73 28 29 0a 2a 2f 0a 69 6e 74 20 73  Names().*/.int s
eea0: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f  qlite3ColumnsFro
eeb0: 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  mExprList(.  Par
eec0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
eed0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
eee0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
eef0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
ef00: 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73       /* Expr lis
ef10: 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  t from which to 
ef20: 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61  derive column na
ef30: 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e  mes */.  i16 *pn
ef40: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
ef50: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
ef60: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
ef70: 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  here */.  Column
ef80: 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20   **paCol        
ef90: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
efa0: 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  ew column list h
efb0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ere */.){.  sqli
efc0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
efd0: 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62  ->db;   /* Datab
efe0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
eff0: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f010: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
f020: 20 2a 2f 0a 20 20 75 33 32 20 63 6e 74 3b 20 20   */.  u32 cnt;  
f030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f040: 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65 64    /* Index added
f050: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d   to make the nam
f060: 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f  e unique */.  Co
f070: 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f  lumn *aCol, *pCo
f080: 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  l;        /* For
f090: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72 65   looping over re
f0a0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
f0b0: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
f0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f0d0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
f0e0: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
f0f0: 20 73 65 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a   set */.  char *
f100: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
f110: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
f120: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  name */.  int nN
f130: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
f140: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
f150: 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d   name in zName[]
f160: 20 2a 2f 0a 20 20 48 61 73 68 20 68 74 3b 20 20   */.  Hash ht;  
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
f190: 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
f1a0: 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 48 61 73  */..  sqlite3Has
f1b0: 68 49 6e 69 74 28 26 68 74 29 3b 0a 20 20 69 66  hInit(&ht);.  if
f1c0: 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20  ( pEList ){.    
f1d0: 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
f1e0: 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d  Expr;.    aCol =
f1f0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
f200: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
f210: 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a  aCol[0])*nCol);.
f220: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 43      testcase( aC
f230: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ol==0 );.    if(
f240: 20 6e 43 6f 6c 3e 33 32 37 36 37 20 29 20 6e 43   nCol>32767 ) nC
f250: 6f 6c 20 3d 20 33 32 37 36 37 3b 0a 20 20 7d 65  ol = 32767;.  }e
f260: 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  lse{.    nCol = 
f270: 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b  0;.    aCol = 0;
f280: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
f290: 43 6f 6c 3d 3d 28 69 31 36 29 6e 43 6f 6c 20 29  Col==(i16)nCol )
f2a0: 3b 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f  ;.  *pnCol = nCo
f2b0: 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43  l;.  *paCol = aC
f2c0: 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ol;..  for(i=0, 
f2d0: 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f  pCol=aCol; i<nCo
f2e0: 6c 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  l && !db->malloc
f2f0: 46 61 69 6c 65 64 3b 20 69 2b 2b 2c 20 70 43 6f  Failed; i++, pCo
f300: 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74  l++){.    /* Get
f310: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
f320: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c  name for the col
f330: 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  umn.    */.    i
f340: 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  f( (zName = pELi
f350: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21  st->a[i].zName)!
f360: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
f370: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e  f the column con
f380: 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61  tains an "AS <na
f390: 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65  me>" phrase, use
f3a0: 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e   <name> as the n
f3b0: 61 6d 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ame */.    }else
f3c0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43  {.      Expr *pC
f3d0: 6f 6c 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  olExpr = sqlite3
f3e0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
f3f0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
f400: 70 72 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  pr);.      while
f410: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
f420: 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20  TK_DOT ){.      
f430: 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f    pColExpr = pCo
f440: 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  lExpr->pRight;. 
f450: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
f460: 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ColExpr!=0 );.  
f470: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
f480: 72 74 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  rt( pColExpr->op
f490: 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
f4a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
f4b0: 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  lExpr->op==TK_CO
f4c0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
f4d0: 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75  /* For columns u
f4e0: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  se the column na
f4f0: 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  me name */.     
f500: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43     int iCol = pC
f510: 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b  olExpr->iColumn;
f520: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
f530: 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d  pTab = pColExpr-
f540: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61  >pTab;.        a
f550: 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
f560: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
f570: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
f580: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
f590: 20 20 20 7a 4e 61 6d 65 20 3d 20 69 43 6f 6c 3e     zName = iCol>
f5a0: 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  =0 ? pTab->aCol[
f5b0: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72  iCol].zName : "r
f5c0: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
f5d0: 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d  se if( pColExpr-
f5e0: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
f5f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
f600: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
f610: 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  ColExpr, EP_IntV
f620: 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
f630: 20 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 45 78 70   zName = pColExp
f640: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
f650: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f660: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69    /* Use the ori
f670: 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68  ginal text of th
f680: 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  e column express
f690: 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20  ion as its name 
f6a0: 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  */.        zName
f6b0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
f6c0: 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  zSpan;.      }. 
f6d0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e 61     }.    if( zNa
f6e0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d  me ){.      zNam
f6f0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
f700: 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  Dup(db, zName);.
f710: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f720: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
f730: 4d 50 72 69 6e 74 66 28 64 62 2c 22 63 6f 6c 75  MPrintf(db,"colu
f740: 6d 6e 25 64 22 2c 69 2b 31 29 3b 0a 20 20 20 20  mn%d",i+1);.    
f750: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
f760: 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ure the column n
f770: 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20  ame is unique.  
f780: 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e  If the name is n
f790: 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a  ot unique,.    *
f7a0: 2a 20 61 70 70 65 6e 64 20 61 6e 20 69 6e 74 65  * append an inte
f7b0: 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20  ger to the name 
f7c0: 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d  so that it becom
f7d0: 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a  es unique..    *
f7e0: 2f 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20  /.    cnt = 0;. 
f7f0: 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 20     while( zName 
f800: 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 46 69  && sqlite3HashFi
f810: 6e 64 28 26 68 74 2c 20 7a 4e 61 6d 65 29 21 3d  nd(&ht, zName)!=
f820: 30 20 29 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65  0 ){.      nName
f830: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
f840: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  30(zName);.     
f850: 20 69 66 28 20 6e 4e 61 6d 65 3e 30 20 29 7b 0a   if( nName>0 ){.
f860: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 6e 4e          for(j=nN
f870: 61 6d 65 2d 31 3b 20 6a 3e 30 20 26 26 20 73 71  ame-1; j>0 && sq
f880: 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e 61  lite3Isdigit(zNa
f890: 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a 20  me[j]); j--){}. 
f8a0: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
f8b0: 5b 6a 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65  [j]==':' ) nName
f8c0: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = j;.      }.  
f8d0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
f8e0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
f8f0: 25 2e 2a 7a 3a 25 75 22 2c 20 6e 4e 61 6d 65 2c  %.*z:%u", nName,
f900: 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a   zName, ++cnt);.
f910: 20 20 20 20 20 20 69 66 28 20 63 6e 74 3e 33 20        if( cnt>3 
f920: 29 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d  ) sqlite3_random
f930: 6e 65 73 73 28 73 69 7a 65 6f 66 28 63 6e 74 29  ness(sizeof(cnt)
f940: 2c 20 26 63 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  , &cnt);.    }. 
f950: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
f960: 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69   zName;.    sqli
f970: 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74  te3ColumnPropert
f980: 69 65 73 46 72 6f 6d 4e 61 6d 65 28 30 2c 20 70  iesFromName(0, p
f990: 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  Col);.    if( zN
f9a0: 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48 61  ame && sqlite3Ha
f9b0: 73 68 49 6e 73 65 72 74 28 26 68 74 2c 20 7a 4e  shInsert(&ht, zN
f9c0: 61 6d 65 2c 20 70 43 6f 6c 29 3d 3d 70 43 6f 6c  ame, pCol)==pCol
f9d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f9e0: 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
f9f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
fa00: 65 33 48 61 73 68 43 6c 65 61 72 28 26 68 74 29  e3HashClear(&ht)
fa10: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
fa20: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
fa30: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  for(j=0; j<i; j+
fa40: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
fa50: 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c  3DbFree(db, aCol
fa60: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [j].zName);.    
fa70: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
fa80: 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20  ree(db, aCol);. 
fa90: 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20     *paCol = 0;. 
faa0: 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20     *pnCol = 0;. 
fab0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fac0: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
fad0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
fae0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
faf0: 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  d type and colla
fb00: 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
fb10: 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73   to a column lis
fb20: 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20  t based on.** a 
fb30: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
fb40: 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c  ..** .** The col
fb50: 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d 61  umn list presuma
fb60: 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73 65  bly came from se
fb70: 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46  lectColumnNamesF
fb80: 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a  romExprList()..*
fb90: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
fba0: 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73  t has only names
fbb0: 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20 63  , not types or c
fbc0: 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69 73  ollations.  This
fbd0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  .** routine goes
fbe0: 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64 64   through and add
fbf0: 73 20 74 68 65 20 74 79 70 65 73 20 61 6e 64 20  s the types and 
fc00: 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  collations..**.*
fc10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
fc20: 65 71 75 69 72 65 73 20 74 68 61 74 20 61 6c 6c  equires that all
fc30: 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   identifiers in 
fc40: 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  the SELECT.** st
fc50: 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c  atement be resol
fc60: 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ved..*/.void sql
fc70: 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c  ite3SelectAddCol
fc80: 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
fc90: 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ion(.  Parse *pP
fca0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
fcb0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 73  Parsing contexts
fcc0: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
fcd0: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  b,          /* A
fce0: 64 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69  dd column type i
fcf0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
fd00: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65  is table */.  Se
fd10: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
fd20: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73      /* SELECT us
fd30: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
fd40: 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74  types and collat
fd50: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ions */.){.  sql
fd60: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
fd70: 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e  e->db;.  NameCon
fd80: 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75  text sNC;.  Colu
fd90: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c  mn *pCol;.  Coll
fda0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
fdb0: 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a  t i;.  Expr *p;.
fdc0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
fdd0: 74 5f 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73  t_item *a;..  as
fde0: 73 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30  sert( pSelect!=0
fdf0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
fe00: 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
fe10: 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21   & SF_Resolved)!
fe20: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
fe30: 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c  pTab->nCol==pSel
fe40: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
fe50: 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  pr || db->malloc
fe60: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
fe70: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
fe80: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d   ) return;.  mem
fe90: 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
fea0: 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43  eof(sNC));.  sNC
feb0: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c  .pSrcList = pSel
fec0: 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d  ect->pSrc;.  a =
fed0: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
fee0: 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ->a;.  for(i=0, 
fef0: 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
ff00: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
ff10: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
ff20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
ff30: 70 65 3b 0a 20 20 20 20 69 6e 74 20 6e 2c 20 6d  pe;.    int n, m
ff40: 3b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70  ;.    p = a[i].p
ff50: 45 78 70 72 3b 0a 20 20 20 20 7a 54 79 70 65 20  Expr;.    zType 
ff60: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
ff70: 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  C, p, 0, 0, 0);.
ff80: 20 20 20 20 2f 2a 20 70 43 6f 6c 2d 3e 73 7a 45      /* pCol->szE
ff90: 73 74 20 3d 20 2e 2e 2e 20 2f 2f 20 43 6f 6c 75  st = ... // Colu
ffa0: 6d 6e 20 73 69 7a 65 20 65 73 74 20 66 6f 72 20  mn size est for 
ffb0: 53 45 4c 45 43 54 20 74 61 62 6c 65 73 20 6e 65  SELECT tables ne
ffc0: 76 65 72 20 75 73 65 64 20 2a 2f 0a 20 20 20 20  ver used */.    
ffd0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
ffe0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
fff0: 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28  nity(p);.    if(
10000 20 7a 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20   zType ){.      
10010 6d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  m = sqlite3Strle
10020 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20  n30(zType);.    
10030 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
10040 6c 65 6e 33 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  len30(pCol->zNam
10050 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e  e);.      pCol->
10060 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
10070 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64  bReallocOrFree(d
10080 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20  b, pCol->zName, 
10090 6e 2b 6d 2b 32 29 3b 0a 20 20 20 20 20 20 69 66  n+m+2);.      if
100a0 28 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b  ( pCol->zName ){
100b0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
100c0 26 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31  &pCol->zName[n+1
100d0 5d 2c 20 7a 54 79 70 65 2c 20 6d 2b 31 29 3b 0a  ], zType, m+1);.
100e0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f          pCol->co
100f0 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
10100 47 5f 48 41 53 54 59 50 45 3b 0a 20 20 20 20 20  G_HASTYPE;.     
10110 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
10120 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
10130 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  =0 ) pCol->affin
10140 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
10150 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c  _BLOB;.    pColl
10160 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
10170 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29  llSeq(pParse, p)
10180 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
10190 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d  && pCol->zColl==
101a0 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  0 ){.      pCol-
101b0 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >zColl = sqlite3
101c0 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f  DbStrDup(db, pCo
101d0 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
101e0 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a  }.  }.  pTab->sz
101f0 54 61 62 52 6f 77 20 3d 20 31 3b 20 2f 2a 20 41  TabRow = 1; /* A
10200 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ny non-zero valu
10210 65 20 77 6f 72 6b 73 20 2a 2f 0a 7d 0a 0a 2f 2a  e works */.}../*
10220 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45  .** Given a SELE
10230 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65  CT statement, ge
10240 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73  nerate a Table s
10250 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
10260 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72  scribes.** the r
10270 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61  esult set of tha
10280 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62  t SELECT..*/.Tab
10290 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c  le *sqlite3Resul
102a0 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72  tSetOfSelect(Par
102b0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
102c0 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
102d0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73  Table *pTab;.  s
102e0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
102f0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73  rse->db;.  int s
10300 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61  avedFlags;..  sa
10310 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66  vedFlags = db->f
10320 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  lags;.  db->flag
10330 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c  s &= ~SQLITE_Ful
10340 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d  lColNames;.  db-
10350 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
10360 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a  _ShortColNames;.
10370 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
10380 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c  rep(pParse, pSel
10390 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ect, 0);.  if( p
103a0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
103b0 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28  turn 0;.  while(
103c0 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
103d0 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65   ) pSelect = pSe
103e0 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  lect->pPrior;.  
103f0 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65  db->flags = save
10400 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d  dFlags;.  pTab =
10410 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
10420 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
10430 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20  Table) );.  if( 
10440 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pTab==0 ){.    r
10450 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f  eturn 0;.  }.  /
10460 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52 65 73  * The sqlite3Res
10470 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
10480 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20   is only used n 
10490 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c  contexts where l
104a0 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73  ookaside.  ** is
104b0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61   disabled */.  a
104c0 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61  ssert( db->looka
104d0 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20 29 3b  side.bDisable );
104e0 0a 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66  .  pTab->nTabRef
104f0 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e   = 1;.  pTab->zN
10500 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d  ame = 0;.  pTab-
10510 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
10520 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
10530 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
10540 34 38 35 37 36 29 20 29 3b 0a 20 20 73 71 6c 69  48576) );.  sqli
10550 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
10560 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
10570 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20  Select->pEList, 
10580 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
10590 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c  ab->aCol);.  sql
105a0 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c  ite3SelectAddCol
105b0 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
105c0 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
105d0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54  , pSelect);.  pT
105e0 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
105f0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
10600 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
10610 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
10620 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
10630 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
10640 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
10650 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45  /*.** Get a VDBE
10660 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
10670 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20  arser context.  
10680 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
10690 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
106a0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
106b0 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c  curs, return NUL
106c0 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65  L and leave a me
106d0 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
106e0 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65  .*/.Vdbe *sqlite
106f0 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a  3GetVdbe(Parse *
10700 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70  pParse){.  if( p
10710 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a  Parse->pVdbe ){.
10720 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 72 73      return pPars
10730 65 2d 3e 70 56 64 62 65 3b 0a 20 20 7d 0a 20 20  e->pVdbe;.  }.  
10740 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54 6f 70  if( pParse->pTop
10750 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 26 26 20 4f  level==0.   && O
10760 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
10770 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 53 51  ed(pParse->db,SQ
10780 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f  LITE_FactorOutCo
10790 6e 73 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 50  nst).  ){.    pP
107a0 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63  arse->okConstFac
107b0 74 6f 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  tor = 1;.  }.  r
107c0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
107d0 65 43 72 65 61 74 65 28 70 50 61 72 73 65 29 3b  eCreate(pParse);
107e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
107f0 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
10800 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
10810 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
10820 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70  ased on the.** p
10830 4c 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e  Limit expression
10840 73 2e 20 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  s.  pLimit->pLef
10850 74 20 61 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52  t and pLimit->pR
10860 69 67 68 74 20 68 6f 6c 64 20 74 68 65 20 65 78  ight hold the ex
10870 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
10880 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
10890 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
108a0 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65  tement after the
108b0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
108c0 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20  T.** keywords.  
108d0 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65  Or NULL if those
108e0 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d   keywords are om
108f0 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e  itted. iLimit an
10900 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72  d iOffset .** ar
10910 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65  e the integer me
10920 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75  mory register nu
10930 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65  mbers for counte
10940 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  rs used to compu
10950 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74  te .** the limit
10960 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66   and offset.  If
10970 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d   there is no lim
10980 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74  it and/or offset
10990 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69  , then .** iLimi
109a0 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72  t and iOffset ar
109b0 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a  e negative..**.*
109c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
109d0 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65  hanges the value
109e0 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20  s of iLimit and 
109f0 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a  iOffset only if.
10a00 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66  ** a limit or of
10a10 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20  fset is defined 
10a20 62 79 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74  by pLimit->pLeft
10a30 20 61 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69   and pLimit->pRi
10a40 67 68 74 2e 20 20 69 4c 69 6d 69 74 0a 2a 2a 20  ght.  iLimit.** 
10a50 61 6e 64 20 69 4f 66 66 73 65 74 20 73 68 6f 75  and iOffset shou
10a60 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
10a70 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
10a80 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
10a90 73 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f  s (zero).** prio
10aa0 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
10ab0 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
10ac0 20 54 68 65 20 69 4f 66 66 73 65 74 20 72 65 67   The iOffset reg
10ad0 69 73 74 65 72 20 28 69 66 20 69 74 20 65 78 69  ister (if it exi
10ae0 73 74 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69  sts) is initiali
10af0 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  zed to the value
10b00 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45  .** of the OFFSE
10b10 54 2e 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72  T.  The iLimit r
10b20 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69  egister is initi
10b30 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e  alized to LIMIT.
10b40 20 20 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f    Register.** iO
10b50 66 66 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69  ffset+1 is initi
10b60 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b  alized to LIMIT+
10b70 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  OFFSET..**.** On
10b80 6c 79 20 69 66 20 70 4c 69 6d 69 74 2d 3e 70 4c  ly if pLimit->pL
10b90 65 66 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69  eft!=0 do the li
10ba0 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65  mit registers ge
10bb0 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20  t.** redefined. 
10bc0 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
10bd0 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69  perator uses thi
10be0 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f  s property to fo
10bf0 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65  rce.** the reuse
10c00 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d   of the same lim
10c10 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65  it and offset re
10c20 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d  gisters across m
10c30 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43  ultiple.** SELEC
10c40 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  T statements..*/
10c50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d  .static void com
10c60 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
10c70 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
10c80 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
10c90 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65   iBreak){.  Vdbe
10ca0 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *v = 0;.  int i
10cb0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74  Limit = 0;.  int
10cc0 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20   iOffset;.  int 
10cd0 6e 3b 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  n;.  Expr *pLimi
10ce0 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 0a  t = p->pLimit;..
10cf0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
10d00 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
10d10 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22  .  ** "LIMIT -1"
10d20 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c   always shows al
10d30 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69  l rows.  There i
10d40 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74  s some.  ** cont
10d50 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77 68  roversy about wh
10d60 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  at the correct b
10d70 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62  ehavior should b
10d80 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72  e..  ** The curr
10d90 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
10da0 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c  on interprets "L
10db0 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a  IMIT 0" to mean.
10dc0 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20    ** no rows..  
10dd0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
10de0 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
10df0 65 29 3b 0a 20 20 69 66 28 20 70 4c 69 6d 69 74  e);.  if( pLimit
10e00 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
10e10 70 4c 69 6d 69 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c  pLimit->op==TK_L
10e20 49 4d 49 54 20 29 3b 0a 20 20 20 20 61 73 73 65  IMIT );.    asse
10e30 72 74 28 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  rt( pLimit->pLef
10e40 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69  t!=0 );.    p->i
10e50 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d  Limit = iLimit =
10e60 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
10e70 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
10e80 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
10e90 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d  .    assert( v!=
10ea0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 );.    if( sql
10eb0 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
10ec0 72 28 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c  r(pLimit->pLeft,
10ed0 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71   &n) ){.      sq
10ee0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10ef0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e  v, OP_Integer, n
10f00 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
10f10 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
10f20 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22   "LIMIT counter"
10f30 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d  ));.      if( n=
10f40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
10f50 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
10f60 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
10f70 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26  }else if( n>=0 &
10f80 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  & p->nSelectRow>
10f90 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75  sqlite3LogEst((u
10fa0 36 34 29 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  64)n) ){.       
10fb0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
10fc0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28   sqlite3LogEst((
10fd0 75 36 34 29 6e 29 3b 0a 20 20 20 20 20 20 20 20  u64)n);.        
10fe0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
10ff0 46 5f 46 69 78 65 64 4c 69 6d 69 74 3b 0a 20 20  F_FixedLimit;.  
11000 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
11010 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
11020 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
11030 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 69 4c  Limit->pLeft, iL
11040 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  imit);.      sql
11050 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
11060 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
11070 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76  iLimit); VdbeCov
11080 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
11090 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
110a0 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29  "LIMIT counter")
110b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
110c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
110d0 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20  _IfNot, iLimit, 
110e0 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
110f0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
11100 20 20 20 20 69 66 28 20 70 4c 69 6d 69 74 2d 3e      if( pLimit->
11110 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
11120 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66  p->iOffset = iOf
11130 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  fset = ++pParse-
11140 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61  >nMem;.      pPa
11150 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f  rse->nMem++;   /
11160 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78  * Allocate an ex
11170 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72  tra register for
11180 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f   limit+offset */
11190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
111a0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
111b0 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 2c 20 69  Limit->pRight, i
111c0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
111d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
111e0 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
111f0 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65  , iOffset); Vdbe
11200 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
11210 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
11220 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74  v, "OFFSET count
11230 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  er"));.      sql
11240 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
11250 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74  , OP_OffsetLimit
11260 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65  , iLimit, iOffse
11270 74 2b 31 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  t+1, iOffset);. 
11280 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
11290 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53  ((v, "LIMIT+OFFS
112a0 45 54 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ET"));.    }.  }
112b0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
112c0 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
112d0 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65  _SELECT./*.** Re
112e0 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
112f0 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  iate collating s
11300 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
11310 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
11320 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  f.** the result 
11330 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  set for the comp
11340 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74  ound-select stat
11350 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75  ement "p".  Retu
11360 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68  rn NULL if.** th
11370 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20  e column has no 
11380 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
11390 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
113a0 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
113b0 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
113c0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
113d0 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74   is taken from t
113e0 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
113f0 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65  term of the sele
11400 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  ct that has a co
11410 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
11420 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c  ..*/.static Coll
11430 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  Seq *multiSelect
11440 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
11450 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
11460 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43  , int iCol){.  C
11470 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20  ollSeq *pRet;.  
11480 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
11490 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74  .    pRet = mult
114a0 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
114b0 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72  Parse, p->pPrior
114c0 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65  , iCol);.  }else
114d0 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  {.    pRet = 0;.
114e0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43    }.  assert( iC
114f0 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43  ol>=0 );.  /* iC
11500 6f 6c 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20  ol must be less 
11510 74 68 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  than p->pEList->
11520 6e 45 78 70 72 2e 20 20 4f 74 68 65 72 77 69 73  nExpr.  Otherwis
11530 65 20 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64  e an error would
11540 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
11550 74 68 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61  thrown during na
11560 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e  me resolution an
11570 64 20 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68  d we would not h
11580 61 76 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20  ave gotten.  ** 
11590 74 68 69 73 20 66 61 72 20 2a 2f 0a 20 20 69 66  this far */.  if
115a0 28 20 70 52 65 74 3d 3d 30 20 26 26 20 41 4c 57  ( pRet==0 && ALW
115b0 41 59 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69  AYS(iCol<p->pELi
115c0 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
115d0 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
115e0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
115f0 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  se, p->pEList->a
11600 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20  [iCol].pExpr);. 
11610 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
11620 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
11630 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
11640 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
11650 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
11660 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
11670 45 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f  ECT.** with an O
11680 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
11690 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
116a0 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75  locates and retu
116b0 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a  rns a KeyInfo.**
116c0 20 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61   structure suita
116d0 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e  ble for implemen
116e0 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
116f0 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  Y..**.** Space t
11700 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e  o hold the KeyIn
11710 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
11720 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
11730 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e  lloc. The callin
11740 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  g.** function is
11750 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
11760 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74   ensuring that t
11770 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
11780 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
11790 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  reed..*/.static 
117a0 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65  KeyInfo *multiSe
117b0 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
117c0 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
117d0 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
117e0 20 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72   nExtra){.  Expr
117f0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
11800 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
11810 69 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  int nOrderBy = p
11820 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
11830 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r;.  sqlite3 *db
11840 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
11850 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d   KeyInfo *pRet =
11860 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
11870 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42  lloc(db, nOrderB
11880 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20  y+nExtra, 1);.  
11890 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
118a0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
118b0 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
118c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
118d0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
118e0 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65   *pItem = &pOrde
118f0 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  rBy->a[i];.     
11900 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70   Expr *pTerm = p
11910 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
11920 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
11930 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54  l;..      if( pT
11940 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  erm->flags & EP_
11950 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
11960 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
11970 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
11980 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20  arse, pTerm);.  
11990 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
119a0 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69     pColl = multi
119b0 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
119c0 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e  arse, p, pItem->
119d0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d  u.x.iOrderByCol-
119e0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
119f0 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c  pColl==0 ) pColl
11a00 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
11a10 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
11a20 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  By->a[i].pExpr =
11a30 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11a40 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
11a50 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70  String(pParse, p
11a60 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  Term, pColl->zNa
11a70 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
11a80 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
11a90 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
11aa0 61 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20  able(pRet) );.  
11ab0 20 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b      pRet->aColl[
11ac0 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
11ad0 20 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64    pRet->aSortOrd
11ae0 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79  er[i] = pOrderBy
11af0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
11b00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
11b10 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23  eturn pRet;.}..#
11b20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11b30 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69  IT_CTE./*.** Thi
11b40 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
11b50 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f  tes VDBE code to
11b60 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e   compute the con
11b70 74 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52  tent of a WITH R
11b80 45 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72  ECURSIVE.** quer
11b90 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  y of the form:.*
11ba0 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76  *.**   <recursiv
11bb0 65 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65  e-table> AS (<se
11bc0 74 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e  tup-query> UNION
11bd0 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76   [ALL] <recursiv
11be0 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20  e-query>).**    
11bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c00 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
11c10 5f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  _/             \
11c20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
11c30 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
11c50 3e 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20  >pPrior         
11c60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a               p.*
11c70 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  *.**.** There is
11c80 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66   exactly one ref
11c90 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65  erence to the re
11ca0 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e  cursive-table in
11cb0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
11cc0 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65  .** of recursive
11cd0 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77  -query, marked w
11ce0 69 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d  ith the SrcList-
11cf0 3e 61 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72 73  >a[].fg.isRecurs
11d00 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20  ive flag..**.** 
11d10 54 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20  The setup-query 
11d20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e  runs once to gen
11d30 65 72 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c  erate an initial
11d40 20 73 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61   set of rows tha
11d50 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51  t go.** into a Q
11d60 75 65 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77  ueue table.  Row
11d70 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20  s are extracted 
11d80 66 72 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74  from the Queue t
11d90 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f  able one by.** o
11da0 6e 65 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78  ne.  Each row ex
11db0 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65  tracted from Que
11dc0 75 65 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20  ue is output to 
11dd0 70 44 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65  pDest.  Then the
11de0 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61   single.** extra
11df0 63 74 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e  cted row (now in
11e00 20 74 68 65 20 69 43 75 72 72 65 6e 74 20 74 61   the iCurrent ta
11e10 62 6c 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65  ble) becomes the
11e20 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a   content of the.
11e30 2a 2a 20 72 65 63 75 72 73 69 76 65 2d 74 61 62  ** recursive-tab
11e40 6c 65 20 66 6f 72 20 61 20 72 65 63 75 72 73 69  le for a recursi
11e50 76 65 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54  ve-query run.  T
11e60 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
11e70 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79   recursive-query
11e80 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 62 61 63  .** is added bac
11e90 6b 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65  k into the Queue
11ea0 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e   table.  Then an
11eb0 6f 74 68 65 72 20 72 6f 77 20 69 73 20 65 78 74  other row is ext
11ec0 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75  racted from Queu
11ed0 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65  e.** and the ite
11ee0 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ration continues
11ef0 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65   until the Queue
11f00 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
11f10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
11f20 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65  mpound query ope
11f30 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74  rator is UNION t
11f40 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65  hen no duplicate
11f50 20 72 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a   rows are ever.*
11f60 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  * inserted into 
11f70 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e  the Queue table.
11f80 20 20 54 68 65 20 69 44 69 73 74 69 6e 63 74 20    The iDistinct 
11f90 74 61 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f  table keeps a co
11fa0 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a  py of all rows.*
11fb0 2a 20 74 68 61 74 20 68 61 76 65 20 65 76 65 72  * that have ever
11fc0 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69   been inserted i
11fd0 6e 74 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61  nto Queue and ca
11fe0 75 73 65 73 20 64 75 70 6c 69 63 61 74 65 73 20  uses duplicates 
11ff0 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64  to be.** discard
12000 65 64 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72  ed.  If the oper
12010 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c  ator is UNION AL
12020 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74  L, then duplicat
12030 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  es are allowed..
12040 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75  ** .** If the qu
12050 65 72 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52  ery has an ORDER
12060 20 42 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65   BY, then entrie
12070 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 74  s in the Queue t
12080 61 62 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e  able are kept in
12090 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64  .** ORDER BY ord
120a0 65 72 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  er and the first
120b0 20 65 6e 74 72 79 20 69 73 20 65 78 74 72 61 63   entry is extrac
120c0 74 65 64 20 66 6f 72 20 65 61 63 68 20 63 79 63  ted for each cyc
120d0 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20  le.  Without.** 
120e0 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65  an ORDER BY, the
120f0 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20   Queue table is 
12100 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a  just a FIFO..**.
12110 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c  ** If a LIMIT cl
12120 61 75 73 65 20 69 73 20 70 72 6f 76 69 64 65 64  ause is provided
12130 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61  , then the itera
12140 74 69 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72  tion stops after
12150 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68   LIMIT rows.** h
12160 61 76 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20  ave been output 
12170 74 6f 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d  to pDest.  A LIM
12180 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73  IT of zero means
12190 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f   to output no ro
121a0 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61  ws and a.** nega
121b0 74 69 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73  tive LIMIT means
121c0 20 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72   to output all r
121d0 6f 77 73 2e 20 20 49 66 20 74 68 65 72 65 20 69  ows.  If there i
121e0 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54  s also an OFFSET
121f0 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20   clause.** with 
12200 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  a positive value
12210 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
12220 20 4f 46 46 53 45 54 20 6f 75 74 70 75 74 73 20   OFFSET outputs 
12230 61 72 65 20 64 69 73 63 61 72 64 65 64 20 72 61  are discarded ra
12240 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69  ther.** than bei
12250 6e 67 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74  ng sent to pDest
12260 2e 20 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75  .  The LIMIT cou
12270 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  nt does not begi
12280 6e 20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46  n until after OF
12290 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76  FSET.** rows hav
122a0 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a  e been skipped..
122b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
122c0 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72  enerateWithRecur
122d0 73 69 76 65 51 75 65 72 79 28 0a 20 20 50 61 72  siveQuery(.  Par
122e0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
122f0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
12300 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
12310 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
12320 20 2f 2a 20 54 68 65 20 72 65 63 75 72 73 69 76   /* The recursiv
12330 65 20 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63  e SELECT to be c
12340 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
12350 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
12360 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
12370 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
12380 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
12390 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
123a0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
123b0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
123c0 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79   recursive query
123d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d   */.  int nCol =
123e0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
123f0 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  r;  /* Number of
12400 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
12410 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 20  recursive table 
12420 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
12430 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
12440 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
12450 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64  ed statement und
12460 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
12470 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
12480 74 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  tup = p->pPrior;
12490 20 20 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20     /* The setup 
124a0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61  query */.  int a
124b0 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20  ddrTop;         
124c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
124d0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  of the loop */. 
124e0 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61   int addrCont, a
124f0 64 64 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f  ddrBreak;      /
12500 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42  * CONTINUE and B
12510 52 45 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a  REAK addresses *
12520 2f 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74  /.  int iCurrent
12530 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
12540 20 20 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74    /* The Current
12550 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
12560 72 65 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20  regCurrent;     
12570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
12580 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75  ister holding Cu
12590 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20  rrent table */. 
125a0 20 69 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20   int iQueue;    
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
125c0 2a 20 54 68 65 20 51 75 65 75 65 20 74 61 62 6c  * The Queue tabl
125d0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74  e */.  int iDist
125e0 69 6e 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20  inct = 0;       
125f0 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72       /* To ensur
12600 65 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73  e unique results
12610 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69   if UNION */.  i
12620 6e 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46  nt eDest = SRT_F
12630 69 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ifo;         /* 
12640 48 6f 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20  How to write to 
12650 51 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63  Queue */.  Selec
12660 74 44 65 73 74 20 64 65 73 74 51 75 65 75 65 3b  tDest destQueue;
12670 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
12680 63 74 44 65 73 74 20 74 61 72 67 65 74 74 69 6e  ctDest targettin
12690 67 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  g the Queue tabl
126a0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126c0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
126d0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
126e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
126f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
12700 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72  t code */.  Expr
12710 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
12720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12730 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
12740 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d   */.  Expr *pLim
12750 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
12760 20 20 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d      /* Saved LIM
12770 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f  IT and OFFSET */
12780 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c  .  int regLimit,
12790 20 72 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20   regOffset;     
127a0 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 75 73   /* Registers us
127b0 65 64 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20  ed by LIMIT and 
127c0 4f 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20  OFFSET */..  /* 
127d0 4f 62 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61  Obtain authoriza
127e0 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63  tion to do a rec
127f0 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a  ursive query */.
12800 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
12810 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
12820 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c  QLITE_RECURSIVE,
12830 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75   0, 0, 0) ) retu
12840 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73  rn;..  /* Proces
12850 73 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  s the LIMIT and 
12860 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20  OFFSET clauses, 
12870 69 66 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f  if they exist */
12880 0a 20 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73  .  addrBreak = s
12890 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
128a0 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65  bel(v);.  p->nSe
128b0 6c 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20  lectRow = 320;  
128c0 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77  /* 4 billion row
128d0 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69  s */.  computeLi
128e0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
128f0 72 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61  rse, p, addrBrea
12900 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70  k);.  pLimit = p
12910 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4c  ->pLimit;.  regL
12920 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
12930 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20 3d 20  ;.  regOffset = 
12940 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d  p->iOffset;.  p-
12950 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >pLimit = 0;.  p
12960 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f  ->iLimit = p->iO
12970 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72  ffset = 0;.  pOr
12980 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
12990 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  rBy;..  /* Locat
129a0 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  e the cursor num
129b0 62 65 72 20 6f 66 20 74 68 65 20 43 75 72 72 65  ber of the Curre
129c0 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f  nt table */.  fo
129d0 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c  r(i=0; ALWAYS(i<
129e0 70 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b  pSrc->nSrc); i++
129f0 29 7b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  ){.    if( pSrc-
12a00 3e 61 5b 69 5d 2e 66 67 2e 69 73 52 65 63 75 72  >a[i].fg.isRecur
12a10 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43  sive ){.      iC
12a20 75 72 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61  urrent = pSrc->a
12a30 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20  [i].iCursor;.   
12a40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
12a50 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
12a60 74 65 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65  te cursors numbe
12a70 72 73 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64  rs for Queue and
12a80 20 44 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20   Distinct.  The 
12a90 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
12aa0 72 0a 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69  r.  ** the Disti
12ab0 6e 63 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62  nct table must b
12ac0 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72  e exactly one gr
12ad0 65 61 74 65 72 20 74 68 61 6e 20 51 75 65 75 65  eater than Queue
12ae0 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66   in order.  ** f
12af0 6f 72 20 74 68 65 20 53 52 54 5f 44 69 73 74 46  or the SRT_DistF
12b00 69 66 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74  ifo and SRT_Dist
12b10 51 75 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f  Queue destinatio
12b20 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20  ns to work. */. 
12b30 20 69 51 75 65 75 65 20 3d 20 70 50 61 72 73 65   iQueue = pParse
12b40 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20  ->nTab++;.  if( 
12b50 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
12b60 29 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70  ){.    eDest = p
12b70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69  OrderBy ? SRT_Di
12b80 73 74 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69  stQueue : SRT_Di
12b90 73 74 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73  stFifo;.    iDis
12ba0 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
12bb0 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  nTab++;.  }else{
12bc0 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72  .    eDest = pOr
12bd0 64 65 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75  derBy ? SRT_Queu
12be0 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20  e : SRT_Fifo;.  
12bf0 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  }.  sqlite3Selec
12c00 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 51  tDestInit(&destQ
12c10 75 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75  ueue, eDest, iQu
12c20 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  eue);..  /* Allo
12c30 63 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72  cate cursors for
12c40 20 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c   Current, Queue,
12c50 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a   and Distinct. *
12c60 2f 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d  /.  regCurrent =
12c70 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
12c80 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12c90 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
12ca0 73 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c  seudo, iCurrent,
12cb0 20 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f   regCurrent, nCo
12cc0 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72  l);.  if( pOrder
12cd0 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  By ){.    KeyInf
12ce0 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75  o *pKeyInfo = mu
12cf0 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
12d00 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
12d10 70 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, 1);.    sqlit
12d20 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
12d30 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
12d40 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72  , iQueue, pOrder
12d50 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a  By->nExpr+2, 0,.
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d70 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
12d80 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
12d90 4f 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75  O);.    destQueu
12da0 65 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  e.pOrderBy = pOr
12db0 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a  derBy;.  }else{.
12dc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12dd0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
12de0 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75  Ephemeral, iQueu
12df0 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20  e, nCol);.  }.  
12e00 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
12e10 22 51 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b  "Queue table"));
12e20 0a 20 20 69 66 28 20 69 44 69 73 74 69 6e 63 74  .  if( iDistinct
12e30 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f   ){.    p->addrO
12e40 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c  penEphm[0] = sql
12e50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12e60 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
12e70 61 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30  al, iDistinct, 0
12e80 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  );.    p->selFla
12e90 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68  gs |= SF_UsesEph
12ea0 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f  emeral;.  }..  /
12eb0 2a 20 44 65 74 61 63 68 20 74 68 65 20 4f 52 44  * Detach the ORD
12ec0 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f  ER BY clause fro
12ed0 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53  m the compound S
12ee0 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f  ELECT */.  p->pO
12ef0 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f  rderBy = 0;..  /
12f00 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
12f10 6c 74 73 20 6f 66 20 74 68 65 20 73 65 74 75 70  lts of the setup
12f20 2d 71 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e  -query in Queue.
12f30 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e   */.  pSetup->pN
12f40 65 78 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  ext = 0;.  rc = 
12f50 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
12f60 61 72 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64  arse, pSetup, &d
12f70 65 73 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65  estQueue);.  pSe
12f80 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  tup->pNext = p;.
12f90 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
12fa0 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65  end_of_recursive
12fb0 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69  _query;..  /* Fi
12fc0 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  nd the next row 
12fd0 69 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e 64  in the Queue and
12fe0 20 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f 77   output that row
12ff0 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20   */.  addrTop = 
13000 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13010 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
13020 69 51 75 65 75 65 2c 20 61 64 64 72 42 72 65 61  iQueue, addrBrea
13030 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
13040 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73  (v);..  /* Trans
13050 66 65 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77  fer the next row
13060 20 69 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74   in Queue over t
13070 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73  o Current */.  s
13080 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
13090 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
130a0 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f  iCurrent); /* To
130b0 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61   reset column ca
130c0 63 68 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  che */.  if( pOr
130d0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
130e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
130f0 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75  , OP_Column, iQu
13100 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  eue, pOrderBy->n
13110 45 78 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65  Expr+1, regCurre
13120 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nt);.  }else{.  
13130 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13140 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74  Op2(v, OP_RowDat
13150 61 2c 20 69 51 75 65 75 65 2c 20 72 65 67 43 75  a, iQueue, regCu
13160 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71  rrent);.  }.  sq
13170 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
13180 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51  v, OP_Delete, iQ
13190 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74  ueue);..  /* Out
131a0 70 75 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72  put the single r
131b0 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f  ow in Current */
131c0 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71  .  addrCont = sq
131d0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
131e0 65 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66  el(v);.  codeOff
131f0 73 65 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74  set(v, regOffset
13200 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73  , addrCont);.  s
13210 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
13220 50 61 72 73 65 2c 20 70 2c 20 69 43 75 72 72 65  Parse, p, iCurre
13230 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20  nt,.      0, 0, 
13240 70 44 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c  pDest, addrCont,
13250 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69   addrBreak);.  i
13260 66 28 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20  f( regLimit ){. 
13270 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13280 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a  dOp2(v, OP_DecrJ
13290 75 6d 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69  umpZero, regLimi
132a0 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  t, addrBreak);. 
132b0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
132c0 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  v);.  }.  sqlite
132d0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
132e0 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a  l(v, addrCont);.
132f0 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68  .  /* Execute th
13300 65 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45  e recursive SELE
13310 43 54 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69  CT taking the si
13320 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72  ngle row in Curr
13330 65 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ent as.  ** the 
13340 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65  value for the re
13350 63 75 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53  cursive-table. S
13360 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
13370 20 69 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20   in the Queue.. 
13380 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
13390 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
133a0 67 61 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  gate ){.    sqli
133b0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
133c0 73 65 2c 20 22 72 65 63 75 72 73 69 76 65 20 61  se, "recursive a
133d0 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
133e0 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 29   not supported")
133f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
13400 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
13410 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
13420 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
13430 51 75 65 75 65 29 3b 0a 20 20 20 20 61 73 73 65  Queue);.    asse
13440 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  rt( p->pPrior==0
13450 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f   );.    p->pPrio
13460 72 20 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a  r = pSetup;.  }.
13470 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69  .  /* Keep runni
13480 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69  ng the loop unti
13490 6c 20 74 68 65 20 51 75 65 75 65 20 69 73 20 65  l the Queue is e
134a0 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mpty */.  sqlite
134b0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
134c0 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  rTop);.  sqlite3
134d0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
134e0 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  (v, addrBreak);.
134f0 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76  .end_of_recursiv
13500 65 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74  e_query:.  sqlit
13510 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
13520 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
13530 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e  pOrderBy);.  p->
13540 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
13550 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  rBy;.  p->pLimit
13560 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 72 65 74   = pLimit;.  ret
13570 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  urn;.}.#endif /*
13580 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
13590 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20   */../* Forward 
135a0 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74  references */.st
135b0 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
135c0 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50  lectOrderBy(.  P
135d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
135e0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
135f0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
13600 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
13610 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
13620 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
13630 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
13640 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
13650 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
13660 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
13670 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f  results */.);../
13680 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20 74 68 65 20  *.** Handle the 
13690 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20  special case of 
136a0 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  a compound-selec
136b0 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65  t that originate
136c0 73 20 66 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55  s from a.** VALU
136d0 45 53 20 63 6c 61 75 73 65 2e 20 20 42 79 20 68  ES clause.  By h
136e0 61 6e 64 6c 69 6e 67 20 74 68 69 73 20 61 73 20  andling this as 
136f0 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 2c 20  a special case, 
13700 77 65 20 61 76 6f 69 64 20 64 65 65 70 0a 2a 2a  we avoid deep.**
13710 20 72 65 63 75 72 73 69 6f 6e 2c 20 61 6e 64 20   recursion, and 
13720 74 68 75 73 20 64 6f 20 6e 6f 74 20 6e 65 65 64  thus do not need
13730 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 65 20   to enforce the 
13740 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d  SQLITE_LIMIT_COM
13750 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a 20  POUND_SELECT.** 
13760 6f 6e 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75  on a VALUES clau
13770 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73  se..**.** Becaus
13780 65 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a  e the Select obj
13790 65 63 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66  ect originates f
137a0 72 6f 6d 20 61 20 56 41 4c 55 45 53 20 63 6c 61  rom a VALUES cla
137b0 75 73 65 3a 0a 2a 2a 20 20 20 28 31 29 20 54 68  use:.**   (1) Th
137c0 65 72 65 20 69 73 20 6e 6f 20 4c 49 4d 49 54 20  ere is no LIMIT 
137d0 6f 72 20 4f 46 46 53 45 54 20 6f 72 20 65 6c 73  or OFFSET or els
137e0 65 20 74 68 65 72 65 20 69 73 20 61 20 4c 49 4d  e there is a LIM
137f0 49 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31 0a  IT of exactly 1.
13800 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65 72  **   (2) All ter
13810 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c  ms are UNION ALL
13820 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65 20  .**   (3) There 
13830 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  is no ORDER BY c
13840 6c 61 75 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lause.**.** The 
13850 22 4c 49 4d 49 54 20 6f 66 20 65 78 61 63 74 6c  "LIMIT of exactl
13860 79 20 31 22 20 63 61 73 65 20 6f 66 20 63 6f 6e  y 1" case of con
13870 64 69 74 69 6f 6e 20 28 31 29 20 63 6f 6d 65 73  dition (1) comes
13880 20 61 62 6f 75 74 20 77 68 65 6e 20 61 20 56 41   about when a VA
13890 4c 55 45 53 0a 2a 2a 20 63 6c 61 75 73 65 20 6f  LUES.** clause o
138a0 63 63 75 72 73 20 77 69 74 68 69 6e 20 73 63 61  ccurs within sca
138b0 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 28  lar expression (
138c0 65 78 3a 20 22 53 45 4c 45 43 54 20 28 56 41 4c  ex: "SELECT (VAL
138d0 55 45 53 28 31 29 2c 28 32 29 2c 28 33 29 29 22  UES(1),(2),(3))"
138e0 29 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  )..** The sqlite
138f0 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 20 77  3CodeSubselect w
13900 69 6c 6c 20 68 61 76 65 20 61 64 64 65 64 20 74  ill have added t
13910 68 65 20 4c 49 4d 49 54 20 31 20 63 6c 61 75 73  he LIMIT 1 claus
13920 65 20 69 6e 20 74 68 74 20 63 61 73 65 2e 0a 2a  e in tht case..*
13930 2a 20 53 69 6e 63 65 20 74 68 65 20 6c 69 6d 69  * Since the limi
13940 74 20 69 73 20 65 78 61 63 74 6c 79 20 31 2c 20  t is exactly 1, 
13950 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20  we only need to 
13960 65 76 61 6c 75 74 65 73 20 74 68 65 20 6c 65 66  evalutes the lef
13970 74 2d 6d 6f 73 74 20 56 41 4c 55 45 53 2e 0a 2a  t-most VALUES..*
13980 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
13990 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 0a  tiSelectValues(.
139a0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
139b0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
139c0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
139d0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
139e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
139f0 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
13a00 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
13a10 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
13a20 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
13a30 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
13a40 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
13a50 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
13a60 72 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 52 69  r;.  Select *pRi
13a70 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 69  ghtmost = p;.  i
13a80 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69  nt nRow = 1;.  i
13a90 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 61 73 73  nt rc = 0;.  ass
13aa0 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
13ab0 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65   & SF_MultiValue
13ac0 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73   );.  do{.    as
13ad0 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
13ae0 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b  s & SF_Values );
13af0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
13b00 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70  op==TK_ALL || (p
13b10 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
13b20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29  && p->pPrior==0)
13b30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13b40 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  p->pNext==0 || p
13b50 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  ->pEList->nExpr=
13b60 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73  =p->pNext->pELis
13b70 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
13b80 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  if( p->pPrior==0
13b90 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73   ) break;.    as
13ba0 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d  sert( p->pPrior-
13bb0 3e 70 4e 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20  >pNext==p );.   
13bc0 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a   p = p->pPrior;.
13bd0 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 7d 77      nRow++;.  }w
13be0 68 69 6c 65 28 31 29 3b 0a 20 20 77 68 69 6c 65  hile(1);.  while
13bf0 28 20 70 20 29 7b 0a 20 20 20 20 70 50 72 69 6f  ( p ){.    pPrio
13c00 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
13c10 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
13c20 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
13c30 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
13c40 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20   p, pDest);.    
13c50 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
13c60 6f 72 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c  or;.    if( rc |
13c70 7c 20 70 52 69 67 68 74 6d 6f 73 74 2d 3e 70 4c  | pRightmost->pL
13c80 69 6d 69 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  imit ) break;.  
13c90 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
13ca0 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20  = nRow;.    p = 
13cb0 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
13cc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13cd0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13ce0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
13cf0 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ocess a compound
13d00 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d   query form from
13d10 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  .** two or more 
13d20 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73  separate queries
13d30 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e   using UNION, UN
13d40 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c  ION ALL, EXCEPT,
13d50 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54   or.** INTERSECT
13d60 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74  .**.** "p" point
13d70 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
13d80 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71  ost of the two q
13d90 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65  ueries.  the que
13da0 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66  ry on the.** lef
13db0 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20  t is p->pPrior. 
13dc0 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20   The left query 
13dd0 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20  could also be a 
13de0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a  compound query.*
13df0 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  * in which case 
13e00 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
13e10 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75  l be called recu
13e20 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20  rsively. .**.** 
13e30 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  The results of t
13e40 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61  he total query a
13e50 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  re to be written
13e60 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74   into a destinat
13e70 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65  ion.** of type e
13e80 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65  Dest with parame
13e90 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ter iParm..**.**
13ea0 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e   Example 1:  Con
13eb0 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61  sider a three-wa
13ec0 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73  y compound SQL s
13ed0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
13ee0 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
13ef0 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t1 UNION SELEC
13f00 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T b FROM t2 UNIO
13f10 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20  N SELECT c FROM 
13f20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74  t3.**.** This st
13f30 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
13f40 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d up as follows:
13f50 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
13f60 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20  T c FROM t3.**  
13f70 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d      |.**      `-
13f80 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20  ---->  SELECT b 
13f90 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20  FROM t2.**      
13fa0 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20            |.**  
13fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d                `-
13fc0 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61  ----->  SELECT a
13fd0 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54   FROM t1.**.** T
13fe0 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65  he arrows in the
13ff0 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72   diagram above r
14000 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c  epresent the Sel
14010 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74  ect.pPrior point
14020 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69  er..** So if thi
14030 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
14040 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c  led with p equal
14050 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79   to the t3 query
14060 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72  , then.** pPrior
14070 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20   will be the t2 
14080 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69  query.  p->op wi
14090 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69  ll be TK_UNION i
140a0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
140b0 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62  ** Notice that b
140c0 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
140d0 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20  y SQLite parses 
140e0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  compound SELECTs
140f0 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  , the.** individ
14100 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61  ual selects alwa
14110 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65  ys group from le
14120 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a  ft to right..*/.
14130 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
14140 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
14150 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
14160 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
14170 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
14180 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
14190 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
141a0 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
141b0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
141c0 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
141d0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
141e0 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
141f0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ts */.){.  int r
14200 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
14210 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65   /* Success code
14220 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69   from a subrouti
14230 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ne */.  Select *
14240 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
14250 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
14260 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
14270 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
14280 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
14290 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
142a0 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
142b0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
142c0 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41   dest;      /* A
142d0 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20  lternative data 
142e0 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
142f0 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65   Select *pDelete
14300 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20   = 0;  /* Chain 
14310 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  of simple select
14320 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  s to delete */. 
14330 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
14340 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
14350 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
14360 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14370 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
14380 6e 74 20 69 53 75 62 31 20 3d 20 30 3b 20 20 20  nt iSub1 = 0;   
14390 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
143a0 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72  f left-hand quer
143b0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  y */.  int iSub2
143c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
143d0 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d  EQP id of right-
143e0 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65  hand query */.#e
143f0 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ndif..  /* Make 
14400 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
14410 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
14420 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69  IT clause on pri
14430 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c  or SELECTs.  Onl
14440 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20  y.  ** the last 
14450 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c  (right-most) SEL
14460 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65  ECT in the serie
14470 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52  s may have an OR
14480 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e  DER BY or LIMIT.
14490 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
144a0 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29  p && p->pPrior )
144b0 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75  ;  /* Calling fu
144c0 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65  nction guarantee
144d0 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20  s this much */. 
144e0 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
144f0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
14500 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f  sive)==0 || p->o
14510 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e  p==TK_ALL || p->
14520 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
14530 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
14540 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d  b;.  pPrior = p-
14550 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20  >pPrior;.  dest 
14560 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20  = *pDest;.  if( 
14570 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
14580 20 7c 7c 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d   || pPrior->pLim
14590 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
145a0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
145b0 2c 22 25 73 20 63 6c 61 75 73 65 20 73 68 6f 75  ,"%s clause shou
145c0 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
145d0 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
145e0 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64      pPrior->pOrd
145f0 65 72 42 79 21 3d 30 20 3f 20 22 4f 52 44 45 52  erBy!=0 ? "ORDER
14600 20 42 59 22 20 3a 20 22 4c 49 4d 49 54 22 2c 20   BY" : "LIMIT", 
14610 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
14620 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
14630 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
14640 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
14650 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
14660 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
14670 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
14680 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61  ;  /* The VDBE a
14690 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62  lready created b
146a0 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  y calling functi
146b0 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61  on */..  /* Crea
146c0 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  te the destinati
146d0 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  on temporary tab
146e0 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a  le if necessary.
146f0 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e    */.  if( dest.
14700 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
14710 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
14720 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
14730 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14740 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
14750 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e  Ephemeral, dest.
14760 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69  iSDParm, p->pELi
14770 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
14780 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
14790 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _Table;.  }..  /
147a0 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69  * Special handli
147b0 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  ng for a compoun
147c0 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72  d-select that or
147d0 69 67 69 6e 61 74 65 73 20 61 73 20 61 20 56 41  iginates as a VA
147e0 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a  LUES clause..  *
147f0 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
14800 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61  ags & SF_MultiVa
14810 6c 75 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lue ){.    rc = 
14820 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65  multiSelectValue
14830 73 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  s(pParse, p, &de
14840 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  st);.    goto mu
14850 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
14860 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
14870 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
14880 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
14890 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
148a0 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
148b0 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
148c0 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
148d0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
148e0 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
148f0 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 61 73 73  >pEList );.  ass
14900 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ert( p->pEList->
14910 6e 45 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e 70  nExpr==pPrior->p
14920 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
14930 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14940 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20 70  OMIT_CTE.  if( p
14950 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
14960 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
14970 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63   generateWithRec
14980 75 72 73 69 76 65 51 75 65 72 79 28 70 50 61 72  ursiveQuery(pPar
14990 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20  se, p, &dest);. 
149a0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
149b0 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c   /* Compound SEL
149c0 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20 61  ECTs that have a
149d0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
149e0 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  e are handled se
149f0 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  parately..  */. 
14a00 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
14a10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d   ){.    return m
14a20 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
14a30 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  y(pParse, p, pDe
14a40 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  st);.  }else..  
14a50 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
14a60 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e   for the left an
14a70 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73  d right SELECT s
14a80 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
14a90 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
14aa0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
14ab0 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
14ac0 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  addr = 0;.      
14ad0 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20  int nLimit;.    
14ae0 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
14af0 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20  r->pLimit );.   
14b00 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69     pPrior->iLimi
14b10 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
14b20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66       pPrior->iOf
14b30 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
14b40 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
14b50 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  >pLimit = p->pLi
14b60 6d 69 74 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  mit;.      expla
14b70 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
14b80 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
14b90 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
14ba0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
14bb0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
14bc0 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ior, &dest);.   
14bd0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
14be0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
14bf0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
14c00 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
14c10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
14c20 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
14c30 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
14c40 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
14c50 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
14c60 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
14c70 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  et;.      if( p-
14c80 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
14c90 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
14ca0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
14cb0 50 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d  P_IfNot, p->iLim
14cc0 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
14cd0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64  e(v);.        Vd
14ce0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a  beComment((v, "J
14cf0 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d  ump ahead if LIM
14d00 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20  IT reached"));. 
14d10 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4f         if( p->iO
14d20 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20  ffset ){.       
14d30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14d40 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65  dOp3(v, OP_Offse
14d50 74 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  tLimit,.        
14d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d70 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70      p->iLimit, p
14d80 2d 3e 69 4f 66 66 73 65 74 2b 31 2c 20 70 2d 3e  ->iOffset+1, p->
14d90 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  iOffset);.      
14da0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14db0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
14dc0 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
14dd0 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
14de0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
14df0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
14e00 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20  se, p, &dest);. 
14e10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
14e20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
14e30 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
14e40 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
14e50 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
14e60 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  ior;.      p->nS
14e70 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
14e80 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e  e3LogEstAdd(p->n
14e90 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f  SelectRow, pPrio
14ea0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  r->nSelectRow);.
14eb0 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72        if( pPrior
14ec0 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20  ->pLimit.       
14ed0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
14ee0 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e  Integer(pPrior->
14ef0 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26  pLimit->pLeft, &
14f00 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26  nLimit).       &
14f10 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d  & nLimit>0 && p-
14f20 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 73 71  >nSelectRow > sq
14f30 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
14f40 29 6e 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20  )nLimit) .      
14f50 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  ){.        p->nS
14f60 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
14f70 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c  e3LogEst((u64)nL
14f80 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  imit);.      }. 
14f90 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b       if( addr ){
14fa0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14fb0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14fc0 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  addr);.      }. 
14fd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14fe0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  }.    case TK_EX
14ff0 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54  CEPT:.    case T
15000 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
15010 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20   int unionTab;  
15020 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
15030 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  er of the tempor
15040 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e  ary table holdin
15050 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  g result */.    
15060 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20    u8 op = 0;    
15070 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
15080 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
15090 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
150a0 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70  f */.      int p
150b0 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54  riorOp;     /* T
150c0 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
150d0 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72  n to apply to pr
150e0 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20  ior selects */. 
150f0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
15100 74 3b 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76  t;    /* Saved v
15110 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d  alues of p->nLim
15120 69 74 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  it  */.      int
15130 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
15140 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73  ectDest uniondes
15150 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61  t;..      testca
15160 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  se( p->op==TK_EX
15170 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20 74 65  CEPT );.      te
15180 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
15190 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20  K_UNION );.     
151a0 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55   priorOp = SRT_U
151b0 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  nion;.      if( 
151c0 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f  dest.eDest==prio
151d0 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  rOp ){.        /
151e0 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61  * We can reuse a
151f0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15200 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20   generated by a 
15210 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20  SELECT to our.  
15220 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a        ** right..
15230 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
15240 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c     assert( p->pL
15250 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  imit==0 );      
15260 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  /* Not allowed o
15270 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65  n leftward eleme
15280 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  nts */.        u
15290 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69  nionTab = dest.i
152a0 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65  SDParm;.      }e
152b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
152c0 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  We will need to 
152d0 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74  create our own t
152e0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74  emporary table t
152f0 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20  o hold the.     
15300 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61     ** intermedia
15310 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20  te results..    
15320 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75      */.        u
15330 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65  nionTab = pParse
15340 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
15350 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
15360 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
15370 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
15380 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15390 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
153a0 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
153b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
153c0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
153d0 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
153e0 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
153f0 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
15400 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74         findRight
15410 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67  most(p)->selFlag
15420 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
15430 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61  meral;.        a
15440 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
15450 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
15460 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
15470 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
15480 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20   to our left.   
15490 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
154a0 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72  rt( !pPrior->pOr
154b0 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73  derBy );.      s
154c0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
154d0 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c  Init(&uniondest,
154e0 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54   priorOp, unionT
154f0 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  ab);.      expla
15500 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
15510 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
15520 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
15530 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
15540 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
15550 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  ior, &uniondest)
15560 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
15570 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
15580 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
15590 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
155a0 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
155b0 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ent SELECT state
155c0 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ment.      */.  
155d0 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
155e0 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20  K_EXCEPT ){.    
155f0 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63      op = SRT_Exc
15600 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ept;.      }else
15610 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
15620 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
15630 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20  N );.        op 
15640 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  = SRT_Union;.   
15650 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
15660 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
15670 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
15680 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
15690 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75  mit = 0;.      u
156a0 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d  niondest.eDest =
156b0 20 6f 70 3b 0a 20 20 20 20 20 20 65 78 70 6c 61   op;.      expla
156c0 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
156d0 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
156e0 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
156f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
15700 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
15710 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
15720 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
15730 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
15740 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61      /* Query fla
15750 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74  ttening in sqlit
15760 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74  e3Select() might
15770 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65   refill p->pOrde
15780 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65  rBy..      ** Be
15790 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20   sure to delete 
157a0 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65  p->pOrderBy, the
157b0 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64  refore, to avoid
157c0 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20   a memory leak. 
157d0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
157e0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
157f0 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
15800 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
15810 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
15820 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
15830 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
15840 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
15850 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
15860 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20  _UNION ){.      
15870 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
15880 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
15890 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  dd(p->nSelectRow
158a0 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  , pPrior->nSelec
158b0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tRow);.      }. 
158c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
158d0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
158e0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
158f0 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
15900 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  .      p->iLimit
15910 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
15920 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20  Offset = 0;..   
15930 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68     /* Convert th
15940 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65  e data in the te
15950 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e  mporary table in
15960 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d  to whatever form
15970 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20  .      ** it is 
15980 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c  that we currentl
15990 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  y need..      */
159a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75  .      assert( u
159b0 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53  nionTab==dest.iS
159c0 44 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44  DParm || dest.eD
159d0 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a  est!=priorOp );.
159e0 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
159f0 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b  Dest!=priorOp ){
15a00 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
15a10 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61  nt, iBreak, iSta
15a20 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
15a30 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
15a40 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20  .        iBreak 
15a50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
15a60 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
15a70 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
15a80 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
15a90 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70  v);.        comp
15aa0 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
15ab0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
15ac0 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
15ad0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15ae0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e  v, OP_Rewind, un
15af0 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b  ionTab, iBreak);
15b00 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
15b10 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
15b20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
15b30 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
15b40 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
15b50 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
15b60 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20   unionTab,.     
15b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b80 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20     0, 0, &dest, 
15b90 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
15ba0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15bb0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15bc0 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
15bd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15be0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
15bf0 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
15c00 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
15c10 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
15c20 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
15c30 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
15c40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15c50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15c60 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62  _Close, unionTab
15c70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
15c80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15c90 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73  .    default: as
15ca0 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
15cb0 49 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20  INTERSECT ); {. 
15cc0 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74       int tab1, t
15cd0 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab2;.      int i
15ce0 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
15cf0 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72  tart;.      Expr
15d00 20 2a 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20   *pLimit;.      
15d10 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
15d20 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72  SelectDest inter
15d30 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20  sectdest;.      
15d40 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f  int r1;..      /
15d50 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64  * INTERSECT is d
15d60 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
15d70 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69  e others since i
15d80 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  t requires.     
15d90 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72   ** two temporar
15da0 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65  y tables.  Hence
15db0 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20   it has its own 
15dc0 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20  case.  Begin.   
15dd0 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74     ** by allocat
15de0 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77  ing the tables w
15df0 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20  e will need..   
15e00 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31     */.      tab1
15e10 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
15e20 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20  +;.      tab2 = 
15e30 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
15e40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
15e50 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
15e60 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
15e70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15e80 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
15e90 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ral, tab1, 0);. 
15ea0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
15eb0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
15ec0 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
15ed0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
15ee0 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
15ef0 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
15f00 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
15f10 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
15f20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
15f30 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20  >pEList );..    
15f40 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
15f50 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66  LECTs to our lef
15f60 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  t into temporary
15f70 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20   table "tab1".. 
15f80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
15f90 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
15fa0 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64 65  nit(&intersectde
15fb0 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74  st, SRT_Union, t
15fc0 61 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  ab1);.      expl
15fd0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
15fe0 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
15ff0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
16000 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
16010 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
16020 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74  rior, &intersect
16030 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  dest);.      if(
16040 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
16050 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
16060 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
16070 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
16080 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
16090 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
160a0 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20  able "tab2".    
160b0 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20    */.      addr 
160c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
160d0 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
160e0 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30  hemeral, tab2, 0
160f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16100 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
16110 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [1] == -1 );.   
16120 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
16130 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[1] = addr;.  
16140 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
16150 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
16160 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
16170 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
16180 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65 63  ;.      intersec
16190 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20  tdest.iSDParm = 
161a0 74 61 62 32 3b 0a 20 20 20 20 20 20 65 78 70 6c  tab2;.      expl
161b0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
161c0 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
161d0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
161e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
161f0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
16200 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29   &intersectdest)
16210 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16220 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16230 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
16240 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
16250 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
16260 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66  pPrior;.      if
16270 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  ( p->nSelectRow>
16280 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
16290 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow ) p->nSelectR
162a0 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
162b0 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73  lectRow;.      s
162c0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
162d0 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
162e0 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
162f0 20 3d 20 70 4c 69 6d 69 74 3b 0a 0a 20 20 20 20   = pLimit;..    
16300 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
16310 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69  de to take the i
16320 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74  ntersection of t
16330 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  he two temporary
16340 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73  .      ** tables
16350 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
16360 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
16370 73 74 20 29 3b 0a 20 20 20 20 20 20 69 42 72 65  st );.      iBre
16380 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
16390 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
163a0 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
163b0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
163c0 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75  (v);.      compu
163d0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
163e0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
163f0 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
16400 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16410 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c  OP_Rewind, tab1,
16420 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
16430 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
16440 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
16450 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
16460 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20  .      iStart = 
16470 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16480 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
16490 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20   tab1, r1);.    
164a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
164b0 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74  Op4Int(v, OP_Not
164c0 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f  Found, tab2, iCo
164d0 6e 74 2c 20 72 31 2c 20 30 29 3b 20 56 64 62 65  nt, r1, 0); Vdbe
164e0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
164f0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
16500 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
16510 20 72 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65   r1);.      sele
16520 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
16530 73 65 2c 20 70 2c 20 74 61 62 31 2c 0a 20 20 20  se, p, tab1,.   
16540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16550 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20     0, 0, &dest, 
16560 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
16570 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16580 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
16590 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73   iCont);.      s
165a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
165b0 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62  (v, OP_Next, tab
165c0 31 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65  1, iStart); Vdbe
165d0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
165e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
165f0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
16600 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
16610 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16620 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
16630 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
16640 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16650 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
16660 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
16670 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65  ;.    }.  }..  e
16680 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
16690 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69  pParse, p->op, i
166a0 53 75 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e  Sub1, iSub2, p->
166b0 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20  op!=TK_ALL);..  
166c0 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
166d0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
166e0 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d  sed by .  ** tem
166f0 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
16700 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
16710 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
16720 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
16730 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
16740 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
16750 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
16760 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
16770 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20   section is run 
16780 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  by the right-mos
16790 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
167a0 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45  nt only..  ** SE
167b0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
167c0 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61  to the left alwa
167d0 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  ys skip this par
167e0 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  t.  The right-mo
167f0 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d  st.  ** SELECT m
16800 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74  ight also skip t
16810 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68  his part if it h
16820 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  as no ORDER BY c
16830 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e  lause and.  ** n
16840 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72  o temp tables ar
16850 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  e required..  */
16860 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
16870 67 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65  gs & SF_UsesEphe
16880 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  meral ){.    int
16890 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
168a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
168b0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
168c0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
168d0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
168e0 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
168f0 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65  uence for the re
16900 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20  sult set */.    
16910 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20  Select *pLoop;  
16920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16930 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
16940 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74  ough SELECT stat
16950 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f  ements */.    Co
16960 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
16970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
16980 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
16990 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
169a0 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ll[] */.    int 
169b0 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
169c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
169d0 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
169e0 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  n result set */.
169f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
16a00 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pNext==0 );.    
16a10 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
16a20 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65  ->nExpr;.    pKe
16a30 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
16a40 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
16a50 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66  nCol, 1);.    if
16a60 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  ( !pKeyInfo ){. 
16a70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
16a80 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
16a90 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
16aa0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
16ab0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43      for(i=0, apC
16ac0 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  oll=pKeyInfo->aC
16ad0 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  oll; i<nCol; i++
16ae0 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20  , apColl++){.   
16af0 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c     *apColl = mul
16b00 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
16b10 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
16b20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43       if( 0==*apC
16b30 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  oll ){.        *
16b40 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66  apColl = db->pDf
16b50 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
16b60 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
16b70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
16b80 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
16b90 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
16ba0 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
16bb0 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
16bc0 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
16bd0 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
16be0 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
16bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
16c00 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
16c10 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
16c20 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
16c30 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
16c40 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
16c50 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
16c60 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
16c70 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
16c80 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
16c90 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
16ca0 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
16cb0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16cc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16cd0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
16ce0 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
16cf0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
16d00 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
16d10 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
16d20 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
16d30 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20  ef(pKeyInfo),.  
16d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d50 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59            P4_KEY
16d60 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70  INFO);.        p
16d70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
16d80 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[i] = -1;.    
16d90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
16da0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
16db0 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d  f(pKeyInfo);.  }
16dc0 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  ..multi_select_e
16dd0 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64  nd:.  pDest->iSd
16de0 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b  st = dest.iSdst;
16df0 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
16e00 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20  = dest.nSdst;.  
16e10 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
16e20 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29  ete(db, pDelete)
16e30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16e40 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
16e50 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
16e60 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SELECT */../*.**
16e70 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   Error message f
16e80 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d  or when two or m
16e90 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 61 20 63  ore terms of a c
16ea0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 68  ompound select h
16eb0 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ave different.**
16ec0 20 73 69 7a 65 20 72 65 73 75 6c 74 20 73 65 74   size result set
16ed0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
16ee0 65 33 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d  e3SelectWrongNum
16ef0 54 65 72 6d 73 45 72 72 6f 72 28 50 61 72 73 65  TermsError(Parse
16f00 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
16f10 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73   *p){.  if( p->s
16f20 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c  elFlags & SF_Val
16f30 75 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ues ){.    sqlit
16f40 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
16f50 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d  e, "all VALUES m
16f60 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ust have the sam
16f70 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  e number of term
16f80 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s");.  }else{.  
16f90 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16fa0 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43  g(pParse, "SELEC
16fb0 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  Ts to the left a
16fc0 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a  nd right of %s".
16fd0 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68        " do not h
16fe0 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
16ff0 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
17000 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70  lumns", selectOp
17010 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
17020 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  }.}../*.** Code 
17030 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  an output subrou
17040 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75  tine for a corou
17050 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tine implementat
17060 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45  ion of a.** SELE
17070 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a  CT statment..**.
17080 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62  ** The data to b
17090 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74  e output is cont
170a0 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53  ained in pIn->iS
170b0 64 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a  dst.  There are.
170c0 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f  ** pIn->nSdst co
170d0 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70  lumns to be outp
170e0 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68  ut.  pDest is wh
170f0 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73  ere the output s
17100 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74  hould.** be sent
17110 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72  ..**.** regRetur
17120 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
17130 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  of the register 
17140 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72  holding the subr
17150 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
17160 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
17170 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
17180 6e 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73  n it is the firs
17190 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20  t register in a 
171a0 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72  vector that.** r
171b0 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69  ecords the previ
171c0 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d  ous output.  mem
171d0 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66  [regPrev] is a f
171e0 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73  lag that is fals
171f0 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61  e.** if there ha
17200 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f  s been no previo
17210 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72  us output.  If r
17220 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f  egPrev>0 then co
17230 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74  de is.** generat
17240 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64  ed to suppress d
17250 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79  uplicates.  pKey
17260 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72  Info is used for
17270 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65   comparing.** ke
17280 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ys..**.** If the
17290 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20   LIMIT found in 
172a0 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61  p->iLimit is rea
172b0 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  ched, jump immed
172c0 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72  iately to.** iBr
172d0 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eak..*/.static i
172e0 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75  nt generateOutpu
172f0 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50  tSubroutine(.  P
17300 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
17310 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
17320 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
17330 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
17340 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
17350 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
17360 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
17370 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  pIn,        /* C
17380 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69  oroutine supplyi
17390 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  ng data */.  Sel
173a0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
173b0 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
173c0 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a   send the data *
173d0 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72  /.  int regRetur
173e0 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n,          /* T
173f0 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  he return addres
17400 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
17410 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20  int regPrev,    
17420 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
17430 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73  ous result regis
17440 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e  ter.  No uniquen
17450 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65  ess if 0 */.  Ke
17460 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
17470 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d        /* For com
17480 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76  paring with prev
17490 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ious entry */.  
174a0 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
174b0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
174c0 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74  here if we hit t
174d0 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20  he LIMIT */.){. 
174e0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
174f0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
17500 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74  iContinue;.  int
17510 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d   addr;..  addr =
17520 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
17530 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43  entAddr(v);.  iC
17540 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
17550 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
17560 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  );..  /* Suppres
17570 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72  s duplicates for
17580 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
17590 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20  and INTERSECT . 
175a0 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65   */.  if( regPre
175b0 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  v ){.    int add
175c0 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61  r1, addr2;.    a
175d0 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
175e0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
175f0 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20  fNot, regPrev); 
17600 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
17610 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
17620 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
17630 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49  , OP_Compare, pI
17640 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65  n->iSdst, regPre
17650 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c  v+1, pIn->nSdst,
17660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
17680 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
17690 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
176a0 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
176b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
176c0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
176d0 2c 20 61 64 64 72 32 2b 32 2c 20 69 43 6f 6e 74  , addr2+2, iCont
176e0 69 6e 75 65 2c 20 61 64 64 72 32 2b 32 29 3b 20  inue, addr2+2); 
176f0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
17700 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
17710 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
17720 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
17730 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
17740 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74  Copy, pIn->iSdst
17750 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
17760 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20  ->nSdst-1);.    
17770 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17780 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
17790 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   1, regPrev);.  
177a0 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
177b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
177c0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
177d0 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20  /* Suppress the 
177e0 66 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74  first OFFSET ent
177f0 72 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73  ries if there is
17800 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73   an OFFSET claus
17810 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66  e.  */.  codeOff
17820 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
17830 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a  t, iContinue);..
17840 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
17850 3e 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73  >eDest!=SRT_Exis
17860 74 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ts );.  assert( 
17870 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
17880 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 73 77 69  T_Table );.  swi
17890 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73  tch( pDest->eDes
178a0 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72  t ){.    /* Stor
178b0 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
178c0 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
178d0 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
178e0 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
178f0 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69  emTab: {.      i
17900 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
17910 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
17920 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20  );.      int r2 
17930 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
17940 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
17950 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17960 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
17970 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73  ecord, pIn->iSds
17980 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72  t, pIn->nSdst, r
17990 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
179a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
179b0 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73  P_NewRowid, pDes
179c0 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b  t->iSDParm, r2);
179d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
179e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
179f0 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53  nsert, pDest->iS
17a00 44 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a  DParm, r1, r2);.
17a10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17a20 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
17a30 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
17a40 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
17a50 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
17a60 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
17a70 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
17a80 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
17a90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17aa0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
17ab0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
17ac0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
17ad0 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
17ae0 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
17af0 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 20  (SELECT ...)".. 
17b00 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
17b10 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
17b20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 74 65  int r1;.      te
17b30 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64  stcase( pIn->nSd
17b40 73 74 3e 31 20 29 3b 0a 20 20 20 20 20 20 72 31  st>1 );.      r1
17b50 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
17b60 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
17b70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17b80 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
17b90 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64  Record, pIn->iSd
17ba0 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20  st, pIn->nSdst, 
17bb0 0a 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 70  .          r1, p
17bc0 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20  Dest->zAffSdst, 
17bd0 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
17be0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
17bf0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
17c00 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
17c10 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
17c20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17c30 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
17c40 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
17c50 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
17c60 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
17c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
17c80 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
17c90 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
17ca0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
17cb0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
17cc0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17cd0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
17ce0 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
17cf0 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
17d00 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
17d10 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
17d20 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
17d30 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
17d40 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
17d50 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
17d60 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
17d70 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
17d80 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
17d90 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
17da0 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20  ( pIn->nSdst==1 
17db0 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
17dc0 30 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  0 );  testcase( 
17dd0 70 49 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b  pIn->nSdst!=1 );
17de0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
17df0 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
17e00 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  e, pIn->iSdst, p
17e10 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31  Dest->iSDParm, 1
17e20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
17e30 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
17e40 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
17e50 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
17e60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17e70 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    }.#endif /* #i
17e80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17e90 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
17ea0 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
17eb0 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
17ec0 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
17ed0 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73  gisters.    ** s
17ee0 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73 74  tarting at pDest
17ef0 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74  ->iSdst.  Then t
17f00 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69  he co-routine yi
17f10 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elds..    */.   
17f20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
17f30 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ine: {.      if(
17f40 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30   pDest->iSdst==0
17f50 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73   ){.        pDes
17f60 74 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74  t->iSdst = sqlit
17f70 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
17f80 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73  Parse, pIn->nSds
17f90 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73  t);.        pDes
17fa0 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e  t->nSdst = pIn->
17fb0 6e 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  nSdst;.      }. 
17fc0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17fd0 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
17fe0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65   pIn->iSdst, pDe
17ff0 73 74 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  st->iSdst, pIn->
18000 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
18010 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
18020 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
18030 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
18040 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18050 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65  ..    /* If none
18060 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74   of the above, t
18070 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64  hen the result d
18080 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20  estination must 
18090 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75  be.    ** SRT_Ou
180a0 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74  tput.  This rout
180b0 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
180c0 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68  led with any oth
180d0 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e  er.    ** destin
180e0 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ation other than
180f0 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65   the ones handle
18100 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f  d above or SRT_O
18110 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  utput..    **.  
18120 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74    ** For SRT_Out
18130 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65  put, results are
18140 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
18150 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
18160 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65  rs.  .    ** The
18170 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52  n the OP_ResultR
18180 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65  ow opcode is use
18190 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74  d to cause sqlit
181a0 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20  e3_step() to.   
181b0 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e   ** return the n
181c0 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  ext row of resul
181d0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  t..    */.    de
181e0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
181f0 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
18200 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
18210 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18220 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18230 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d  _ResultRow, pIn-
18240 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
18250 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
18260 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
18270 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
18280 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
18290 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
182a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
182b0 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
182c0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
182d0 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
182e0 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a   is reached..  *
182f0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  /.  if( p->iLimi
18300 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
18310 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18320 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70  _DecrJumpZero, p
18330 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
18340 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
18350 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  v);.  }..  /* Ge
18360 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f  nerate the subro
18370 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a  utine return.  *
18380 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
18390 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
183a0 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c  Continue);.  sql
183b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
183c0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
183d0 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75  Return);..  retu
183e0 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
183f0 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  * Alternative co
18400 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f  mpound select co
18410 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72  de generator for
18420 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72   cases when ther
18430 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52  e.** is an ORDER
18440 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a   BY clause..**.*
18450 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75  * We assume a qu
18460 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ery of the follo
18470 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  wing form:.**.**
18480 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20        <selectA> 
18490 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65   <operator>  <se
184a0 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59  lectB>  ORDER BY
184b0 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a   <orderbylist>.*
184c0 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20  *.** <operator> 
184d0 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20  is one of UNION 
184e0 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45  ALL, UNION, EXCE
184f0 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
18500 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69  .  The idea.** i
18510 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c  s to code both <
18520 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65  selectA> and <se
18530 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20  lectB> with the 
18540 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
18550 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65  as.** co-routine
18560 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65  s.  Then run the
18570 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20   co-routines in 
18580 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72  parallel and mer
18590 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  ge the results.*
185a0 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  * into the outpu
185b0 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  t.  In addition 
185c0 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  to the two corou
185d0 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65  tines (called se
185e0 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c  lectA and.** sel
185f0 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20  ectB) there are 
18600 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a  7 subroutines:.*
18610 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20  *.**    outA:   
18620 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
18630 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20   of the selectA 
18640 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
18650 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
18660 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
18670 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a  compound query..
18680 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20  **.**    outB:  
18690 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
186a0 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42  t of the selectB
186b0 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
186c0 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
186d0 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
186e0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
186f0 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65    (Only generate
18700 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a  d for UNION and.
18710 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
18720 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50  NION ALL.  EXCEP
18730 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54  T and INSERTSECT
18740 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20   never output a 
18750 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  row that.**     
18760 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20          appears 
18770 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a  only in B.).**.*
18780 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61  *    AltB:    Ca
18790 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
187a0 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
187b0 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
187c0 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41   A<B..**.**    A
187d0 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  eqB:    Called w
187e0 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
187f0 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
18800 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e  utines and A==B.
18810 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  .**.**    AgtB: 
18820 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
18830 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
18840 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
18850 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a  s and A>B..**.**
18860 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c      EofA:    Cal
18870 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
18880 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
18890 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20  selectA..**.**  
188a0 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65    EofB:    Calle
188b0 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
188c0 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
188d0 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lectB..**.** The
188e0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
188f0 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69  of the latter fi
18900 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64  ve subroutines d
18910 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a  epend on which .
18920 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
18930 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20   used:.**.**.** 
18940 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
18950 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e  N ALL         UN
18960 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45  ION            E
18970 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49  XCEPT          I
18980 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20  NTERSECT.**     
18990 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
189a0 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
189b0 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
189c0 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
189d0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c  --------.**   Al
189e0 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  tB:   outA, next
189f0 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
18a00 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
18a10 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
18a20 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a  tA.**.**   AeqB:
18a30 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
18a40 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
18a50 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
18a60 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
18a70 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a  tA.**.**   AgtB:
18a80 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
18a90 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
18aa0 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20           nextB  
18ab0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a            nextB.
18ac0 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20  **.**   EofA:   
18ad0 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
18ae0 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
18af0 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20        halt      
18b00 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
18b10 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41  *   EofB:   outA
18b20 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
18b30 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
18b40 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
18b50 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e     halt.**.** In
18b60 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c   the AltB, AeqB,
18b70 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75   and AgtB subrou
18b80 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e  tines, an EOF on
18b90 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   A following nex
18ba0 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20  tA.** causes an 
18bb0 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
18bc0 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f  o EofA and an EO
18bd0 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67  F on B following
18be0 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a   nextB causes.**
18bf0 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
18c00 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74  mp to EofB.  Wit
18c10 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  hin EofA and Eof
18c20 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e  B, and EOF on en
18c30 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  try or.** follow
18c40 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73  ing nextX causes
18c50 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65   a jump to the e
18c60 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  nd of the select
18c70 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
18c80 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d  ** Duplicate rem
18c90 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f  oval in the UNIO
18ca0 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
18cb0 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69  NTERSECT cases i
18cc0 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74  s handled.** wit
18cd0 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73  hin the output s
18ce0 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
18cf0 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72  regPrev register
18d00 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70   set holds the p
18d10 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74  reviously.** out
18d20 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f  put value.  A co
18d30 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65  mparison is made
18d40 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61   against this va
18d50 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70  lue and the outp
18d60 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64  ut.** is skipped
18d70 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73   if the next res
18d80 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68  ults would be th
18d90 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72  e same as the pr
18da0 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  evious..**.** Th
18db0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
18dc0 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c   plan is to impl
18dd0 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f  ement the two co
18de0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76  routines and sev
18df0 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  en.** subroutine
18e00 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75  s first, then pu
18e10 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f  t the control lo
18e20 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f  gic at the botto
18e30 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  m.  Like this:.*
18e40 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f  *.**          go
18e50 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63  to Init.**     c
18e60 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oA: coroutine fo
18e70 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29  r left query (A)
18e80 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72  .**     coB: cor
18e90 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
18ea0 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20   query (B).**   
18eb0 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e   outA: output on
18ec0 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20  e row of A.**   
18ed0 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e   outB: output on
18ee0 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f  e row of B (UNIO
18ef0 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20  N and UNION ALL 
18f00 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41  only).**    EofA
18f10 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42  : ....**    EofB
18f20 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42  : ....**    AltB
18f30 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42  : ....**    AeqB
18f40 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42  : ....**    AgtB
18f50 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74  : ....**    Init
18f60 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72  : initialize cor
18f70 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
18f80 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
18f90 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20  ld coA.**       
18fa0 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74     if eof(A) got
18fb0 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20  o EofA.**       
18fc0 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20     yield coB.** 
18fd0 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
18fe0 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20  B) goto EofB.** 
18ff0 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65     Cmpr: Compare
19000 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20   A, B.**        
19010 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71    Jump AltB, Aeq
19020 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45  B, AgtB.**     E
19030 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65  nd: ....**.** We
19040 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42   call AltB, AeqB
19050 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e  , AgtB, EofA, an
19060 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69  d EofB "subrouti
19070 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72  nes" but they ar
19080 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c  e not.** actuall
19090 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47  y called using G
190a0 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f  osub and they do
190b0 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f   not Return.  Eo
190c0 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70  fA and EofB loop
190d0 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61  .** until all da
190e0 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
190f0 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65  then jump to the
19100 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c   "end" labe.  Al
19110 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64  tB, AeqB,.** and
19120 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69   AgtB jump to ei
19130 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e  ther L2 or to on
19140 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66  e of EofA or Eof
19150 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  B..*/.#ifndef SQ
19160 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
19170 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63  ND_SELECT.static
19180 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
19190 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
191a0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
191b0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
191c0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
191d0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
191e0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
191f0 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
19200 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
19210 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
19220 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
19230 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
19240 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
19250 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
19260 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
19270 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  rs */.  Select *
19280 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
19290 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
192a0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
192b0 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
192c0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
192d0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
192e0 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
192f0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
19300 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44   destA;     /* D
19310 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
19320 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20  oroutine A */.  
19330 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42  SelectDest destB
19340 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
19350 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
19360 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ne B */.  int re
19370 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20  gAddrA;         
19380 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
19390 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
193a0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
193b0 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20  int regAddrB;   
193c0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
193d0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
193e0 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
193f0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
19400 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41  lectA;      /* A
19410 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
19420 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65  lect-A coroutine
19430 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
19440 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41  lectB;      /* A
19450 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
19460 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
19470 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
19480 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  A;          /* A
19490 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
194a0 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41  for the output-A
194b0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
194c0 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20   int regOutB;   
194d0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
194e0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
194f0 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
19500 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
19510 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20  addrOutA;       
19520 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
19530 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
19540 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
19550 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20   addrOutB = 0;  
19560 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
19570 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75   the output-B su
19580 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
19590 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20  t addrEofA;     
195a0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
195b0 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65  f the select-A-e
195c0 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
195d0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
195e0 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f  rEofA_noB;     /
195f0 2a 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72  * Alternate addr
19600 45 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e 69  EofA if B is uni
19610 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
19620 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20  int addrEofB;   
19630 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
19640 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
19650 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
19660 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
19670 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20  ddrAltB;        
19680 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
19690 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e  he A<B subroutin
196a0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
196b0 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eqB;         /* 
196c0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
196d0 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ==B subroutine *
196e0 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42  /.  int addrAgtB
196f0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
19700 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20  ress of the A>B 
19710 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
19720 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20  int regLimitA;  
19730 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
19740 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
19750 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
19760 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20  gLimitB;        
19770 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
19780 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
19790 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b  /.  int regPrev;
197a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72            /* A r
197b0 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
197c0 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f  s to hold previo
197d0 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  us output */.  i
197e0 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20  nt savedLimit;  
197f0 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
19800 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74  lue of p->iLimit
19810 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f   */.  int savedO
19820 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  ffset;      /* S
19830 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
19840 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e  >iOffset */.  in
19850 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20  t labelCmpr;    
19860 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
19870 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
19880 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  e merge algorith
19890 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  m */.  int label
198a0 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  End;         /* 
198b0 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e  Label for the en
198c0 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c  d of the overall
198d0 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a   SELECT stmt */.
198e0 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
198f0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
19900 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61  instructions tha
19910 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65  t get retargette
19920 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  d */.  int op;  
19930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19940 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54  One of TK_ALL, T
19950 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
19960 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  PT, TK_INTERSECT
19970 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
19980 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43  KeyDup = 0; /* C
19990 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
199a0 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
199b0 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20  ate removal */. 
199c0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65   KeyInfo *pKeyMe
199d0 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72  rge;   /* Compar
199e0 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
199f0 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77   for merging row
19a00 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
19a10 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
19a20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
19a30 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ion */.  ExprLis
19a40 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f  t *pOrderBy;   /
19a50 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
19a60 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
19a70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
19a80 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
19a90 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
19aa0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
19ab0 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20  int *aPermute;  
19ac0 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67        /* Mapping
19ad0 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74   from ORDER BY t
19ae0 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73  erms to result s
19af0 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69  et columns */.#i
19b00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19b10 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
19b20 69 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20  iSub1;          
19b30 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
19b40 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
19b50 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20  /.  int iSub2;  
19b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
19b70 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
19b80 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
19b90 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  f..  assert( p->
19ba0 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20  pOrderBy!=0 );. 
19bb0 20 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70   assert( pKeyDup
19bc0 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67  ==0 ); /* "Manag
19bd0 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74  ed" code needs t
19be0 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33  his.  Ticket #33
19bf0 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  82. */.  db = pP
19c00 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20  arse->db;.  v = 
19c10 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
19c20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
19c30 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64         /* Alread
19c40 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72  y thrown the err
19c50 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63  or if VDBE alloc
19c60 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62   failed */.  lab
19c70 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  elEnd = sqlite3V
19c80 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
19c90 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73  .  labelCmpr = s
19ca0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
19cb0 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50  bel(v);...  /* P
19cc0 61 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45  atch up the ORDE
19cd0 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f  R BY clause.  */
19ce0 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20  .  op = p->op;  
19cf0 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
19d00 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
19d10 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
19d20 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72  y==0 );.  pOrder
19d30 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
19d40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ;.  assert( pOrd
19d50 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72  erBy );.  nOrder
19d60 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
19d70 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  Expr;..  /* For 
19d80 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20  operators other 
19d90 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77  than UNION ALL w
19da0 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73  e have to make s
19db0 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ure that.  ** th
19dc0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
19dd0 65 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74  e covers every t
19de0 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c  erm of the resul
19df0 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a  t set.  Add.  **
19e00 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52   terms to the OR
19e10 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
19e20 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
19e30 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c  .  if( op!=TK_AL
19e40 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  L ){.    for(i=1
19e50 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ; db->mallocFail
19e60 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70  ed==0 && i<=p->p
19e70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
19e80 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
19e90 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
19ea0 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72  pItem;.      for
19eb0 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (j=0, pItem=pOrd
19ec0 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65  erBy->a; j<nOrde
19ed0 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; j++, pItem+
19ee0 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
19ef0 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
19f00 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
19f10 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
19f20 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
19f30 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20  ol==i ) break;. 
19f40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19f50 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a   j==nOrderBy ){.
19f60 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
19f70 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
19f80 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  (db, TK_INTEGER,
19f90 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
19fa0 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
19fb0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
19fc0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  KPT;.        pNe
19fd0 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  w->flags |= EP_I
19fe0 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  ntValue;.       
19ff0 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20   pNew->u.iValue 
1a000 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = i;.        p->
1a010 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
1a020 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
1a030 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
1a040 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e  se, pOrderBy, pN
1a050 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
1a060 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64   pOrderBy ) pOrd
1a070 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79  erBy->a[nOrderBy
1a080 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  ++].u.x.iOrderBy
1a090 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  Col = (u16)i;.  
1a0a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1a0b0 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
1a0c0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72  e comparison per
1a0d0 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79  mutation and key
1a0e0 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65  info that is use
1a0f0 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
1a100 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64  permutation used
1a110 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
1a120 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72   the next.  ** r
1a130 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f  ow of results co
1a140 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  mes from selectA
1a150 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c   or selectB.  Al
1a160 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a  so add explicit.
1a170 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20    ** collations 
1a180 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
1a190 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20  clause terms so 
1a1a0 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75  that when the su
1a1b0 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f  bqueries.  ** to
1a1c0 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74   the right and t
1a1d0 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c  he left are eval
1a1e0 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20  uated, they use 
1a1f0 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a  the correct.  **
1a200 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f   collation..  */
1a210 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71  .  aPermute = sq
1a220 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1a230 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e  NN(db, sizeof(in
1a240 74 29 2a 28 6e 4f 72 64 65 72 42 79 20 2b 20 31  t)*(nOrderBy + 1
1a250 29 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75  ));.  if( aPermu
1a260 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  te ){.    struct
1a270 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1a280 70 49 74 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d  pItem;.    aPerm
1a290 75 74 65 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42  ute[0] = nOrderB
1a2a0 79 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20  y;.    for(i=1, 
1a2b0 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
1a2c0 61 3b 20 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20  a; i<=nOrderBy; 
1a2d0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
1a2e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
1a2f0 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
1a300 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  Col>0 );.      a
1a310 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
1a320 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70  x.iOrderByCol<=p
1a330 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
1a340 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74  );.      aPermut
1a350 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e  e[i] = pItem->u.
1a360 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20  x.iOrderByCol - 
1a370 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  1;.    }.    pKe
1a380 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65  yMerge = multiSe
1a390 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
1a3a0 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
1a3b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1a3c0 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20  KeyMerge = 0;.  
1a3d0 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68  }..  /* Reattach
1a3e0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1a3f0 61 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72  ause to the quer
1a400 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  y..  */.  p->pOr
1a410 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1a420 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  ;.  pPrior->pOrd
1a430 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
1a440 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  prListDup(pParse
1a450 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20  ->db, pOrderBy, 
1a460 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  0);..  /* Alloca
1a470 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65  te a range of te
1a480 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
1a490 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66  s and the KeyInf
1a4a0 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f  o needed.  ** fo
1a4b0 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  r the logic that
1a4c0 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61   removes duplica
1a4d0 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77  te result rows w
1a4e0 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  hen the.  ** ope
1a4f0 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20  rator is UNION, 
1a500 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
1a510 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e  SECT (but not UN
1a520 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20  ION ALL)..  */. 
1a530 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1a540 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  ){.    regPrev =
1a550 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1a560 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e   int nExpr = p->
1a570 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
1a580 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65     assert( nOrde
1a590 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62  rBy>=nExpr || db
1a5a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1a5b0 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  ;.    regPrev = 
1a5c0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
1a5d0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
1a5e0 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20   += nExpr+1;.   
1a5f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a600 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1a610 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 0, regPrev);. 
1a620 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c     pKeyDup = sql
1a630 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
1a640 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a  (db, nExpr, 1);.
1a650 20 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20      if( pKeyDup 
1a660 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1a670 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
1a680 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44  sWriteable(pKeyD
1a690 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  up) );.      for
1a6a0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
1a6b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  ++){.        pKe
1a6c0 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  yDup->aColl[i] =
1a6d0 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
1a6e0 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
1a6f0 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  );.        pKeyD
1a700 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  up->aSortOrder[i
1a710 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
1a720 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20     }.  }. .  /* 
1a730 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66  Separate the lef
1a740 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20  t and the right 
1a750 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61  query from one a
1a760 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d  nother.  */.  p-
1a770 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
1a780 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30  Prior->pNext = 0
1a790 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
1a7a0 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
1a7b0 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
1a7c0 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b  derBy, "ORDER");
1a7d0 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
1a7e0 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
1a7f0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
1a800 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
1a810 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f  e, pPrior, pPrio
1a820 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  r->pOrderBy, "OR
1a830 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  DER");.  }..  /*
1a840 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d   Compute the lim
1a850 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  it registers */.
1a860 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
1a870 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
1a880 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
1a890 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26  if( p->iLimit &&
1a8a0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
1a8b0 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b     regLimitA = +
1a8c0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1a8d0 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b     regLimitB = +
1a8e0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1a8f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a900 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
1a910 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d   p->iOffset ? p-
1a920 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e  >iOffset+1 : p->
1a930 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  iLimit,.        
1a940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a950 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d            regLim
1a960 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  itA);.    sqlite
1a970 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a980 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74  P_Copy, regLimit
1a990 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20  A, regLimitB);. 
1a9a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c   }else{.    regL
1a9b0 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74  imitA = regLimit
1a9c0 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  B = 0;.  }.  sql
1a9d0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1a9e0 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
1a9f0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
1aa00 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b  .  regAddrA = ++
1aa10 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1aa20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61  regAddrB = ++pPa
1aa30 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
1aa40 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  OutA = ++pParse-
1aa50 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42  >nMem;.  regOutB
1aa60 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1aa70 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  m;.  sqlite3Sele
1aa80 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
1aa90 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  A, SRT_Coroutine
1aaa0 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73  , regAddrA);.  s
1aab0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
1aac0 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54  Init(&destB, SRT
1aad0 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
1aae0 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  ddrB);..  /* Gen
1aaf0 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
1ab00 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
1ab10 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1ab20 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c  nt to the.  ** l
1ab30 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  eft of the compo
1ab40 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74  und operator - t
1ab50 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20  he "A" select.. 
1ab60 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
1ab70 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  A = sqlite3VdbeC
1ab80 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
1ab90 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  1;.  addr1 = sql
1aba0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1abb0 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
1abc0 6e 65 2c 20 72 65 67 41 64 64 72 41 2c 20 30 2c  ne, regAddrA, 0,
1abd0 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20   addrSelectA);. 
1abe0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1abf0 20 22 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29   "left SELECT"))
1ac00 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  ;.  pPrior->iLim
1ac10 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a  it = regLimitA;.
1ac20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
1ac30 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
1ac40 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
1ac50 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
1ac60 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
1ac70 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71  r, &destA);.  sq
1ac80 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f  lite3VdbeEndCoro
1ac90 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72  utine(v, regAddr
1aca0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
1acb0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
1acc0 72 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  r1);..  /* Gener
1acd0 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
1ace0 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
1acf0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1ad00 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69   on .  ** the ri
1ad10 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65  ght - the "B" se
1ad20 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72  lect.  */.  addr
1ad30 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65  SelectB = sqlite
1ad40 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1ad50 28 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31  (v) + 1;.  addr1
1ad60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1ad70 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
1ad80 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
1ad90 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63  rB, 0, addrSelec
1ada0 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  tB);.  VdbeComme
1adb0 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20 53 45  nt((v, "right SE
1adc0 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64  LECT"));.  saved
1add0 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
1ade0 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74  t;.  savedOffset
1adf0 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
1ae00 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67   p->iLimit = reg
1ae10 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66  LimitB;.  p->iOf
1ae20 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 65 78  fset = 0;  .  ex
1ae30 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
1ae40 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
1ae50 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
1ae60 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
1ae70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42  Parse, p, &destB
1ae80 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  );.  p->iLimit =
1ae90 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70   savedLimit;.  p
1aea0 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65  ->iOffset = save
1aeb0 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74  dOffset;.  sqlit
1aec0 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69  e3VdbeEndCorouti
1aed0 6e 65 28 76 2c 20 72 65 67 41 64 64 72 42 29 3b  ne(v, regAddrB);
1aee0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1aef0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
1af00 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
1af10 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
1af20 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   A.  ** select a
1af30 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
1af40 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
1af50 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
1af60 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
1af70 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74  ment((v, "Output
1af80 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29   routine for A")
1af90 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20  );.  addrOutA = 
1afa0 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
1afb0 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c  broutine(pParse,
1afc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1afd0 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65    p, &destA, pDe
1afe0 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20  st, regOutA,.   
1aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1b000 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20  gPrev, pKeyDup, 
1b010 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20  labelEnd);.  .  
1b020 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
1b030 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
1b040 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e  tputs the curren
1b050 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20  t row of the B. 
1b060 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68   ** select as th
1b070 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f  e next output ro
1b080 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  w of the compoun
1b090 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  d select..  */. 
1b0a0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1b0b0 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  || op==TK_UNION 
1b0c0 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  ){.    VdbeNoopC
1b0d0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
1b0e0 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42  ut routine for B
1b0f0 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74  "));.    addrOut
1b100 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70  B = generateOutp
1b110 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61  utSubroutine(pPa
1b120 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
1b130 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c        p, &destB,
1b140 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c   pDest, regOutB,
1b150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b160 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44    regPrev, pKeyD
1b170 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  up, labelEnd);. 
1b180 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49   }.  sqlite3KeyI
1b190 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70  nfoUnref(pKeyDup
1b1a0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1b1b0 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
1b1c0 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
1b1d0 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
1b1e0 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct A.  ** are ex
1b1f0 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
1b200 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
1b210 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  B remains..  */.
1b220 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43    if( op==TK_EXC
1b230 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e  EPT || op==TK_IN
1b240 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
1b250 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64  ddrEofA_noB = ad
1b260 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e  drEofA = labelEn
1b270 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20  d;.  }else{  .  
1b280 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1b290 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62  t((v, "eof-A sub
1b2a0 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
1b2b0 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74  addrEofA = sqlit
1b2c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b2d0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
1b2e0 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
1b2f0 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d    addrEofA_noB =
1b300 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b310 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1b320 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45  regAddrB, labelE
1b330 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nd);.           
1b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b350 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
1b360 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
1b370 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1b380 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20  , addrEofA);.   
1b390 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
1b3a0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
1b3b0 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c  d(p->nSelectRow,
1b3c0 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
1b3d0 52 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Row);.  }..  /* 
1b3e0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1b3f0 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
1b400 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
1b410 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a  om select B.  **
1b420 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
1b430 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
1b440 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73  select A remains
1b450 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
1b460 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
1b470 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20  .    addrEofB = 
1b480 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66  addrEofA;.    if
1b490 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ( p->nSelectRow 
1b4a0 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  > pPrior->nSelec
1b4b0 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63  tRow ) p->nSelec
1b4c0 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e  tRow = pPrior->n
1b4d0 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c  SelectRow;.  }el
1b4e0 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f  se{  .    VdbeNo
1b4f0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  opComment((v, "e
1b500 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  of-B subroutine"
1b510 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42  ));.    addrEofB
1b520 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1b530 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1b540 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
1b550 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  utA);.    sqlite
1b560 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b570 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1b580 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64  A, labelEnd); Vd
1b590 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1b5a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
1b5b0 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 42 29 3b  to(v, addrEofB);
1b5c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
1b5d0 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
1b5e0 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
1b5f0 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  <B.  */.  VdbeNo
1b600 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
1b610 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -lt-B subroutine
1b620 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20  "));.  addrAltB 
1b630 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1b640 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1b650 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75   regOutA, addrOu
1b660 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tA);.  sqlite3Vd
1b670 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1b680 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1b690 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43  addrEofA); VdbeC
1b6a0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
1b6b0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1b6c0 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20   labelCmpr);..  
1b6d0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1b6e0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
1b6f0 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f  ase of A==B.  */
1b700 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
1b710 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  L ){.    addrAeq
1b720 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
1b730 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
1b740 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
1b750 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64    addrAeqB = add
1b760 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41  rAltB;.    addrA
1b770 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ltB++;.  }else{.
1b780 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
1b790 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20  ent((v, "A-eq-B 
1b7a0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1b7b0 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20     addrAeqB =.  
1b7c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b7d0 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1b7e0 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45   regAddrA, addrE
1b7f0 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofA); VdbeCovera
1b800 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
1b810 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61  e3VdbeGoto(v, la
1b820 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20  belCmpr);.  }.. 
1b830 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1b840 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
1b850 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f  case of A>B.  */
1b860 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
1b870 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73  nt((v, "A-gt-B s
1b880 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1b890 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74  addrAgtB = sqlit
1b8a0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1b8b0 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  r(v);.  if( op==
1b8c0 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b  TK_ALL || op==TK
1b8d0 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71  _UNION ){.    sq
1b8e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b8f0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
1b900 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b  OutB, addrOutB);
1b910 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
1b920 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1b930 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20  ield, regAddrB, 
1b940 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43  addrEofB); VdbeC
1b950 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
1b960 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1b970 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20   labelCmpr);..  
1b980 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e  /* This code run
1b990 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61  s once to initia
1b9a0 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e  lize everything.
1b9b0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
1b9c0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
1b9d0 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddr1);.  sqlite3
1b9e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b9f0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1ba00 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b  , addrEofA_noB);
1ba10 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1ba20 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1ba30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1ba40 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64  d, regAddrB, add
1ba50 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65  rEofB); VdbeCove
1ba60 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49  rage(v);..  /* I
1ba70 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69  mplement the mai
1ba80 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a  n merge loop.  *
1ba90 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
1baa0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
1bab0 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c  abelCmpr);.  sql
1bac0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1bad0 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e  , OP_Permutation
1bae0 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  , 0, 0, 0, (char
1baf0 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49  *)aPermute, P4_I
1bb00 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69  NTARRAY);.  sqli
1bb10 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1bb20 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73   OP_Compare, des
1bb30 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e  tA.iSdst, destB.
1bb40 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c  iSdst, nOrderBy,
1bb50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bb60 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
1bb70 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b  )pKeyMerge, P4_K
1bb80 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74  EYINFO);.  sqlit
1bb90 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1bba0 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45  , OPFLAG_PERMUTE
1bbb0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1bbc0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
1bbd0 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64  p, addrAltB, add
1bbe0 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29  rAeqB, addrAgtB)
1bbf0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1bc00 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  );..  /* Jump to
1bc10 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20   the this point 
1bc20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d  in order to term
1bc30 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e  inate the query.
1bc40 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
1bc50 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1bc60 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20  v, labelEnd);.. 
1bc70 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74   /* Reassembly t
1bc80 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
1bc90 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  y so that it wil
1bca0 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72 72 65  l be freed corre
1bcb0 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65  ctly.  ** by the
1bcc0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
1bcd0 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50  n */.  if( p->pP
1bce0 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rior ){.    sqli
1bcf0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
1bd00 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a  db, p->pPrior);.
1bd10 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20    }.  p->pPrior 
1bd20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69  = pPrior;.  pPri
1bd30 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a  or->pNext = p;..
1bd40 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73    /*** TBD:  Ins
1bd50 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63  ert subroutine c
1bd60 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75  alls to close cu
1bd70 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c  rsors on incompl
1bd80 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75  ete.  **** subqu
1bd90 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78  eries ****/.  ex
1bda0 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70  plainComposite(p
1bdb0 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53  Parse, p->op, iS
1bdc0 75 62 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a  ub1, iSub2, 0);.
1bdd0 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
1bde0 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64  >nErr!=0;.}.#end
1bdf0 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
1be00 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1be10 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1be20 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1be30 49 45 57 29 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74  IEW)../* An inst
1be40 61 6e 63 65 20 6f 66 20 74 68 65 20 53 75 62 73  ance of the Subs
1be50 74 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20  tContext object 
1be60 64 65 73 63 72 69 62 65 73 20 61 6e 20 73 75 62  describes an sub
1be70 73 74 69 74 75 74 69 6f 6e 20 65 64 69 74 0a 2a  stitution edit.*
1be80 2a 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65  * to be performe
1be90 64 20 6f 6e 20 61 20 70 61 72 73 65 20 74 72 65  d on a parse tre
1bea0 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66  e..**.** All ref
1beb0 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
1bec0 6e 73 20 69 6e 20 74 61 62 6c 65 20 69 54 61 62  ns in table iTab
1bed0 6c 65 20 61 72 65 20 74 6f 20 62 65 20 72 65 70  le are to be rep
1bee0 6c 61 63 65 64 20 62 79 20 63 6f 72 72 65 73 70  laced by corresp
1bef0 6f 6e 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73  onding.** expres
1bf00 73 69 6f 6e 73 20 69 6e 20 70 45 4c 69 73 74 2e  sions in pEList.
1bf10 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1bf20 63 74 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20  ct SubstContext 
1bf30 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
1bf40 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1bf50 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
1bf60 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54  text */.  int iT
1bf70 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
1bf80 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 72      /* Replace r
1bf90 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69  eferences to thi
1bfa0 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  s table */.  int
1bfb0 20 69 4e 65 77 54 61 62 6c 65 3b 20 20 20 20 20   iNewTable;     
1bfc0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 61         /* New ta
1bfd0 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
1bfe0 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 20  int isLeftJoin; 
1bff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1c000 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20   TK_IF_NULL_ROW 
1c010 6f 70 63 6f 64 65 73 20 6f 6e 20 65 61 63 68 20  opcodes on each 
1c020 72 65 70 6c 61 63 65 6d 65 6e 74 20 2a 2f 0a 20  replacement */. 
1c030 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1c040 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  t;         /* Re
1c050 70 6c 61 63 65 6d 65 6e 74 20 65 78 70 72 65 73  placement expres
1c060 73 69 6f 6e 73 20 2a 2f 0a 7d 20 53 75 62 73 74  sions */.} Subst
1c070 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72  Context;../* For
1c080 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e  ward Declaration
1c090 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s */.static void
1c0a0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 53   substExprList(S
1c0b0 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 45 78  ubstContext*, Ex
1c0c0 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63  prList*);.static
1c0d0 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
1c0e0 74 28 53 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c  t(SubstContext*,
1c0f0 20 53 65 6c 65 63 74 2a 2c 20 69 6e 74 29 3b 0a   Select*, int);.
1c100 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f  ./*.** Scan thro
1c110 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69  ugh the expressi
1c120 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61  on pExpr.  Repla
1c130 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  ce every referen
1c140 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d  ce to.** a colum
1c150 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65  n in table numbe
1c160 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20  r iTable with a 
1c170 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c  copy of the iCol
1c180 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20  umn-th.** entry 
1c190 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74  in pEList.  (But
1c1a0 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65   leave reference
1c1b0 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63  s to the ROWID c
1c1c0 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  olumn .** unchan
1c1d0 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ged.).**.** This
1c1e0 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74   routine is part
1c1f0 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69   of the flatteni
1c200 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41  ng procedure.  A
1c210 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f   subquery.** who
1c220 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  se result set is
1c230 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69   defined by pELi
1c240 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e  st appears as en
1c250 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52  try in the.** FR
1c260 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
1c270 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20  ELECT such that 
1c280 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  the VDBE cursor 
1c290 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74  assigned to that
1c2a0 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20  .** FORM clause 
1c2b0 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e  entry is iTable.
1c2c0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
1c2d0 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
1c2e0 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ry .** changes t
1c2f0 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20  o pExpr so that 
1c300 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74  it refers direct
1c310 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65  ly to the source
1c320 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65   table.** of the
1c330 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72   subquery rather
1c340 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
1c350 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
1c360 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
1c370 2a 73 75 62 73 74 45 78 70 72 28 0a 20 20 53 75  *substExpr(.  Su
1c380 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62  bstContext *pSub
1c390 73 74 2c 20 20 2f 2a 20 44 65 73 63 72 69 70 74  st,  /* Descript
1c3a0 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74  ion of the subst
1c3b0 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  itution */.  Exp
1c3c0 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
1c3d0 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77      /* Expr in w
1c3e0 68 69 63 68 20 73 75 62 73 74 69 74 75 74 69 6f  hich substitutio
1c3f0 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20  n occurs */.){. 
1c400 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
1c410 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1c420 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1c430 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
1c440 69 6e 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d  in).   && pExpr-
1c450 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
1c460 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65  ==pSubst->iTable
1c470 0a 20 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d  .  ){.    pExpr-
1c480 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
1c490 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54   = pSubst->iNewT
1c4a0 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
1c4b0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
1c4c0 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
1c4d0 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69  Table==pSubst->i
1c4e0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28  Table ){.    if(
1c4f0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
1c500 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
1c510 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
1c520 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c530 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20   Expr *pNew;.   
1c540 20 20 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d     Expr *pCopy =
1c550 20 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d   pSubst->pEList-
1c560 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  >a[pExpr->iColum
1c570 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  n].pExpr;.      
1c580 45 78 70 72 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a  Expr ifNullRow;.
1c590 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
1c5a0 75 62 73 74 2d 3e 70 45 4c 69 73 74 21 3d 30 20  ubst->pEList!=0 
1c5b0 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
1c5c0 6e 3c 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74  n<pSubst->pEList
1c5d0 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
1c5e0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1c5f0 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70  pLeft==0 && pExp
1c600 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
1c610 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1c620 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 43  3ExprIsVector(pC
1c630 6f 70 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  opy) ){.        
1c640 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72  sqlite3VectorErr
1c650 6f 72 4d 73 67 28 70 53 75 62 73 74 2d 3e 70 50  orMsg(pSubst->pP
1c660 61 72 73 65 2c 20 70 43 6f 70 79 29 3b 0a 20 20  arse, pCopy);.  
1c670 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c680 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1c690 20 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2d   pSubst->pParse-
1c6a0 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28  >db;.        if(
1c6b0 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a   pSubst->isLeftJ
1c6c0 6f 69 6e 20 26 26 20 70 43 6f 70 79 2d 3e 6f 70  oin && pCopy->op
1c6d0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  !=TK_COLUMN ){. 
1c6e0 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
1c6f0 26 69 66 4e 75 6c 6c 52 6f 77 2c 20 30 2c 20 73  &ifNullRow, 0, s
1c700 69 7a 65 6f 66 28 69 66 4e 75 6c 6c 52 6f 77 29  izeof(ifNullRow)
1c710 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e  );.          ifN
1c720 75 6c 6c 52 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49  ullRow.op = TK_I
1c730 46 5f 4e 55 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20  F_NULL_ROW;.    
1c740 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e        ifNullRow.
1c750 70 4c 65 66 74 20 3d 20 70 43 6f 70 79 3b 0a 20  pLeft = pCopy;. 
1c760 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52           ifNullR
1c770 6f 77 2e 69 54 61 62 6c 65 20 3d 20 70 53 75 62  ow.iTable = pSub
1c780 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20  st->iNewTable;. 
1c790 20 20 20 20 20 20 20 20 20 70 43 6f 70 79 20 3d           pCopy =
1c7a0 20 26 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20   &ifNullRow;.   
1c7b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1c7c0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
1c7d0 72 44 75 70 28 64 62 2c 20 70 43 6f 70 79 2c 20  rDup(db, pCopy, 
1c7e0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
1c7f0 70 4e 65 77 20 26 26 20 70 53 75 62 73 74 2d 3e  pNew && pSubst->
1c800 69 73 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  isLeftJoin ){.  
1c810 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50          ExprSetP
1c820 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
1c830 5f 43 61 6e 42 65 4e 75 6c 6c 29 3b 0a 20 20 20  _CanBeNull);.   
1c840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1c850 66 28 20 70 4e 65 77 20 26 26 20 45 78 70 72 48  f( pNew && ExprH
1c860 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1c870 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b  ,EP_FromJoin) ){
1c880 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
1c890 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
1c8a0 20 3d 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74   = pExpr->iRight
1c8b0 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20 20  JoinTable;.     
1c8c0 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70       ExprSetProp
1c8d0 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 46 72  erty(pNew, EP_Fr
1c8e0 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 20  omJoin);.       
1c8f0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
1c900 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1c910 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
1c920 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
1c930 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1c940 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 45  else{.    if( pE
1c950 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e  xpr->op==TK_IF_N
1c960 55 4c 4c 5f 52 4f 57 20 26 26 20 70 45 78 70 72  ULL_ROW && pExpr
1c970 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74  ->iTable==pSubst
1c980 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ->iTable ){.    
1c990 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
1c9a0 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61  = pSubst->iNewTa
1c9b0 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ble;.    }.    p
1c9c0 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75  Expr->pLeft = su
1c9d0 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20  bstExpr(pSubst, 
1c9e0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1c9f0 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
1ca00 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75   = substExpr(pSu
1ca10 62 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  bst, pExpr->pRig
1ca20 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70  ht);.    if( Exp
1ca30 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1ca40 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1ca50 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ) ){.      subst
1ca60 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70  Select(pSubst, p
1ca70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  Expr->x.pSelect,
1ca80 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   1);.    }else{.
1ca90 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
1caa0 69 73 74 28 70 53 75 62 73 74 2c 20 70 45 78 70  ist(pSubst, pExp
1cab0 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
1cac0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1cad0 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20  pExpr;.}.static 
1cae0 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
1caf0 73 74 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65  st(.  SubstConte
1cb00 78 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44  xt *pSubst, /* D
1cb10 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1cb20 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a  e substitution *
1cb30 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
1cb40 69 73 74 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  ist       /* Lis
1cb50 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e  t to scan and in
1cb60 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73   which to make s
1cb70 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 29 7b  ubstitutes */.){
1cb80 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1cb90 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1cba0 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
1cbb0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1cbc0 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  +){.    pList->a
1cbd0 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73  [i].pExpr = subs
1cbe0 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 4c  tExpr(pSubst, pL
1cbf0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
1cc00 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
1cc10 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
1cc20 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20  .  SubstContext 
1cc30 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63  *pSubst, /* Desc
1cc40 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ription of the s
1cc50 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20  ubstitution */. 
1cc60 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
1cc70 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
1cc80 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68   statement in wh
1cc90 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73  ich to make subs
1cca0 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  titutions */.  i
1ccb0 6e 74 20 64 6f 50 72 69 6f 72 20 20 20 20 20 20  nt doPrior      
1ccc0 20 20 20 20 20 2f 2a 20 44 6f 20 73 75 62 73 74       /* Do subst
1ccd0 69 74 75 74 65 73 20 6f 6e 20 70 2d 3e 70 50 72  itutes on p->pPr
1cce0 69 6f 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20  ior too */.){.  
1ccf0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
1cd00 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1cd10 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
1cd20 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29  nt i;.  if( !p )
1cd30 20 72 65 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20   return;.  do{. 
1cd40 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1cd50 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 45 4c 69  (pSubst, p->pELi
1cd60 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
1cd70 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70  prList(pSubst, p
1cd80 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
1cd90 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
1cda0 53 75 62 73 74 2c 20 70 2d 3e 70 4f 72 64 65 72  Subst, p->pOrder
1cdb0 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76  By);.    p->pHav
1cdc0 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28  ing = substExpr(
1cdd0 70 53 75 62 73 74 2c 20 70 2d 3e 70 48 61 76 69  pSubst, p->pHavi
1cde0 6e 67 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  ng);.    p->pWhe
1cdf0 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  re = substExpr(p
1ce00 53 75 62 73 74 2c 20 70 2d 3e 70 57 68 65 72 65  Subst, p->pWhere
1ce10 29 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 2d  );.    pSrc = p-
1ce20 3e 70 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72  >pSrc;.    asser
1ce30 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  t( pSrc!=0 );.  
1ce40 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
1ce50 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e  rc, pItem=pSrc->
1ce60 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
1ce70 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62  em++){.      sub
1ce80 73 74 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c  stSelect(pSubst,
1ce90 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c   pItem->pSelect,
1cea0 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   1);.      if( p
1ceb0 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
1cec0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 75  nc ){.        su
1ced0 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62  bstExprList(pSub
1cee0 73 74 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46  st, pItem->u1.pF
1cef0 75 6e 63 41 72 67 29 3b 0a 20 20 20 20 20 20 7d  uncArg);.      }
1cf00 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
1cf10 20 64 6f 50 72 69 6f 72 20 26 26 20 28 70 20 3d   doPrior && (p =
1cf20 20 70 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20 29   p->pPrior)!=0 )
1cf30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
1cf40 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1cf50 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1cf60 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1cf70 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23  OMIT_VIEW) */..#
1cf80 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
1cf90 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1cfa0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1cfb0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
1cfc0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1cfd0 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
1cfe0 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
1cff0 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e  s as a performan
1d000 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  ce optimization.
1d010 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d020 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74   returns 1 if it
1d030 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61   makes changes a
1d040 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74  nd 0 if no flatt
1d050 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a  ening occurs..**
1d060 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e  .** To understan
1d070 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66  d the concept of
1d080 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e   flattening, con
1d090 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
1d0a0 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a  ing.** query:.**
1d0b0 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
1d0c0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b   FROM (SELECT x+
1d0d0 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
1d0e0 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52  HERE z<100) WHER
1d0f0 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E a>5.**.** The 
1d100 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69  default way of i
1d110 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73  mplementing this
1d120 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65   query is to exe
1d130 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71  cute the.** subq
1d140 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73  uery first and s
1d150 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1d160 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
1d170 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72  table, then.** r
1d180 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  un the outer que
1d190 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f  ry on that tempo
1d1a0 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69  rary table.  Thi
1d1b0 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a  s requires two.*
1d1c0 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68  * passes over th
1d1d0 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72  e data.  Further
1d1e0 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68  more, because th
1d1f0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
1d200 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69  e.** has no indi
1d210 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63  ces, the WHERE c
1d220 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74  lause on the out
1d230 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  er query cannot 
1d240 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e  be.** optimized.
1d250 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1d260 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
1d270 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20  rewrite queries 
1d280 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76  such as the abov
1d290 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  e into.** a sing
1d2a0 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20  le flat select, 
1d2b0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1d2c0 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20       SELECT x+y 
1d2d0 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
1d2e0 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35  RE z<100 AND a>5
1d2f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
1d300 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
1d310 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f  is simplificatio
1d320 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  n gives the same
1d330 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f   result.** but o
1d340 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20  nly has to scan 
1d350 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20  the data once.  
1d360 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69  And because indi
1d370 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78  ces might .** ex
1d380 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ist on the table
1d390 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20   t1, a complete 
1d3a0 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61  scan of the data
1d3b0 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f   might be.** avo
1d3c0 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74  ided..**.** Flat
1d3d0 74 65 6e 69 6e 67 20 69 73 20 73 75 62 6a 65 63  tening is subjec
1d3e0 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t to the followi
1d3f0 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a 0a  ng constraints:.
1d400 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20  **.**  (**)  We 
1d410 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70  no longer attemp
1d420 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67  t to flatten agg
1d430 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65  regate subquerie
1d440 73 2e 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20  s. Was:.**      
1d450 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1d460 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
1d470 72 79 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62  ry cannot both b
1d480 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  e aggregates..**
1d490 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f  .**  (**)  We no
1d4a0 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20   longer attempt 
1d4b0 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65  to flatten aggre
1d4c0 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2e  gate subqueries.
1d4d0 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20   Was:.**        
1d4e0 28 32 29 20 49 66 20 74 68 65 20 73 75 62 71 75  (2) If the subqu
1d4f0 65 72 79 20 69 73 20 61 6e 20 61 67 67 72 65 67  ery is an aggreg
1d500 61 74 65 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20  ate then.**     
1d510 20 20 20 28 32 61 29 20 74 68 65 20 6f 75 74 65     (2a) the oute
1d520 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74  r query must not
1d530 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a   be a join and.*
1d540 2a 20 20 20 20 20 20 20 20 28 32 62 29 20 74 68  *        (2b) th
1d550 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 75  e outer query mu
1d560 73 74 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75  st not use subqu
1d570 65 72 69 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  eries.**        
1d580 20 20 20 20 20 6f 74 68 65 72 20 74 68 61 6e 20       other than 
1d590 74 68 65 20 6f 6e 65 20 46 52 4f 4d 2d 63 6c 61  the one FROM-cla
1d5a0 75 73 65 20 73 75 62 71 75 65 72 79 20 74 68 61  use subquery tha
1d5b0 74 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  t is a candidate
1d5c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1d5d0 66 6f 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20  for flattening. 
1d5e0 20 28 54 68 69 73 20 69 73 20 64 75 65 20 74 6f   (This is due to
1d5f0 20 74 69 63 6b 65 74 20 5b 32 66 37 31 37 30 64   ticket [2f7170d
1d600 37 33 62 66 39 61 62 66 38 30 5d 0a 2a 2a 20 20  73bf9abf80].**  
1d610 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20             from 
1d620 32 30 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a  2015-02-09.).**.
1d630 2a 2a 20 20 20 28 33 29 20 20 49 66 20 74 68 65  **   (3)  If the
1d640 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
1d650 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
1d660 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68  f a LEFT JOIN th
1d670 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 61  en.**        (3a
1d680 29 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6d  ) the subquery m
1d690 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e  ay not be a join
1d6a0 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28   and.**        (
1d6b0 33 62 29 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  3b) the FROM cla
1d6c0 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
1d6d0 65 72 79 20 6d 61 79 20 6e 6f 74 20 63 6f 6e 74  ery may not cont
1d6e0 61 69 6e 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a  ain a virtual.**
1d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62               tab
1d700 6c 65 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  le and.**       
1d710 20 28 33 63 29 20 74 68 65 20 6f 75 74 65 72 20   (3c) the outer 
1d720 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
1d730 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 2a   an aggregate..*
1d740 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20  *.**   (4)  The 
1d750 73 75 62 71 75 65 72 79 20 63 61 6e 20 6e 6f 74  subquery can not
1d760 20 62 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a   be DISTINCT..**
1d770 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e  .**  (**)  At on
1d780 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74  e point restrict
1d790 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29  ions (4) and (5)
1d7a0 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73 65   defined a subse
1d7b0 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a  t of DISTINCT.**
1d7c0 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65 72          sub-quer
1d7d0 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65 78  ies that were ex
1d7e0 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73  cluded from this
1d7f0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52   optimization. R
1d800 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20  estriction .**  
1d810 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73 69        (4) has si
1d820 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65  nce been expande
1d830 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c  d to exclude all
1d840 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75 65   DISTINCT subque
1d850 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  ries..**.**  (**
1d860 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  )  We no longer 
1d870 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74  attempt to flatt
1d880 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  en aggregate sub
1d890 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a  queries.  Was:.*
1d8a0 2a 20 20 20 20 20 20 20 20 49 66 20 74 68 65 20  *        If the 
1d8b0 73 75 62 71 75 65 72 79 20 69 73 20 61 67 67 72  subquery is aggr
1d8c0 65 67 61 74 65 2c 20 74 68 65 20 6f 75 74 65 72  egate, the outer
1d8d0 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62   query may not b
1d8e0 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a  e DISTINCT..**.*
1d8f0 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62  *   (7)  The sub
1d900 71 75 65 72 79 20 6d 75 73 74 20 68 61 76 65 20  query must have 
1d910 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  a FROM clause.  
1d920 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75  TODO:  For subqu
1d930 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a  eries without.**
1d940 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63          A FROM c
1d950 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20  lause, consider 
1d960 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c  adding a FROM cl
1d970 61 75 73 65 20 77 69 74 68 20 74 68 65 20 73 70  ause with the sp
1d980 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ecial.**        
1d990 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63  table sqlite_onc
1d9a0 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  e that consists 
1d9b0 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  of a single row 
1d9c0 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20  containing a.** 
1d9d0 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55         single NU
1d9e0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20  LL..**.**   (8) 
1d9f0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1da00 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e   uses LIMIT then
1da10 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1da20 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f   may not be a jo
1da30 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20  in..**.**   (9) 
1da40 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1da50 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e   uses LIMIT then
1da60 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1da70 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 67 67 72   may not be aggr
1da80 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  egate..**.**  (*
1da90 2a 29 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20  *)  Restriction 
1daa0 28 31 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64  (10) was removed
1dab0 20 66 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f   from the code o
1dac0 6e 20 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74  n 2005-02-05 but
1dad0 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63   we.**        ac
1dae0 63 69 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64  cidently carried
1daf0 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72   the comment for
1db00 77 61 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d  ward until 2014-
1db10 30 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c  09-15.  Original
1db20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .**        const
1db30 72 61 69 6e 74 3a 20 22 49 66 20 74 68 65 20 73  raint: "If the s
1db40 75 62 71 75 65 72 79 20 69 73 20 61 67 67 72 65  ubquery is aggre
1db50 67 61 74 65 20 74 68 65 6e 20 74 68 65 20 6f 75  gate then the ou
1db60 74 65 72 20 71 75 65 72 79 20 0a 2a 2a 20 20 20  ter query .**   
1db70 20 20 20 20 20 6d 61 79 20 6e 6f 74 20 75 73 65       may not use
1db80 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20   LIMIT.".**.**  
1db90 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (11)  The subque
1dba0 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
1dbb0 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62   query may not b
1dbc0 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42  oth have ORDER B
1dbd0 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  Y clauses..**.**
1dbe0 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c    (**)  Not impl
1dbf0 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d  emented.  Subsum
1dc00 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74  ed into restrict
1dc10 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72  ion (3).  Was pr
1dc20 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20  eviously.**     
1dc30 20 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65     a separate re
1dc40 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69  striction derivi
1dc50 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23  ng from ticket #
1dc60 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29  350..**.**  (13)
1dc70 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1dc80 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  nd outer query m
1dc90 61 79 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  ay not both use 
1dca0 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  LIMIT..**.**  (1
1dcb0 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
1dcc0 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4f 46 46   may not use OFF
1dcd0 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29  SET..**.**  (15)
1dce0 20 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71    If the outer q
1dcf0 75 65 72 79 20 69 73 20 70 61 72 74 20 6f 66 20  uery is part of 
1dd00 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
1dd10 74 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20  t, then the.**  
1dd20 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20 6d        subquery m
1dd30 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  ay not use LIMIT
1dd40 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65  ..**        (See
1dd50 20 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e   ticket #2339 an
1dd60 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38  d ticket [02a8e8
1dd70 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  1d44])..**.**  (
1dd80 31 36 29 20 20 49 66 20 74 68 65 20 6f 75 74 65  16)  If the oute
1dd90 72 20 71 75 65 72 79 20 69 73 20 61 67 67 72 65  r query is aggre
1dda0 67 61 74 65 2c 20 74 68 65 6e 20 74 68 65 20 73  gate, then the s
1ddb0 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a  ubquery may not.
1ddc0 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4f 52  **        use OR
1ddd0 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74  DER BY.  (Ticket
1dde0 20 23 32 39 34 32 29 20 20 54 68 69 73 20 75 73   #2942)  This us
1ddf0 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72  ed to not matter
1de00 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c  .**        until
1de10 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74   we introduced t
1de20 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  he group_concat(
1de30 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a  ) function.  .**
1de40 0a 2a 2a 20 20 28 31 37 29 20 20 49 66 20 74 68  .**  (17)  If th
1de50 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20  e subquery is a 
1de60 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1de70 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20   then.**        
1de80 28 31 37 61 29 20 61 6c 6c 20 63 6f 6d 70 6f 75  (17a) all compou
1de90 6e 64 20 6f 70 65 72 61 74 6f 72 73 20 6d 75 73  nd operators mus
1dea0 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t be a UNION ALL
1deb0 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  , and.**        
1dec0 28 31 37 62 29 20 6e 6f 20 74 65 72 6d 73 20 77  (17b) no terms w
1ded0 69 74 68 69 6e 20 74 68 65 20 73 75 62 71 75 65  ithin the subque
1dee0 72 79 20 63 6f 6d 70 6f 75 6e 64 20 6d 61 79 20  ry compound may 
1def0 62 65 20 61 67 67 72 65 67 61 74 65 0a 2a 2a 20  be aggregate.** 
1df00 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 20               or 
1df10 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 0a 2a 2a  DISTINCT, and.**
1df20 20 20 20 20 20 20 20 20 28 31 37 63 29 20 65 76          (17c) ev
1df30 65 72 79 20 74 65 72 6d 20 77 69 74 68 69 6e 20  ery term within 
1df40 74 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d  the subquery com
1df50 70 6f 75 6e 64 20 6d 75 73 74 20 68 61 76 65 20  pound must have 
1df60 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a  a FROM clause.**
1df70 20 20 20 20 20 20 20 20 28 31 37 64 29 20 74 68          (17d) th
1df80 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61  e outer query ma
1df90 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20  y not be.**     
1dfa0 20 20 20 20 20 20 20 20 20 28 31 37 64 31 29 20           (17d1) 
1dfb0 61 67 67 72 65 67 61 74 65 2c 20 6f 72 0a 2a 2a  aggregate, or.**
1dfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 31                (1
1dfd0 37 64 32 29 20 44 49 53 54 49 4e 43 54 2c 20 6f  7d2) DISTINCT, o
1dfe0 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
1dff0 20 20 28 31 37 64 33 29 20 61 20 6a 6f 69 6e 2e    (17d3) a join.
1e000 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  .**.**        Th
1e010 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62  e parent and sub
1e020 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61  -query may conta
1e030 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  in WHERE clauses
1e040 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20  . Subject to.** 
1e050 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31         rules (11
1e060 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29  ), (13) and (14)
1e070 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20  , they may also 
1e080 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59  contain ORDER BY
1e090 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49  ,.**        LIMI
1e0a0 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
1e0b0 75 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75  uses.  The subqu
1e0c0 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61  ery cannot use a
1e0d0 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  ny compound.**  
1e0e0 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f        operator o
1e0f0 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20  ther than UNION 
1e100 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20  ALL because all 
1e110 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75  the other compou
1e120 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65  nd.**        ope
1e130 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69  rators have an i
1e140 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20  mplied DISTINCT 
1e150 77 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f  which is disallo
1e160 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20  wed by.**       
1e170 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   restriction (4)
1e180 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41  ..**.**        A
1e190 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e  lso, each compon
1e1a0 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71  ent of the sub-q
1e1b0 75 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e  uery must return
1e1c0 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
1e1d0 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65  .**        of re
1e1e0 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68  sult columns. Th
1e1f0 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  is is actually a
1e200 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72   requirement for
1e210 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
1e220 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73          SELECT s
1e230 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c  tatement, but al
1e240 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20  l the code here 
1e250 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72  does is make sur
1e260 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20  e that no.**    
1e270 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61      such (illega
1e280 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  l) sub-query is 
1e290 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63  flattened. The c
1e2a0 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63  aller will detec
1e2b0 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  t the.**        
1e2c0 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64  syntax error and
1e2d0 20 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c   return a detail
1e2e0 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  ed message..**.*
1e2f0 2a 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20  *  (18)  If the 
1e300 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1e310 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1e320 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  then all terms o
1e330 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  f the.**        
1e340 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1e350 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75  of the parent mu
1e360 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66  st be simple ref
1e370 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20  erences to .**  
1e380 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66        columns of
1e390 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a   the sub-query..
1e3a0 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 49 66 20  **.**  (19)  If 
1e3b0 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1e3c0 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65  s LIMIT then the
1e3d0 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1e3e0 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68   not.**        h
1e3f0 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ave a WHERE clau
1e400 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20  se..**.**  (20) 
1e410 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
1e420 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
1e430 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20  select, then it 
1e440 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  must not use.** 
1e450 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20         an ORDER 
1e460 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b  BY clause.  Tick
1e470 65 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f  et #3773.  We co
1e480 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63  uld relax this c
1e490 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20  onstraint.**    
1e4a0 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20      somewhat by 
1e4b0 73 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20  saying that the 
1e4c0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
1e4d0 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73  ER BY clause mus
1e4e0 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65  t.**        appe
1e4f0 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64  ar as unmodified
1e500 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
1e510 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
1e520 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20  ry.  But we.**  
1e530 20 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72        have other
1e540 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69   optimizations i
1e550 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77  n mind to deal w
1e560 69 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a  ith that case..*
1e570 2a 0a 2a 2a 20 20 28 32 31 29 20 20 49 66 20 74  *.**  (21)  If t
1e580 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1e590 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20   LIMIT then the 
1e5a0 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20  outer query may 
1e5b0 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  not be.**       
1e5c0 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65   DISTINCT.  (See
1e5d0 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34   ticket [752e164
1e5e0 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32  6fc])..**.**  (2
1e5f0 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
1e600 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 72 65   may not be a re
1e610 63 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a  cursive CTE..**.
1e620 2a 2a 20 20 28 2a 2a 29 20 20 53 75 62 73 75 6d  **  (**)  Subsum
1e630 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74  ed into restrict
1e640 69 6f 6e 20 28 31 37 64 33 29 2e 20 20 57 61 73  ion (17d3).  Was
1e650 3a 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71  : If the outer q
1e660 75 65 72 79 20 69 73 0a 2a 2a 20 20 20 20 20 20  uery is.**      
1e670 20 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54    a recursive CT
1e680 45 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 2d  E, then the sub-
1e690 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
1e6a0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
1e6b0 79 2e 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 69  y..**        Thi
1e6c0 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 69 73  s restriction is
1e6d0 20 62 65 63 61 75 73 65 20 74 72 61 6e 73 66 6f   because transfo
1e6e0 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20  rming the.**    
1e6f0 20 20 20 20 70 61 72 65 6e 74 20 74 6f 20 61 20      parent to a 
1e700 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 63  compound query c
1e710 6f 6e 66 75 73 65 73 20 74 68 65 20 63 6f 64 65  onfuses the code
1e720 20 74 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a   that handles.**
1e730 20 20 20 20 20 20 20 20 72 65 63 75 72 73 69 76          recursiv
1e740 65 20 71 75 65 72 69 65 73 20 69 6e 20 6d 75 6c  e queries in mul
1e750 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a  tiSelect()..**.*
1e760 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c  *  (**)  We no l
1e770 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f  onger attempt to
1e780 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61   flatten aggrega
1e790 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 20  te subqueries.  
1e7a0 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54  Was:.**        T
1e7b0 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20  he subquery may 
1e7c0 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67  not be an aggreg
1e7d0 61 74 65 20 74 68 61 74 20 75 73 65 73 20 74 68  ate that uses th
1e7e0 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29  e built-in min()
1e7f0 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f   or .**        o
1e800 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e  r max() function
1e810 73 2e 20 20 28 57 69 74 68 6f 75 74 20 74 68 69  s.  (Without thi
1e820 73 20 72 65 73 74 72 69 63 74 69 6f 6e 2c 20 61  s restriction, a
1e830 20 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20   query like:.** 
1e840 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 78         "SELECT x
1e850 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d 61   FROM (SELECT ma
1e860 78 28 79 29 2c 20 78 20 46 52 4f 4d 20 74 31 29  x(y), x FROM t1)
1e870 22 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63 65  " would not nece
1e880 73 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20 20  ssarily.**      
1e890 20 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c    return the val
1e8a0 75 65 20 58 20 66 6f 72 20 77 68 69 63 68 20 59  ue X for which Y
1e8b0 20 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a   was maximal.).*
1e8c0 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  *.**.** In this 
1e8d0 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22  routine, the "p"
1e8e0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
1e8f0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f  pointer to the o
1e900 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54  uter query..** T
1e910 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
1e920 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  ->pSrc->a[iFrom]
1e930 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65  .  isAgg is true
1e940 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
1e950 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72  ery.** uses aggr
1e960 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  egates..**.** If
1e970 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e   flattening is n
1e980 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68  ot attempted, th
1e990 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1e9a0 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e  no-op and return
1e9b0 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74  s 0..** If flatt
1e9c0 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74  ening is attempt
1e9d0 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
1e9e0 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a  returns 1..**.**
1e9f0 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72   All of the expr
1ea00 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20  ession analysis 
1ea10 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f  must occur on bo
1ea20 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  th the outer que
1ea30 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75  ry and.** the su
1ea40 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68  bquery before th
1ea50 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e  is routine runs.
1ea60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1ea70 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a  lattenSubquery(.
1ea80 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1ea90 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1eaa0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
1eab0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1eac0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
1ead0 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43  t or outer SELEC
1eae0 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
1eaf0 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20   int iFrom,     
1eb00 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
1eb10 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f  n p->pSrc->a[] o
1eb20 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71  f the inner subq
1eb30 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
1eb40 41 67 67 20 20 20 20 20 20 20 20 20 20 20 20 2f  Agg            /
1eb50 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20  * True if outer 
1eb60 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72  SELECT uses aggr
1eb70 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
1eb80 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
1eb90 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
1eba0 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
1ebb0 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
1ebc0 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b  Select *pParent;
1ebd0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 55      /* Current U
1ebe0 4e 49 4f 4e 20 41 4c 4c 20 74 65 72 6d 20 6f 66  NION ALL term of
1ebf0 20 74 68 65 20 6f 74 68 65 72 20 71 75 65 72 79   the other query
1ec00 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
1ec10 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ub;       /* The
1ec20 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20   inner query or 
1ec30 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20  "subquery" */.  
1ec40 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20  Select *pSub1;  
1ec50 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1ec60 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20  o the rightmost 
1ec70 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75  select in sub-qu
1ec80 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
1ec90 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20   *pSrc;      /* 
1eca0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
1ecb0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1ecc0 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
1ecd0 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54  *pSubSrc;   /* T
1ece0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1ecf0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  f the subquery *
1ed00 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
1ed10 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
1ed20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
1ed30 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74   the pSub result
1ed40 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20   set temp table 
1ed50 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 50 61 72  */.  int iNewPar
1ed60 65 6e 74 20 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c  ent = -1;/* Repl
1ed70 61 63 65 6d 65 6e 74 20 74 61 62 6c 65 20 66 6f  acement table fo
1ed80 72 20 69 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69  r iParent */.  i
1ed90 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20  nt isLeftJoin = 
1eda0 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 70 53  0; /* True if pS
1edb0 75 62 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ub is the right 
1edc0 73 69 64 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  side of a LEFT J
1edd0 4f 49 4e 20 2a 2f 20 20 20 20 0a 20 20 69 6e 74  OIN */    .  int
1ede0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1edf0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1ee00 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
1ee10 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
1ee20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
1ee30 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1ee40 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1ee50 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20  tem *pSubitem;  
1ee60 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
1ee70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1ee80 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1ee90 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
1eea0 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67  ee if flattening
1eeb0 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20   is permitted.  
1eec0 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e  Return 0 if not.
1eed0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1eee0 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
1eef0 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
1ef00 3b 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  ;.  if( Optimiza
1ef10 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
1ef20 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61   SQLITE_QueryFla
1ef30 74 74 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e  ttener) ) return
1ef40 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
1ef50 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
1ef60 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30  pSrc && iFrom>=0
1ef70 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e   && iFrom<pSrc->
1ef80 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74  nSrc );.  pSubit
1ef90 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46  em = &pSrc->a[iF
1efa0 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20  rom];.  iParent 
1efb0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72  = pSubitem->iCur
1efc0 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53  sor;.  pSub = pS
1efd0 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
1efe0 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21  .  assert( pSub!
1eff0 3d 30 20 29 3b 0a 0a 20 20 70 53 75 62 53 72 63  =0 );..  pSubSrc
1f000 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20   = pSub->pSrc;. 
1f010 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63   assert( pSubSrc
1f020 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74   );.  /* Prior t
1f030 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c  o version 3.1.2,
1f040 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
1f050 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65  OFFSET had to be
1f060 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74   simple constant
1f070 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69  s,.  ** not arbi
1f080 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  trary expression
1f090 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f  s, we allowed so
1f0a0 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20  me combining of 
1f0b0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
1f0c0 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68  .  ** because th
1f0d0 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70  ey could be comp
1f0e0 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  uted at compile-
1f0f0 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20  time.  But when 
1f100 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
1f110 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62  .  ** became arb
1f120 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  itrary expressio
1f130 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63  ns, we were forc
1f140 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69  ed to add restri
1f150 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a  ctions (13).  **
1f160 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20   and (14). */.  
1f170 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1f180 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20   && p->pLimit ) 
1f190 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1f1a0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1f1b0 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20  ction (13) */.  
1f1c0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1f1d0 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74   && pSub->pLimit
1f1e0 2d 3e 70 52 69 67 68 74 20 29 20 72 65 74 75 72  ->pRight ) retur
1f1f0 6e 20 30 3b 20 20 20 2f 2a 20 52 65 73 74 72 69  n 0;   /* Restri
1f200 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20  ction (14) */.  
1f210 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
1f220 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29 21   & SF_Compound)!
1f230 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d  =0 && pSub->pLim
1f240 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  it ){.    return
1f250 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1f260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f280 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1f290 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  5) */.  }.  if( 
1f2a0 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  pSubSrc->nSrc==0
1f2b0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1f2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2d0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1f2e0 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (7)  */.  if( 
1f2f0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
1f300 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72   SF_Distinct ) r
1f310 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1f320 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1f330 6e 20 28 34 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (4)  */.  if( 
1f340 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1f350 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c  (pSrc->nSrc>1 ||
1f360 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20   isAgg) ){.     
1f370 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1f380 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1f390 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a  s (8)(9) */.  }.
1f3a0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1f3b0 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  y && pSub->pOrde
1f3c0 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75  rBy ){.     retu
1f3d0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1f3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f400 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1f410 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  11) */.  }.  if(
1f420 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e   isAgg && pSub->
1f430 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72  pOrderBy ) retur
1f440 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1f450 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1f460 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28  on (16) */.  if(
1f470 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1f480 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
1f490 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1f4a0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1f4b0 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28  on (19) */.  if(
1f4c0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1f4d0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1f4e0 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
1f4f0 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
1f500 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
1f510 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f  triction (21) */
1f520 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d  .  }.  if( pSub-
1f530 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1f540 52 65 63 75 72 73 69 76 65 29 20 29 7b 0a 20 20  Recursive) ){.  
1f550 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52    return 0; /* R
1f560 65 73 74 72 69 63 74 69 6f 6e 73 20 28 32 32 29  estrictions (22)
1f570 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20   */.  }..  /*.  
1f580 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65  ** If the subque
1f590 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
1f5a0 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46  operand of a LEF
1f5b0 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68 65  T JOIN, then the
1f5c0 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 6d  .  ** subquery m
1f5d0 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e  ay not be a join
1f5e0 20 69 74 73 65 6c 66 20 28 33 61 29 2e 20 45 78   itself (3a). Ex
1f5f0 61 6d 70 6c 65 20 6f 66 20 77 68 79 20 74 68 69  ample of why thi
1f600 73 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 6c  s is not.  ** al
1f610 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
1f620 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
1f630 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20   OUTER JOIN (t2 
1f640 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20  JOIN t3).  **.  
1f650 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
1f660 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
1f670 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
1f680 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
1f690 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
1f6a0 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a  2) JOIN t3.  **.
1f6b0 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f    ** which is no
1f6c0 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d  t at all the sam
1f6d0 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20  e thing..  **.  
1f6e0 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65  ** If the subque
1f6f0 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
1f700 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46  operand of a LEF
1f710 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68 65  T JOIN, then the
1f720 20 6f 75 74 65 72 0a 20 20 2a 2a 20 71 75 65 72   outer.  ** quer
1f730 79 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 61  y cannot be an a
1f740 67 67 72 65 67 61 74 65 2e 20 28 33 63 29 20 20  ggregate. (3c)  
1f750 54 68 69 73 20 69 73 20 61 6e 20 61 72 74 69 66  This is an artif
1f760 61 63 74 20 6f 66 20 74 68 65 20 77 61 79 0a 20  act of the way. 
1f770 20 2a 2a 20 61 67 67 72 65 67 61 74 65 73 20 61   ** aggregates a
1f780 72 65 20 70 72 6f 63 65 73 73 65 64 20 2d 20 74  re processed - t
1f790 68 65 72 65 20 69 73 20 6e 6f 20 6d 65 63 68 61  here is no mecha
1f7a0 6e 69 73 6d 20 74 6f 20 64 65 74 65 72 6d 69 6e  nism to determin
1f7b0 65 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 4c 45  e if.  ** the LE
1f7c0 46 54 20 4a 4f 49 4e 20 74 61 62 6c 65 20 73 68  FT JOIN table sh
1f7d0 6f 75 6c 64 20 62 65 20 61 6c 6c 2d 4e 55 4c 4c  ould be all-NULL
1f7e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20  ..  **.  ** See 
1f7f0 61 6c 73 6f 20 74 69 63 6b 65 74 73 20 23 33 30  also tickets #30
1f800 36 2c 20 23 33 35 30 2c 20 61 6e 64 20 23 33 33  6, #350, and #33
1f810 30 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  00..  */.  if( (
1f820 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69  pSubitem->fg.joi
1f830 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
1f840 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 73 4c 65  )!=0 ){.    isLe
1f850 66 74 4a 6f 69 6e 20 3d 20 31 3b 0a 20 20 20 20  ftJoin = 1;.    
1f860 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
1f870 63 3e 31 20 7c 7c 20 69 73 41 67 67 20 7c 7c 20  c>1 || isAgg || 
1f880 49 73 56 69 72 74 75 61 6c 28 70 53 75 62 53 72  IsVirtual(pSubSr
1f890 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29 7b  c->a[0].pTab) ){
1f8a0 0a 20 20 20 20 20 20 2f 2a 20 20 28 33 61 29 20  .      /*  (3a) 
1f8b0 20 20 20 20 20 20 20 20 20 20 20 20 28 33 63 29              (3c)
1f8c0 20 20 20 20 20 28 33 62 29 20 2a 2f 0a 20 20 20       (3b) */.   
1f8d0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1f8e0 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
1f8f0 4c 49 54 45 5f 45 58 54 52 41 5f 49 46 4e 55 4c  LITE_EXTRA_IFNUL
1f900 4c 52 4f 57 0a 20 20 65 6c 73 65 20 69 66 28 20  LROW.  else if( 
1f910 69 46 72 6f 6d 3e 30 20 26 26 20 21 69 73 41 67  iFrom>0 && !isAg
1f920 67 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74 74  g ){.    /* Sett
1f930 69 6e 67 20 69 73 4c 65 66 74 4a 6f 69 6e 20 74  ing isLeftJoin t
1f940 6f 20 2d 31 20 63 61 75 73 65 73 20 4f 50 5f 49  o -1 causes OP_I
1f950 66 4e 75 6c 6c 52 6f 77 20 6f 70 63 6f 64 65 73  fNullRow opcodes
1f960 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64   to be generated
1f970 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72   for.    ** ever
1f980 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  y reference to a
1f990 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ny result column
1f9a0 20 66 72 6f 6d 20 73 75 62 71 75 65 72 79 20 69   from subquery i
1f9b0 6e 20 61 20 6a 6f 69 6e 2c 20 65 76 65 6e 0a 20  n a join, even. 
1f9c0 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 74 68 65     ** though the
1f9d0 79 20 61 72 65 20 6e 6f 74 20 6e 65 63 65 73 73  y are not necess
1f9e0 61 72 79 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ary.  This will 
1f9f0 73 74 72 65 73 73 2d 74 65 73 74 20 74 68 65 20  stress-test the 
1fa00 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20 0a 20 20  OP_IfNullRow .  
1fa10 20 20 2a 2a 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a    ** opcode. */.
1fa20 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d      isLeftJoin =
1fa30 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   -1;.  }.#endif.
1fa40 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  .  /* Restrictio
1fa50 6e 20 28 31 37 29 3a 20 49 66 20 74 68 65 20 73  n (17): If the s
1fa60 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1fa70 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74  mpound SELECT, t
1fa80 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a  hen it must.  **
1fa90 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e   use only the UN
1faa0 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
1fab0 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68  . And none of th
1fac0 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20  e simple select 
1fad0 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61  queries.  ** tha
1fae0 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f  t make up the co
1faf0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72  mpound SELECT ar
1fb00 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  e allowed to be 
1fb10 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69 73  aggregate or dis
1fb20 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69  tinct.  ** queri
1fb30 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  es..  */.  if( p
1fb40 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  Sub->pPrior ){. 
1fb50 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
1fb60 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72  derBy ){.      r
1fb70 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73  eturn 0;  /* Res
1fb80 74 72 69 63 74 69 6f 6e 20 28 32 30 29 20 2a 2f  triction (20) */
1fb90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
1fba0 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46  sAgg || (p->selF
1fbb0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1fbc0 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e  ct)!=0 || pSrc->
1fbd0 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  nSrc!=1 ){.     
1fbe0 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 28 31   return 0; /* (1
1fbf0 37 64 31 29 2c 20 28 31 37 64 32 29 2c 20 6f 72  7d1), (17d2), or
1fc00 20 28 31 37 64 33 29 20 2a 2f 0a 20 20 20 20 7d   (17d3) */.    }
1fc10 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70  .    for(pSub1=p
1fc20 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62  Sub; pSub1; pSub
1fc30 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29  1=pSub1->pPrior)
1fc40 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1fc50 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
1fc60 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
1fc70 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
1fc80 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  ==SF_Distinct );
1fc90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fca0 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
1fcb0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
1fcc0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
1fcd0 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b  =SF_Aggregate );
1fce0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1fcf0 53 75 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a  Sub->pSrc!=0 );.
1fd00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
1fd10 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ub->pEList->nExp
1fd20 72 3d 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74  r==pSub1->pEList
1fd30 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
1fd40 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c   if( (pSub1->sel
1fd50 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
1fd60 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
1fd70 65 29 29 21 3d 30 20 20 20 20 2f 2a 20 28 31 37  e))!=0    /* (17
1fd80 62 29 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c 20  b) */.       || 
1fd90 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26  (pSub1->pPrior &
1fda0 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f  & pSub1->op!=TK_
1fdb0 41 4c 4c 29 20 20 20 20 20 20 20 20 20 20 20 20  ALL)            
1fdc0 20 20 20 20 20 2f 2a 20 28 31 37 61 29 20 2a 2f       /* (17a) */
1fdd0 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31  .       || pSub1
1fde0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 20 20  ->pSrc->nSrc<1  
1fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe10 2f 2a 20 28 31 37 63 29 20 2a 2f 0a 20 20 20 20  /* (17c) */.    
1fe20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74    ){.        ret
1fe30 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
1fe40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1fe50 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  Sub1->pSrc->nSrc
1fe60 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  >1 );.    }..   
1fe70 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1fe80 28 31 38 29 2e 20 2a 2f 0a 20 20 20 20 69 66 28  (18). */.    if(
1fe90 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
1fea0 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
1feb0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
1fec0 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  <p->pOrderBy->nE
1fed0 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  xpr; ii++){.    
1fee0 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
1fef0 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69  rBy->a[ii].u.x.i
1ff00 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20  OrderByCol==0 ) 
1ff10 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1ff20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1ff30 2a 20 45 78 2d 72 65 73 74 72 69 63 74 69 6f 6e  * Ex-restriction
1ff40 20 28 32 33 29 3a 0a 20 20 2a 2a 20 54 68 65 20   (23):.  ** The 
1ff50 6f 6e 6c 79 20 77 61 79 20 74 68 61 74 20 74 68  only way that th
1ff60 65 20 72 65 63 75 72 73 69 76 65 20 70 61 72 74  e recursive part
1ff70 20 6f 66 20 61 20 43 54 45 20 63 61 6e 20 63 6f   of a CTE can co
1ff80 6e 74 61 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  ntain a compound
1ff90 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69  .  ** subquery i
1ffa0 73 20 66 6f 72 20 74 68 65 20 73 75 62 71 75 65  s for the subque
1ffb0 72 79 20 74 6f 20 62 65 20 6f 6e 65 20 74 65 72  ry to be one ter
1ffc0 6d 20 6f 66 20 61 20 6a 6f 69 6e 2e 20 20 42 75  m of a join.  Bu
1ffd0 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 73 75  t if the.  ** su
1ffe0 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e  bquery is a join
1fff0 2c 20 74 68 65 6e 20 74 68 65 20 66 6c 61 74 74  , then the flatt
20000 65 6e 69 6e 67 20 68 61 73 20 61 6c 72 65 61 64  ening has alread
20010 79 20 62 65 65 6e 20 73 74 6f 70 70 65 64 20 62  y been stopped b
20020 79 0a 20 20 2a 2a 20 72 65 73 74 72 69 63 74 69  y.  ** restricti
20030 6f 6e 20 28 31 37 64 33 29 0a 20 20 2a 2f 0a 20  on (17d3).  */. 
20040 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
20050 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
20060 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 53 75 62  sive)==0 || pSub
20070 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 0a  ->pPrior==0 );..
20080 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72    /***** If we r
20090 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
200a0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
200b0 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f  ermitted. *****/
200c0 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31  .  SELECTTRACE(1
200d0 2c 70 50 61 72 73 65 2c 70 2c 28 22 66 6c 61 74  ,pParse,p,("flat
200e0 74 65 6e 20 25 73 2e 25 70 20 66 72 6f 6d 20 74  ten %s.%p from t
200f0 65 72 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  erm %d\n",.     
20100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
20110 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 53  ub->zSelName, pS
20120 75 62 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20  ub, iFrom));..  
20130 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65  /* Authorize the
20140 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70   subquery */.  p
20150 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
20160 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ext = pSubitem->
20170 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c  zName;.  TESTONL
20180 59 28 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75  Y(i =) sqlite3Au
20190 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
201a0 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
201b0 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63  , 0, 0);.  testc
201c0 61 73 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44  ase( i==SQLITE_D
201d0 45 4e 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  ENY );.  pParse-
201e0 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
201f0 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
20200 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  t;..  /* If the 
20210 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
20220 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
20230 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28  tatement, then (
20240 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a  by restrictions.
20250 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61    ** 17 and 18 a
20260 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62 65  bove) it must be
20270 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64   a UNION ALL and
20280 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
20290 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20  y must .  ** be 
202a0 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a  of the form:.  *
202b0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
202c0 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52  T <expr-list> FR
202d0 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29  OM (<sub-query>)
202e0 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20   <where-clause> 
202f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  .  **.  ** follo
20300 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52  wed by any ORDER
20310 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f   BY, LIMIT and/o
20320 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  r OFFSET clauses
20330 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a  . This block.  *
20340 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f  * creates N-1 co
20350 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 65  pies of the pare
20360 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f 75 74  nt query without
20370 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c   any ORDER BY, L
20380 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46  IMIT or .  ** OF
20390 46 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64  FSET clauses and
203a0 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74   joins them to t
203b0 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64  he left-hand-sid
203c0 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
203d0 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49  l.  ** using UNI
203e0 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73  ON ALL operators
203f0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e  . In this case N
20400 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
20410 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65  f simple.  ** se
20420 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20  lect statements 
20430 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  in the compound 
20440 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a  sub-query..  **.
20450 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
20460 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
20470 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20  CT a+1 FROM (.  
20480 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
20490 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a   x FROM tab.  **
204a0 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
204b0 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  L.  **        SE
204c0 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a  LECT y FROM tab.
204d0 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
204e0 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
204f0 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32    SELECT abs(z*2
20500 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a  ) FROM tab2.  **
20510 20 20 20 20 20 29 20 57 48 45 52 45 20 61 21 3d       ) WHERE a!=
20520 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a  5 ORDER BY 1.  *
20530 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d  *.  ** Transform
20540 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20  ed into:.  **.  
20550 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
20560 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45  1 FROM tab WHERE
20570 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20   x+1!=5.  **    
20580 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
20590 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46      SELECT y+1 F
205a0 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b  ROM tab WHERE y+
205b0 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e  1!=5.  **     UN
205c0 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
205d0 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29   SELECT abs(z*2)
205e0 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45  +1 FROM tab2 WHE
205f0 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35  RE abs(z*2)+1!=5
20600 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20  .  **     ORDER 
20610 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  BY 1.  **.  ** W
20620 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20  e call this the 
20630 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65  "compound-subque
20640 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a  ry flattening"..
20650 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d    */.  for(pSub=
20660 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53  pSub->pPrior; pS
20670 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70  ub; pSub=pSub->p
20680 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65  Prior){.    Sele
20690 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78  ct *pNew;.    Ex
206a0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
206b0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
206c0 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
206d0 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
206e0 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
206f0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
20700 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
20710 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  0;.    p->pSrc =
20720 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f   0;.    p->pPrio
20730 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c  r = 0;.    p->pL
20740 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  imit = 0;.    pN
20750 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ew = sqlite3Sele
20760 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b  ctDup(db, p, 0);
20770 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
20780 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20  ctSetName(pNew, 
20790 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b  pSub->zSelName);
207a0 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
207b0 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e   pLimit;.    p->
207c0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
207d0 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  rBy;.    p->pSrc
207e0 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e   = pSrc;.    p->
207f0 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20  op = TK_ALL;.   
20800 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
20810 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
20820 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65  = pPrior;.    }e
20830 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
20840 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
20850 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
20860 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65  or ) pPrior->pNe
20870 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  xt = pNew;.     
20880 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
20890 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
208a0 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  r = pNew;.      
208b0 53 45 4c 45 43 54 54 52 41 43 45 28 32 2c 70 50  SELECTTRACE(2,pP
208c0 61 72 73 65 2c 70 2c 0a 20 20 20 20 20 20 20 20  arse,p,.        
208d0 20 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   ("compound-subq
208e0 75 65 72 79 20 66 6c 61 74 74 65 6e 65 72 20 63  uery flattener c
208f0 72 65 61 74 65 73 20 25 73 2e 25 70 20 61 73 20  reates %s.%p as 
20900 70 65 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20  peer\n",.       
20910 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65    pNew->zSelName
20920 2c 20 70 4e 65 77 29 29 3b 0a 20 20 20 20 7d 0a  , pNew));.    }.
20930 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
20940 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
20950 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  n 1;.  }..  /* B
20960 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20  egin flattening 
20970 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74  the iFrom-th ent
20980 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
20990 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74  lause .  ** in t
209a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
209b0 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53    */.  pSub = pS
209c0 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ub1 = pSubitem->
209d0 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44  pSelect;..  /* D
209e0 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69  elete the transi
209f0 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
20a00 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ure associated w
20a10 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
20a20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
20a30 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
20a40 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
20a50 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  se);.  sqlite3Db
20a60 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
20a70 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  m->zName);.  sql
20a80 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
20a90 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  Subitem->zAlias)
20aa0 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  ;.  pSubitem->zD
20ab0 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70  atabase = 0;.  p
20ac0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  Subitem->zName =
20ad0 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
20ae0 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53  zAlias = 0;.  pS
20af0 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ubitem->pSelect 
20b00 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72  = 0;..  /* Defer
20b10 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61   deleting the Ta
20b20 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ble object assoc
20b30 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
20b40 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74   ** subquery unt
20b50 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  il code generati
20b60 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c  on is.  ** compl
20b70 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ete, since there
20b80 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74   may still exist
20b90 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69   Expr.pTab entri
20ba0 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66  es that.  ** ref
20bb0 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  er to the subque
20bc0 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c  ry even after fl
20bd0 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65  attening.  Ticke
20be0 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20  t #3346..  **.  
20bf0 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  ** pSubitem->pTa
20c00 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d  b is always non-
20c10 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73  NULL by test res
20c20 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65  trictions and te
20c30 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a  sts above..  */.
20c40 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75    if( ALWAYS(pSu
20c50 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20  bitem->pTab!=0) 
20c60 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
20c70 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74  abToDel = pSubit
20c80 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
20c90 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61  ( pTabToDel->nTa
20ca0 62 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20  bRef==1 ){.     
20cb0 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
20cc0 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
20cd0 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
20ce0 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65  ;.      pTabToDe
20cf0 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d  l->pNextZombie =
20d00 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d   pToplevel->pZom
20d10 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54  bieTab;.      pT
20d20 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
20d30 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b  Tab = pTabToDel;
20d40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20d50 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61    pTabToDel->nTa
20d60 62 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  bRef--;.    }.  
20d70 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62    pSubitem->pTab
20d80 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
20d90 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f  The following lo
20da0 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  op runs once for
20db0 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20   each term in a 
20dc0 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
20dd0 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e  y.  ** flattenin
20de0 67 20 28 61 73 20 64 65 73 63 72 69 62 65 64 20  g (as described 
20df0 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61  above).  If we a
20e00 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65  re doing a diffe
20e10 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f  rent kind.  ** o
20e20 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61  f flattening - a
20e30 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65   flattening othe
20e40 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e  r than a compoun
20e50 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
20e60 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65  ening -.  ** the
20e70 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79  n this loop only
20e80 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a   runs once..  **
20e90 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
20ea0 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65  moves all of the
20eb0 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f   FROM elements o
20ec0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
20ed0 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  nto the.  ** the
20ee0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
20ef0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
20f00 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74    Before doing t
20f10 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20  his, remember.  
20f20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  ** the cursor nu
20f30 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69  mber for the ori
20f40 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72  ginal outer quer
20f50 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69  y FROM element i
20f60 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20  n.  ** iParent. 
20f70 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72   The iParent cur
20f80 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  sor will never b
20f90 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75  e used.  Subsequ
20fa0 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69  ent code.  ** wi
20fb0 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69  ll scan expressi
20fc0 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ons looking for 
20fd0 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63  iParent referenc
20fe0 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20  es and replace. 
20ff0 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65   ** those refere
21000 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73  nces with expres
21010 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c  sions that resol
21020 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  ve to the subque
21030 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65  ry FROM.  ** ele
21040 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77  ments we are now
21050 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a   copying in..  *
21060 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d  /.  for(pParent=
21070 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72  p; pParent; pPar
21080 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72  ent=pParent->pPr
21090 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e  ior, pSub=pSub->
210a0 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74  pPrior){.    int
210b0 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38   nSubSrc;.    u8
210c0 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
210d0 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75     pSubSrc = pSu
210e0 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  b->pSrc;     /* 
210f0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 73  FROM clause of s
21100 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e  ubquery */.    n
21110 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63  SubSrc = pSubSrc
21120 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62  ->nSrc;  /* Numb
21130 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73  er of terms in s
21140 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61  ubquery FROM cla
21150 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20  use */.    pSrc 
21160 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b  = pParent->pSrc;
21170 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
21180 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
21190 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69   query */..    i
211a0 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20  f( pSrc ){.     
211b0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
211c0 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74  ==p );  /* First
211d0 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68   time through th
211e0 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
211f0 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69  jointype = pSubi
21200 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
21210 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21220 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
21230 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64  nt!=p );  /* 2nd
21240 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
21250 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68  times through th
21260 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
21270 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e  pSrc = pParent->
21280 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
21290 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20  cListAppend(db, 
212a0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
212b0 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20  if( pSrc==0 ){. 
212c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64         assert( d
212d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
212e0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
212f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21300 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  .    /* The subq
21310 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e 67  uery uses a sing
21320 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46  le slot of the F
21330 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
21340 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71  e outer.    ** q
21350 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73 75  uery.  If the su
21360 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20  bquery has more 
21370 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74  than one element
21380 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61   in its FROM cla
21390 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  use,.    ** then
213a0 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65   expand the oute
213b0 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20  r query to make 
213c0 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20  space for it to 
213d0 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74  hold all element
213e0 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  s.    ** of the 
213f0 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a  subquery..    **
21400 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
21410 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
21420 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
21430 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20  tabA, (SELECT * 
21440 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29  FROM sub1, sub2)
21450 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20  , tabB;.    **. 
21460 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20     ** The outer 
21470 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74  query has 3 slot
21480 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  s in its FROM cl
21490 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20  ause.  One slot 
214a0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  of the.    ** ou
214b0 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20 6d  ter query (the m
214c0 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75  iddle slot) is u
214d0 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71 75  sed by the subqu
214e0 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20  ery.  The next. 
214f0 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63     ** block of c
21500 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  ode will expand 
21510 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
21520 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20 34  FROM clause to 4
21530 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54   slots..    ** T
21540 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 20 69  he middle slot i
21550 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77  s expanded to tw
21560 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72  o slots in order
21570 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 0a 20   to make space. 
21580 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 77     ** for the tw
21590 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  o elements in th
215a0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
215b0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
215c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53     */.    if( nS
215d0 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  ubSrc>1 ){.     
215e0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
215f0 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53   pSrc = sqlite3S
21600 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
21610 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d  , pSrc, nSubSrc-
21620 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20  1,iFrom+1);.    
21630 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
21640 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
21650 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
21660 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
21670 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d  ransfer the FROM
21680 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72   clause terms fr
21690 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20  om the subquery 
216a0 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
216b0 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
216c0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
216d0 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29   i<nSubSrc; i++)
216e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
216f0 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
21700 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
21710 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20  .pUsing);.      
21720 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b  assert( pSrc->a[
21730 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e 69 73 54 61  i+iFrom].fg.isTa
21740 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  bFunc==0 );.    
21750 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f    pSrc->a[i+iFro
21760 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b  m] = pSubSrc->a[
21770 69 5d 3b 0a 20 20 20 20 20 20 69 4e 65 77 50 61  i];.      iNewPa
21780 72 65 6e 74 20 3d 20 70 53 75 62 53 72 63 2d 3e  rent = pSubSrc->
21790 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[i].iCursor;.  
217a0 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
217b0 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
217c0 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
217d0 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
217e0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66  pSrc->a[iFrom].f
217f0 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  g.jointype = joi
21800 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a  ntype;.  .    /*
21810 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
21820 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
21830 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
21840 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20  essions for .   
21850 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
21860 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
21870 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
21880 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
21890 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
218a0 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
218b0 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
218c0 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
218d0 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
218e0 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
218f0 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20      **   \      
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
21910 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
21920 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
21930 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
21940 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f    **    \_______
21950 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
21960 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
21970 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21980 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a  _________/.    *
21990 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b  *.    ** We look
219a0 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
219b0 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
219c0 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
219d0 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
219e0 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62     ** "a" we sub
219f0 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
21a00 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
21a10 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
21a20 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
21a30 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
21a40 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
21a50 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
21a60 20 70 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d   point, any non-
21a70 7a 65 72 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c  zero iOrderByCol
21a80 20 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74 65   values indicate
21a90 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
21aa0 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 6c 75  ** ORDER BY colu
21ab0 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  mn expression is
21ac0 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68   identical to th
21ad0 65 20 69 4f 72 64 65 72 42 79 43 6f 6c 27 74 68  e iOrderByCol'th
21ae0 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
21af0 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 62 79  sion returned by
21b00 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
21b10 74 20 70 53 75 62 2e 20 53 69 6e 63 65 20 74 68  t pSub. Since th
21b20 65 73 65 20 76 61 6c 75 65 73 0a 20 20 20 20 20  ese values.     
21b30 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73   ** do not neces
21b40 73 61 72 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e  sarily correspon
21b50 64 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  d to columns in 
21b60 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
21b70 20 70 50 61 72 65 6e 74 2c 0a 20 20 20 20 20 20   pParent,.      
21b80 2a 2a 20 7a 65 72 6f 20 74 68 65 6d 20 62 65 66  ** zero them bef
21b90 6f 72 65 20 74 72 61 6e 73 66 65 72 69 6e 67 20  ore transfering 
21ba0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
21bb0 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  use..      **.  
21bc0 20 20 20 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67      ** Not doing
21bd0 20 74 68 69 73 20 6d 61 79 20 63 61 75 73 65 20   this may cause 
21be0 61 6e 20 65 72 72 6f 72 20 69 66 20 61 20 73 75  an error if a su
21bf0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f  bsequent call to
21c00 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66   this.      ** f
21c10 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
21c20 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 20 63 6f   to flatten a co
21c30 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
21c40 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 0a 20 20   into pParent.  
21c50 20 20 20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79      ** (the only
21c60 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
21c70 70 70 65 6e 20 69 73 20 69 66 20 74 68 65 20 63  ppen is if the c
21c80 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
21c90 79 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 75  y is.      ** cu
21ca0 72 72 65 6e 74 6c 79 20 70 61 72 74 20 6f 66 20  rrently part of 
21cb0 70 53 75 62 2d 3e 70 53 72 63 29 2e 20 53 65 65  pSub->pSrc). See
21cc0 20 74 69 63 6b 65 74 20 5b 64 31 31 61 36 65 39   ticket [d11a6e9
21cd0 30 38 66 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20  08f].  */.      
21ce0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
21cf0 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65  By = pSub->pOrde
21d00 72 42 79 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  rBy;.      for(i
21d10 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
21d20 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
21d30 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
21d40 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
21d50 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Col = 0;.      }
21d60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21d70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
21d80 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
21d90 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d  rent->pOrderBy =
21da0 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20   pOrderBy;.     
21db0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
21dc0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
21dd0 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
21de0 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  xprDup(db, pSub-
21df0 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20  >pWhere, 0);.   
21e00 20 69 66 28 20 69 73 4c 65 66 74 4a 6f 69 6e 3e   if( isLeftJoin>
21e10 30 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f  0 ){.      setJo
21e20 69 6e 45 78 70 72 28 70 57 68 65 72 65 2c 20 69  inExpr(pWhere, i
21e30 4e 65 77 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  NewParent);.    
21e40 7d 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70  }.    pParent->p
21e50 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
21e60 78 70 72 41 6e 64 28 64 62 2c 20 70 57 68 65 72  xprAnd(db, pWher
21e70 65 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65  e, pParent->pWhe
21e80 72 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  re);.    if( db-
21e90 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
21ea0 20 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43   ){.      SubstC
21eb0 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20  ontext x;.      
21ec0 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  x.pParse = pPars
21ed0 65 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c  e;.      x.iTabl
21ee0 65 20 3d 20 69 50 61 72 65 6e 74 3b 0a 20 20 20  e = iParent;.   
21ef0 20 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d     x.iNewTable =
21f00 20 69 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20   iNewParent;.   
21f10 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20     x.isLeftJoin 
21f20 3d 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20 20  = isLeftJoin;.  
21f30 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70      x.pEList = p
21f40 53 75 62 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  Sub->pEList;.   
21f50 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 26     substSelect(&
21f60 78 2c 20 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a  x, pParent, 0);.
21f70 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
21f80 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75  The flattened qu
21f90 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20  ery is distinct 
21fa0 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e  if either the in
21fb0 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ner or the.    *
21fc0 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  * outer query is
21fd0 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20   distinct. .    
21fe0 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  */.    pParent->
21ff0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62  selFlags |= pSub
22000 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
22010 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20  Distinct;.  .   
22020 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43   /*.    ** SELEC
22030 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45  T ... FROM (SELE
22040 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f  CT ... LIMIT a O
22050 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78  FFSET b) LIMIT x
22060 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a   OFFSET y;.    *
22070 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20  *.    ** One is 
22080 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74  tempted to try t
22090 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f  o add a and b to
220a0 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d   combine the lim
220b0 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20  its.  But this. 
220c0 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77     ** does not w
220d0 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69  ork if either li
220e0 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e  mit is negative.
220f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
22100 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  pSub->pLimit ){.
22110 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
22120 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c  Limit = pSub->pL
22130 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62  imit;.      pSub
22140 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
22150 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
22160 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77  nially, delete w
22170 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74  hat is left of t
22180 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
22190 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63  return.  ** succ
221a0 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
221b0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
221c0 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69 66  db, pSub1);..#if
221d0 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
221e0 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
221f0 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
22200 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45 4c  0x100 ){.    SEL
22210 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70  ECTTRACE(0x100,p
22220 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20  Parse,p,("After 
22230 66 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e 22 29 29  flattening:\n"))
22240 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
22250 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
22260 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
22270 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ..  return 1;.}.
22280 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
22290 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
222a0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
222b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
222c0 5f 56 49 45 57 29 20 2a 2f 0a 0a 0a 0a 23 69 66  _VIEW) */....#if
222d0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
222e0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
222f0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
22300 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
22310 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20  .** Make copies 
22320 6f 66 20 72 65 6c 65 76 61 6e 74 20 57 48 45 52  of relevant WHER
22330 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  E clause terms o
22340 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
22350 79 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 57 48  y into.** the WH
22360 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 73 75  ERE clause of su
22370 62 71 75 65 72 79 2e 20 20 45 78 61 6d 70 6c 65  bquery.  Example
22380 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
22390 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T * FROM (SELECT
223a0 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20   a AS x, c-d AS 
223b0 79 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45  y FROM t1) WHERE
223c0 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a   x=5 AND y=10;.*
223d0 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64  *.** Transformed
223e0 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   into:.**.**    
223f0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53  SELECT * FROM (S
22400 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d  ELECT a AS x, c-
22410 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 20 57  d AS y FROM t1 W
22420 48 45 52 45 20 61 3d 35 20 41 4e 44 20 63 2d 64  HERE a=5 AND c-d
22430 3d 31 30 29 0a 2a 2a 20 20 20 20 20 57 48 45 52  =10).**     WHER
22440 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a  E x=5 AND y=10;.
22450 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f 70 65 20 69  **.** The hope i
22460 73 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73  s that the terms
22470 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
22480 6e 65 72 20 71 75 65 72 79 20 77 69 6c 6c 20 6d  ner query will m
22490 61 6b 65 20 69 74 20 6d 6f 72 65 0a 2a 2a 20 65  ake it more.** e
224a0 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
224b0 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  Do not attempt t
224c0 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
224d0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29   if:.**.**   (1)
224e0 20 28 2a 2a 20 54 68 69 73 20 72 65 73 74 72 69   (** This restri
224f0 63 74 69 6f 6e 20 77 61 73 20 72 65 6d 6f 76 65  ction was remove
22500 64 20 6f 6e 20 32 30 31 37 2d 30 39 2d 32 39 2e  d on 2017-09-29.
22510 20 20 57 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20    We used to.** 
22520 20 20 20 20 20 20 20 20 20 20 64 69 73 61 6c 6c            disall
22530 6f 77 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  ow this optimiza
22540 74 69 6f 6e 20 66 6f 72 20 61 67 67 72 65 67 61  tion for aggrega
22550 74 65 20 73 75 62 71 75 65 72 69 65 73 2c 20 62  te subqueries, b
22560 75 74 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ut now.**       
22570 20 20 20 20 69 74 20 69 73 20 61 6c 6c 6f 77 65      it is allowe
22580 64 20 62 79 20 70 75 74 74 69 6e 67 20 74 68 65  d by putting the
22590 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20   extra terms on 
225a0 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
225b0 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e..**           
225c0 54 68 65 20 61 64 64 65 64 20 48 41 56 49 4e 47  The added HAVING
225d0 20 63 6c 61 75 73 65 20 69 73 20 70 6f 69 6e 74   clause is point
225e0 6c 65 73 73 20 69 66 20 74 68 65 20 73 75 62 71  less if the subq
225f0 75 65 72 79 20 6c 61 63 6b 73 0a 2a 2a 20 20 20  uery lacks.**   
22600 20 20 20 20 20 20 20 20 61 20 47 52 4f 55 50 20          a GROUP 
22610 42 59 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20  BY clause.  But 
22620 73 75 63 68 20 61 20 48 41 56 49 4e 47 20 63 6c  such a HAVING cl
22630 61 75 73 65 20 69 73 20 61 6c 73 6f 20 68 61 72  ause is also har
22640 6d 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20  mless.**        
22650 20 20 20 73 6f 20 74 68 65 72 65 20 64 6f 65 73     so there does
22660 20 6e 6f 74 20 61 70 70 65 61 72 20 74 6f 20 62   not appear to b
22670 65 20 61 6e 79 20 72 65 61 73 6f 6e 20 74 6f 20  e any reason to 
22680 61 64 64 20 65 78 74 72 61 20 6c 6f 67 69 63 0a  add extra logic.
22690 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74 6f 20  **           to 
226a0 73 75 70 70 72 65 73 73 20 69 74 2e 20 2a 2a 29  suppress it. **)
226b0 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54 68 65  .**.**   (2) The
226c0 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20   inner query is 
226d0 74 68 65 20 72 65 63 75 72 73 69 76 65 20 70 61  the recursive pa
226e0 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20 74  rt of a common t
226f0 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e  able expression.
22700 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54 68 65  .**.**   (3) The
22710 20 69 6e 6e 65 72 20 71 75 65 72 79 20 68 61 73   inner query has
22720 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20   a LIMIT clause 
22730 28 73 69 6e 63 65 20 74 68 65 20 63 68 61 6e 67  (since the chang
22740 65 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a  es to the WHERE.
22750 2a 2a 20 20 20 20 20 20 20 63 6c 6f 73 65 20 77  **       close w
22760 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65 20  ould change the 
22770 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 4c  meaning of the L
22780 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  IMIT)..**.**   (
22790 34 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  4) The inner que
227a0 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
227b0 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46  operand of a LEF
227c0 54 20 4a 4f 49 4e 20 61 6e 64 20 74 68 65 0a 2a  T JOIN and the.*
227d0 2a 20 20 20 20 20 20 20 65 78 70 72 65 73 73 69  *       expressi
227e0 6f 6e 20 74 6f 20 62 65 20 70 75 73 68 65 64 20  on to be pushed 
227f0 64 6f 77 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f  down does not co
22800 6d 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63  me from the ON c
22810 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f  lause.**       o
22820 6e 20 74 68 61 74 20 4c 45 46 54 20 4a 4f 49 4e  n that LEFT JOIN
22830 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68  ..**.**   (5) Th
22840 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65  e WHERE clause e
22850 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e  xpression origin
22860 61 74 65 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ates in the ON o
22870 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a  r USING clause.*
22880 2a 20 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46  *       of a LEF
22890 54 20 4a 4f 49 4e 20 77 68 65 72 65 20 69 43 75  T JOIN where iCu
228a0 72 73 6f 72 20 69 73 20 6e 6f 74 20 74 68 65 20  rsor is not the 
228b0 72 69 67 68 74 2d 68 61 6e 64 20 74 61 62 6c 65  right-hand table
228c0 20 6f 66 20 74 68 61 74 0a 2a 2a 20 20 20 20 20   of that.**     
228d0 20 20 6c 65 66 74 20 6a 6f 69 6e 2e 20 20 41 6e    left join.  An
228e0 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
228f0 20 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54            SELECT
22900 20 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   *.**           
22910 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 31 20 41  FROM (SELECT 1 A
22920 53 20 61 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  S a1 UNION ALL S
22930 45 4c 45 43 54 20 32 29 20 41 53 20 61 61 0a 2a  ELECT 2) AS aa.*
22940 2a 20 20 20 20 20 20 20 20 20 20 20 4a 4f 49 4e  *           JOIN
22950 20 28 53 45 4c 45 43 54 20 31 20 41 53 20 62 32   (SELECT 1 AS b2
22960 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
22970 54 20 32 29 20 41 53 20 62 62 20 4f 4e 20 28 61  T 2) AS bb ON (a
22980 31 3d 62 32 29 0a 2a 2a 20 20 20 20 20 20 20 20  1=b2).**        
22990 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 28 53 45     LEFT JOIN (SE
229a0 4c 45 43 54 20 38 20 41 53 20 63 33 20 55 4e 49  LECT 8 AS c3 UNI
229b0 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 39 29  ON ALL SELECT 9)
229c0 20 41 53 20 63 63 20 4f 4e 20 28 62 32 3d 32 29   AS cc ON (b2=2)
229d0 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 54 68  ;.**.**       Th
229e0 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
229f0 20 69 73 20 74 68 72 65 65 20 72 6f 77 73 3a 20   is three rows: 
22a00 20 28 31 2c 31 2c 4e 55 4c 4c 29 2c 28 32 2c 32   (1,1,NULL),(2,2
22a10 2c 38 29 2c 28 32 2c 32 2c 39 29 2e 0a 2a 2a 20  ,8),(2,2,9)..** 
22a20 20 20 20 20 20 20 42 75 74 20 69 66 20 74 68 65        But if the
22a30 20 28 62 32 3d 32 29 20 74 65 72 6d 20 77 65 72   (b2=2) term wer
22a40 65 20 74 6f 20 62 65 20 70 75 73 68 65 64 20 64  e to be pushed d
22a50 6f 77 6e 20 69 6e 74 6f 20 74 68 65 20 62 62 20  own into the bb 
22a60 73 75 62 71 75 65 72 79 2c 0a 2a 2a 20 20 20 20  subquery,.**    
22a70 20 20 20 74 68 65 6e 20 74 68 65 20 28 31 2c 31     then the (1,1
22a80 2c 4e 55 4c 4c 29 20 72 6f 77 20 77 6f 75 6c 64  ,NULL) row would
22a90 20 62 65 20 73 75 70 70 72 65 73 73 65 64 2e 0a   be suppressed..
22aa0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69  **.** Return 0 i
22ab0 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  f no changes are
22ac0 20 6d 61 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65   made and non-ze
22ad0 72 6f 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ro if one or mor
22ae0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a  e WHERE clause.*
22af0 2a 20 74 65 72 6d 73 20 61 72 65 20 64 75 70 6c  * terms are dupl
22b00 69 63 61 74 65 64 20 69 6e 74 6f 20 74 68 65 20  icated into the 
22b10 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61  subquery..*/.sta
22b20 74 69 63 20 69 6e 74 20 70 75 73 68 44 6f 77 6e  tic int pushDown
22b30 57 68 65 72 65 54 65 72 6d 73 28 0a 20 20 50 61  WhereTerms(.  Pa
22b40 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
22b50 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
22b60 74 65 78 74 20 28 66 6f 72 20 6d 61 6c 6c 6f 63  text (for malloc
22b70 28 29 20 61 6e 64 20 65 72 72 6f 72 20 72 65 70  () and error rep
22b80 6f 72 74 69 6e 67 29 20 2a 2f 0a 20 20 53 65 6c  orting) */.  Sel
22b90 65 63 74 20 2a 70 53 75 62 71 2c 20 20 20 20 20  ect *pSubq,     
22ba0 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
22bb0 72 79 20 77 68 6f 73 65 20 57 48 45 52 45 20 63  ry whose WHERE c
22bc0 6c 61 75 73 65 20 69 73 20 74 6f 20 62 65 20 61  lause is to be a
22bd0 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78  ugmented */.  Ex
22be0 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
22bf0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
22c00 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
22c10 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
22c20 69 6e 74 20 69 43 75 72 73 6f 72 2c 20 20 20 20  int iCursor,    
22c30 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
22c40 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 73 75  number of the su
22c50 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  bquery */.  int 
22c60 69 73 4c 65 66 74 4a 6f 69 6e 20 20 20 20 20 20  isLeftJoin      
22c70 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 53 75    /* True if pSu
22c80 62 71 20 69 73 20 74 68 65 20 72 69 67 68 74 20  bq is the right 
22c90 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a  term of a LEFT J
22ca0 4f 49 4e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  OIN */.){.  Expr
22cb0 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43   *pNew;.  int nC
22cc0 68 6e 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  hng = 0;.  if( p
22cd0 57 68 65 72 65 3d 3d 30 20 29 20 72 65 74 75 72  Where==0 ) retur
22ce0 6e 20 30 3b 0a 20 20 69 66 28 20 70 53 75 62 71  n 0;.  if( pSubq
22cf0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
22d00 52 65 63 75 72 73 69 76 65 20 29 20 72 65 74 75  Recursive ) retu
22d10 72 6e 20 30 3b 20 20 2f 2a 20 72 65 73 74 72 69  rn 0;  /* restri
22d20 63 74 69 6f 6e 20 28 32 29 20 2a 2f 0a 0a 23 69  ction (2) */..#i
22d30 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
22d40 47 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20  G.  /* Only the 
22d50 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 61 20  first term of a 
22d60 63 6f 6d 70 6f 75 6e 64 20 63 61 6e 20 68 61 76  compound can hav
22d70 65 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 2e  e a WITH clause.
22d80 20 20 42 75 74 20 6d 61 6b 65 0a 20 20 2a 2a 20    But make.  ** 
22d90 73 75 72 65 20 6e 6f 20 6f 74 68 65 72 20 74 65  sure no other te
22da0 72 6d 73 20 61 72 65 20 6d 61 72 6b 65 64 20 53  rms are marked S
22db0 46 5f 52 65 63 75 72 73 69 76 65 20 69 6e 20 63  F_Recursive in c
22dc0 61 73 65 20 73 6f 6d 65 74 68 69 6e 67 20 63 68  ase something ch
22dd0 61 6e 67 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68  anges.  ** in th
22de0 65 20 66 75 74 75 72 65 2e 0a 20 20 2a 2f 0a 20  e future..  */. 
22df0 20 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70   {.    Select *p
22e00 58 3b 20 20 0a 20 20 20 20 66 6f 72 28 70 58 3d  X;  .    for(pX=
22e10 70 53 75 62 71 3b 20 70 58 3b 20 70 58 3d 70 58  pSubq; pX; pX=pX
22e20 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
22e30 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 73 65   assert( (pX->se
22e40 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63  lFlags & (SF_Rec
22e50 75 72 73 69 76 65 29 29 3d 3d 30 20 29 3b 0a 20  ursive))==0 );. 
22e60 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
22e70 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e 70 4c  .  if( pSubq->pL
22e80 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20 20 20 72  imit!=0 ){.    r
22e90 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74  eturn 0; /* rest
22ea0 72 69 63 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20  riction (3) */. 
22eb0 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65   }.  while( pWhe
22ec0 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  re->op==TK_AND )
22ed0 7b 0a 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20 70  {.    nChng += p
22ee0 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d  ushDownWhereTerm
22ef0 73 28 70 50 61 72 73 65 2c 20 70 53 75 62 71 2c  s(pParse, pSubq,
22f00 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74 2c   pWhere->pRight,
22f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f30 20 69 43 75 72 73 6f 72 2c 20 69 73 4c 65 66 74   iCursor, isLeft
22f40 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 57 68 65 72  Join);.    pWher
22f50 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 4c 65 66  e = pWhere->pLef
22f60 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4c  t;.  }.  if( isL
22f70 65 66 74 4a 6f 69 6e 0a 20 20 20 26 26 20 28 45  eftJoin.   && (E
22f80 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
22f90 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69  Where,EP_FromJoi
22fa0 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c  n)==0.         |
22fb0 7c 20 70 57 68 65 72 65 2d 3e 69 52 69 67 68 74  | pWhere->iRight
22fc0 4a 6f 69 6e 54 61 62 6c 65 21 3d 69 43 75 72 73  JoinTable!=iCurs
22fd0 6f 72 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  or).  ){.    ret
22fe0 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69  urn 0; /* restri
22ff0 63 74 69 6f 6e 20 28 34 29 20 2a 2f 0a 20 20 7d  ction (4) */.  }
23000 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
23010 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c 45 50  operty(pWhere,EP
23020 5f 46 72 6f 6d 4a 6f 69 6e 29 20 26 26 20 70 57  _FromJoin) && pW
23030 68 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  here->iRightJoin
23040 54 61 62 6c 65 21 3d 69 43 75 72 73 6f 72 20 29  Table!=iCursor )
23050 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
23060 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  /* restriction (
23070 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  5) */.  }.  if( 
23080 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
23090 6c 65 43 6f 6e 73 74 61 6e 74 28 70 57 68 65 72  leConstant(pWher
230a0 65 2c 20 69 43 75 72 73 6f 72 29 20 29 7b 0a 20  e, iCursor) ){. 
230b0 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20     nChng++;.    
230c0 77 68 69 6c 65 28 20 70 53 75 62 71 20 29 7b 0a  while( pSubq ){.
230d0 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e 74 65        SubstConte
230e0 78 74 20 78 3b 0a 20 20 20 20 20 20 70 4e 65 77  xt x;.      pNew
230f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
23100 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57  p(pParse->db, pW
23110 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  here, 0);.      
23120 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 4e  unsetJoinExpr(pN
23130 65 77 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 78  ew, -1);.      x
23140 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
23150 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65  ;.      x.iTable
23160 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20   = iCursor;.    
23170 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20    x.iNewTable = 
23180 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78  iCursor;.      x
23190 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b  .isLeftJoin = 0;
231a0 0a 20 20 20 20 20 20 78 2e 70 45 4c 69 73 74 20  .      x.pEList 
231b0 3d 20 70 53 75 62 71 2d 3e 70 45 4c 69 73 74 3b  = pSubq->pEList;
231c0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 75  .      pNew = su
231d0 62 73 74 45 78 70 72 28 26 78 2c 20 70 4e 65 77  bstExpr(&x, pNew
231e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 75  );.      if( pSu
231f0 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  bq->selFlags & S
23200 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20  F_Aggregate ){. 
23210 20 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70 48         pSubq->pH
23220 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
23230 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
23240 62 2c 20 70 53 75 62 71 2d 3e 70 48 61 76 69 6e  b, pSubq->pHavin
23250 67 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  g, pNew);.      
23260 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
23270 53 75 62 71 2d 3e 70 57 68 65 72 65 20 3d 20 73  Subq->pWhere = s
23280 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
23290 61 72 73 65 2d 3e 64 62 2c 20 70 53 75 62 71 2d  arse->db, pSubq-
232a0 3e 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a  >pWhere, pNew);.
232b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
232c0 75 62 71 20 3d 20 70 53 75 62 71 2d 3e 70 50 72  ubq = pSubq->pPr
232d0 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ior;.    }.  }. 
232e0 20 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d   return nChng;.}
232f0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
23300 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
23310 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
23320 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
23330 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a  T_VIEW) */../*.*
23340 2a 20 54 68 65 20 70 46 75 6e 63 20 69 73 20 74  * The pFunc is t
23350 68 65 20 6f 6e 6c 79 20 61 67 67 72 65 67 61 74  he only aggregat
23360 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68  e function in th
23370 65 20 71 75 65 72 79 2e 20 20 43 68 65 63 6b 20  e query.  Check 
23380 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20 74 68 65  to see.** if the
23390 20 71 75 65 72 79 20 69 73 20 61 20 63 61 6e 64   query is a cand
233a0 69 64 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69  idate for the mi
233b0 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69  n/max optimizati
233c0 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  on. .**.** If th
233d0 65 20 71 75 65 72 79 20 69 73 20 61 20 63 61 6e  e query is a can
233e0 64 69 64 61 74 65 20 66 6f 72 20 74 68 65 20 6d  didate for the m
233f0 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74  in/max optimizat
23400 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a  ion, then set.**
23410 20 2a 70 70 4d 69 6e 4d 61 78 20 74 6f 20 62 65   *ppMinMax to be
23420 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
23430 75 73 65 20 74 6f 20 62 65 20 75 73 65 64 20 66  use to be used f
23440 6f 72 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  or the optimizat
23450 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  ion.** and retur
23460 6e 20 65 69 74 68 65 72 20 57 48 45 52 45 5f 4f  n either WHERE_O
23470 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48  RDERBY_MIN or WH
23480 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 20  ERE_ORDERBY_MAX 
23490 64 65 70 65 6e 64 69 6e 67 20 6f 6e 0a 2a 2a 20  depending on.** 
234a0 77 68 65 74 68 65 72 20 70 46 75 6e 63 20 69 73  whether pFunc is
234b0 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28   a min() or max(
234c0 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ) function..**.*
234d0 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  * If the query i
234e0 73 20 6e 6f 74 20 61 20 63 61 6e 64 69 64 61 74  s not a candidat
234f0 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61  e for the min/ma
23500 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  x optimization, 
23510 72 65 74 75 72 6e 0a 2a 2a 20 57 48 45 52 45 5f  return.** WHERE_
23520 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 28  ORDERBY_NORMAL (
23530 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 7a 65  which must be ze
23540 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ro)..**.** This 
23550 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20  routine must be 
23560 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 67 67  called after agg
23570 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
23580 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 6c 6f   have been.** lo
23590 63 61 74 65 64 20 62 75 74 20 62 65 66 6f 72 65  cated but before
235a0 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73   their arguments
235b0 20 68 61 76 65 20 62 65 65 6e 20 73 75 62 6a 65   have been subje
235c0 63 74 65 64 20 74 6f 20 61 67 67 72 65 67 61 74  cted to aggregat
235d0 65 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2e 0a 2a  e.** analysis..*
235e0 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d  /.static u8 minM
235f0 61 78 51 75 65 72 79 28 73 71 6c 69 74 65 33 20  axQuery(sqlite3 
23600 2a 64 62 2c 20 45 78 70 72 20 2a 70 46 75 6e 63  *db, Expr *pFunc
23610 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d  , ExprList **ppM
23620 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52  inMax){.  int eR
23630 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
23640 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20  BY_NORMAL;      
23650 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
23660 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
23670 45 4c 69 73 74 20 3d 20 70 46 75 6e 63 2d 3e 78  EList = pFunc->x
23680 2e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 41 72  .pList;    /* Ar
23690 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66  guments to agg f
236a0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  unction */.  con
236b0 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 3b 20  st char *zFunc; 
236c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236d0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 67     /* Name of ag
236e0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
236f0 20 70 46 75 6e 63 20 2a 2f 0a 20 20 45 78 70 72   pFunc */.  Expr
23700 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 0a  List *pOrderBy;.
23710 20 20 75 38 20 73 6f 72 74 4f 72 64 65 72 3b 0a    u8 sortOrder;.
23720 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d 69  .  assert( *ppMi
23730 6e 4d 61 78 3d 3d 30 20 29 3b 0a 20 20 61 73 73  nMax==0 );.  ass
23740 65 72 74 28 20 70 46 75 6e 63 2d 3e 6f 70 3d 3d  ert( pFunc->op==
23750 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
23760 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d  );.  if( pEList=
23770 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45  =0 || pEList->nE
23780 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
23790 65 52 65 74 3b 0a 20 20 7a 46 75 6e 63 20 3d 20  eRet;.  zFunc = 
237a0 70 46 75 6e 63 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pFunc->u.zToken;
237b0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
237c0 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69  rICmp(zFunc, "mi
237d0 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 52  n")==0 ){.    eR
237e0 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
237f0 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 73 6f 72 74  BY_MIN;.    sort
23800 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53  Order = SQLITE_S
23810 4f 5f 41 53 43 3b 0a 20 20 7d 65 6c 73 65 20 69  O_ASC;.  }else i
23820 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
23830 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d  p(zFunc, "max")=
23840 3d 30 20 29 7b 0a 20 20 20 20 65 52 65 74 20 3d  =0 ){.    eRet =
23850 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
23860 41 58 3b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65  AX;.    sortOrde
23870 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45  r = SQLITE_SO_DE
23880 53 43 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  SC;.  }else{.   
23890 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 20 20   return eRet;.  
238a0 7d 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20  }.  *ppMinMax = 
238b0 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
238c0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
238d0 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20  , pEList, 0);.  
238e0 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
238f0 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
23900 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
23910 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64   pOrderBy ) pOrd
23920 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  erBy->a[0].sortO
23930 72 64 65 72 20 3d 20 73 6f 72 74 4f 72 64 65 72  rder = sortOrder
23940 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b  ;.  return eRet;
23950 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
23960 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70  lect statement p
23970 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
23980 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
23990 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
239a0 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  y..** The second
239b0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
239c0 20 61 73 73 6f 63 69 61 74 65 64 20 61 67 67 72   associated aggr
239d0 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63  egate-info objec
239e0 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  t. This .** func
239f0 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68  tion tests if th
23a00 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74  e SELECT is of t
23a10 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
23a20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
23a30 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a   FROM <tbl>.**.*
23a40 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20 69 73  * where table is
23a50 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
23a60 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c  e, not a sub-sel
23a70 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20  ect or view. If 
23a80 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65  the query.** doe
23a90 73 20 6d 61 74 63 68 20 74 68 69 73 20 70 61 74  s match this pat
23aa0 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69  tern, then a poi
23ab0 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c  nter to the Tabl
23ac0 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65  e object represe
23ad0 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69  nting.** <tbl> i
23ae0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
23af0 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
23b00 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
23b10 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43  Table *isSimpleC
23b20 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  ount(Select *p, 
23b30 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
23b40 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  o){.  Table *pTa
23b50 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  b;.  Expr *pExpr
23b60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d  ;..  assert( !p-
23b70 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20  >pGroupBy );..  
23b80 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c  if( p->pWhere ||
23b90 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
23ba0 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70  r!=1 .   || p->p
23bb0 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20  Src->nSrc!=1 || 
23bc0 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
23bd0 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72  elect.  ){.    r
23be0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
23bf0 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
23c00 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70  [0].pTab;.  pExp
23c10 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
23c20 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73  [0].pExpr;.  ass
23c30 65 72 74 28 20 70 54 61 62 20 26 26 20 21 70 54  ert( pTab && !pT
23c40 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70  ab->pSelect && p
23c50 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49  Expr );..  if( I
23c60 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
23c70 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
23c80 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
23c90 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65  GG_FUNCTION ) re
23ca0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45  turn 0;.  if( NE
23cb0 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  VER(pAggInfo->nF
23cc0 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  unc==0) ) return
23cd0 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49   0;.  if( (pAggI
23ce0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46  nfo->aFunc[0].pF
23cf0 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53  unc->funcFlags&S
23d00 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54  QLITE_FUNC_COUNT
23d10 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
23d20 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
23d30 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20  ags&EP_Distinct 
23d40 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72  ) return 0;..  r
23d50 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f  eturn pTab;.}../
23d60 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72  *.** If the sour
23d70 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73  ce-list item pas
23d80 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
23d90 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64  nt was augmented
23da0 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45   with an.** INDE
23db0 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74  XED BY clause, t
23dc0 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74  hen try to locat
23dd0 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
23de0 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a  index. If there.
23df0 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20 63 6c  ** was such a cl
23e00 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d  ause and the nam
23e10 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20  ed index cannot 
23e20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  be found, return
23e30 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f   .** SQLITE_ERRO
23e40 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65  R and leave an e
23e50 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20  rror in pParse. 
23e60 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c  Otherwise, popul
23e70 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70  ate .** pFrom->p
23e80 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e  Index and return
23e90 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
23ea0 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65  nt sqlite3Indexe
23eb0 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20  dByLookup(Parse 
23ec0 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20  *pParse, struct 
23ed0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
23ee0 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f  rom){.  if( pFro
23ef0 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d  m->pTab && pFrom
23f00 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
23f10 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
23f20 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
23f30 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e  b;.    char *zIn
23f40 64 65 78 65 64 42 79 20 3d 20 70 46 72 6f 6d 2d  dexedBy = pFrom-
23f50 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 3b 0a  >u1.zIndexedBy;.
23f60 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
23f70 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
23f80 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20  ab->pIndex; .   
23f90 20 20 20 20 20 70 49 64 78 20 26 26 20 73 71 6c       pIdx && sql
23fa0 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 64 78  ite3StrICmp(pIdx
23fb0 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 65  ->zName, zIndexe
23fc0 64 42 79 29 3b 20 0a 20 20 20 20 20 20 20 20 70  dBy); .        p
23fd0 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a  Idx=pIdx->pNext.
23fe0 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
23ff0 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71  pIdx ){.      sq
24000 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
24010 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
24020 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65  ndex: %s", zInde
24030 78 65 64 42 79 2c 20 30 29 3b 0a 20 20 20 20 20  xedBy, 0);.     
24040 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
24050 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20  hema = 1;.      
24060 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
24070 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
24080 46 72 6f 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d  From->pIBIndex =
24090 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74   pIdx;.  }.  ret
240a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
240b0 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f  ./*.** Detect co
240c0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
240d0 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75 73  atements that us
240e0 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
240f0 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e  ause with .** an
24100 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c   alternative col
24110 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
24120 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
24130 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43   ... FROM t1 EXC
24140 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46  EPT SELECT ... F
24150 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20  ROM t2 ORDER BY 
24160 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a  .. COLLATE ....*
24170 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 72  *.** These are r
24180 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 73 75  ewritten as a su
24190 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20  bquery:.**.**   
241a0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
241b0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
241c0 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54  t1 EXCEPT SELECT
241d0 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a   ... FROM t2).**
241e0 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 2e 2e       ORDER BY ..
241f0 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a  . COLLATE ....**
24200 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f  .** This transfo
24210 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73  rmation is neces
24220 73 61 72 79 20 62 65 63 61 75 73 65 20 74 68 65  sary because the
24230 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
24240 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  rBy() routine.**
24250 20 61 62 6f 76 65 20 74 68 61 74 20 67 65 6e 65   above that gene
24260 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66  rates the code f
24270 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  or a compound SE
24280 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44  LECT with an ORD
24290 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20  ER BY clause.** 
242a0 75 73 65 73 20 61 20 6d 65 72 67 65 20 61 6c 67  uses a merge alg
242b0 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65 71 75  orithm that requ
242c0 69 72 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f  ires the same co
242d0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
242e0 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c   on the.** resul
242f0 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20  t columns as on 
24300 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
24310 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b 65 74  use.  See ticket
24320 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73  .** http://www.s
24330 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e  qlite.org/src/in
24340 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a 2a 2a  fo/6709574d2a.**
24350 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f  .** This transfo
24360 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  rmation is only 
24370 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43 45 50  needed for EXCEP
24380 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20 61 6e  T, INTERSECT, an
24390 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20  d UNION..** The 
243a0 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
243b0 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20 77 69  or works fine wi
243c0 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  th multiSelectOr
243d0 64 65 72 42 79 28 29 20 65 76 65 6e 20 77 68 65  derBy() even whe
243e0 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20 43  n.** there are C
243f0 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69 6e 20  OLLATE terms in 
24400 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f  the ORDER BY..*/
24410 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 76  .static int conv
24420 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63  ertCompoundSelec
24430 74 54 6f 53 75 62 71 75 65 72 79 28 57 61 6c 6b  tToSubquery(Walk
24440 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
24450 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ect *p){.  int i
24460 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  ;.  Select *pNew
24470 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a  ;.  Select *pX;.
24480 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
24490 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
244a0 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c  _item *a;.  SrcL
244b0 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20  ist *pNewSrc;.  
244c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
244d0 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20   Token dummy;.. 
244e0 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d   if( p->pPrior==
244f0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
24500 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 70  ontinue;.  if( p
24510 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ->pOrderBy==0 ) 
24520 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
24530 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b  nue;.  for(pX=p;
24540 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d   pX && (pX->op==
24550 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70  TK_ALL || pX->op
24560 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58  ==TK_SELECT); pX
24570 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20  =pX->pPrior){}. 
24580 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72 65 74   if( pX==0 ) ret
24590 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
245a0 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65  ;.  a = p->pOrde
245b0 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  rBy->a;.  for(i=
245c0 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
245d0 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  pr-1; i>=0; i--)
245e0 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 70  {.    if( a[i].p
245f0 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
24600 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65 61 6b  _Collate ) break
24610 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 30 20  ;.  }.  if( i<0 
24620 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
24630 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  tinue;..  /* If 
24640 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
24650 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  int, that means 
24660 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  the transformati
24670 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  on is required. 
24680 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
24690 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
246a0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
246b0 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
246c0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
246d0 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
246e0 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
246f0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
24700 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28  Abort;.  memset(
24710 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f  &dummy, 0, sizeo
24720 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65  f(dummy));.  pNe
24730 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  wSrc = sqlite3Sr
24740 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
24750 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30  erm(pParse,0,0,0
24760 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30  ,&dummy,pNew,0,0
24770 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53 72 63  );.  if( pNewSrc
24780 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
24790 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20  _Abort;.  *pNew 
247a0 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20  = *p;.  p->pSrc 
247b0 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e  = pNewSrc;.  p->
247c0 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
247d0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
247e0 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65  Parse, 0, sqlite
247f0 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 53 54  3Expr(db, TK_AST
24800 45 52 49 53 4b 2c 20 30 29 29 3b 0a 20 20 70 2d  ERISK, 0));.  p-
24810 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b  >op = TK_SELECT;
24820 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30  .  p->pWhere = 0
24830 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70  ;.  pNew->pGroup
24840 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  By = 0;.  pNew->
24850 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70  pHaving = 0;.  p
24860 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
24870 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  0;.  p->pPrior =
24880 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d   0;.  p->pNext =
24890 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74 68 20 3d   0;.  p->pWith =
248a0 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   0;.  p->selFlag
248b0 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e  s &= ~SF_Compoun
248c0 64 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  d;.  assert( (p-
248d0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43  >selFlags & SF_C
248e0 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20 29 3b 0a  onverted)==0 );.
248f0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
24900 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 3b 0a 20   SF_Converted;. 
24910 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
24920 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e  Prior!=0 );.  pN
24930 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ew->pPrior->pNex
24940 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77  t = pNew;.  pNew
24950 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
24960 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
24970 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  nue;.}../*.** Ch
24980 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
24990 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
249a0 72 6d 20 70 46 72 6f 6d 20 68 61 73 20 74 61 62  rm pFrom has tab
249b0 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69  le-valued functi
249c0 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e  on.** arguments.
249d0 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20 6c 65    If it does, le
249e0 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
249f0 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 20 61  sage in pParse a
24a00 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  nd return.** non
24a10 2d 7a 65 72 6f 2c 20 73 69 6e 63 65 20 70 46 72  -zero, since pFr
24a20 6f 6d 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  om is not allowe
24a30 64 20 74 6f 20 62 65 20 61 20 74 61 62 6c 65 2d  d to be a table-
24a40 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 2e  valued function.
24a50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
24a60 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28  annotBeFunction(
24a70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73  Parse *pParse, s
24a80 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
24a90 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66  em *pFrom){.  if
24aa0 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 54 61  ( pFrom->fg.isTa
24ab0 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c  bFunc ){.    sql
24ac0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
24ad0 72 73 65 2c 20 22 27 25 73 27 20 69 73 20 6e 6f  rse, "'%s' is no
24ae0 74 20 61 20 66 75 6e 63 74 69 6f 6e 22 2c 20 70  t a function", p
24af0 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  From->zName);.  
24b00 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
24b10 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23    return 0;.}..#
24b20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
24b30 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67  IT_CTE./*.** Arg
24b40 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77 68 69  ument pWith (whi
24b50 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  ch may be NULL) 
24b60 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b  points to a link
24b70 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73 74 65  ed list of neste
24b80 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65  d .** WITH conte
24b90 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20  xts, from inner 
24ba0 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66  to outermost. If
24bb0 20 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74   the table ident
24bc0 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f  ified by .** FRO
24bd0 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
24be0 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c 6c 79   pItem is really
24bf0 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d   a common-table-
24c00 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54 45 29  expression (CTE)
24c10 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e   .** then return
24c20 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
24c30 65 20 43 54 45 20 64 65 66 69 6e 69 74 69 6f 6e  e CTE definition
24c40 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e   for that table.
24c50 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 72 65   Otherwise.** re
24c60 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
24c70 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   If a non-NULL v
24c80 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64  alue is returned
24c90 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65 78 74  , set *ppContext
24ca0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
24cb0 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20   With.** object 
24cc0 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 65  that the returne
24cd0 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f  d CTE belongs to
24ce0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
24cf0 63 74 20 43 74 65 20 2a 73 65 61 72 63 68 57 69  ct Cte *searchWi
24d00 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57 69 74  th(.  With *pWit
24d10 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
24d20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
24d30 20 69 6e 6e 65 72 6d 6f 73 74 20 57 49 54 48 20   innermost WITH 
24d40 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
24d50 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
24d60 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46  *pItem,     /* F
24d70 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
24d80 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f  nt to resolve */
24d90 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74  .  With **ppCont
24da0 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
24db0 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20     /* OUT: WITH 
24dc0 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20 76 61  clause return va
24dd0 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  lue belongs to *
24de0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
24df0 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20  r *zName;.  if( 
24e00 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
24e10 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20  ==0 && (zName = 
24e20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30  pItem->zName)!=0
24e30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 3b   ){.    With *p;
24e40 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69 74 68  .    for(p=pWith
24e50 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72  ; p; p=p->pOuter
24e60 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
24e70 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
24e80 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  <p->nCte; i++){.
24e90 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
24ea0 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65  te3StrICmp(zName
24eb0 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  , p->a[i].zName)
24ec0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
24ed0 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b   *ppContext = p;
24ee0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
24ef0 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  n &p->a[i];.    
24f00 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
24f10 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
24f20 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f   0;.}../* The co
24f30 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d 61 69  de generator mai
24f40 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b 20 6f  ntains a stack o
24f50 66 20 61 63 74 69 76 65 20 57 49 54 48 20 63 6c  f active WITH cl
24f60 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20 74 68  auses.** with th
24f70 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54  e inner-most WIT
24f80 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67 20 61  H clause being a
24f90 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  t the top of the
24fa0 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68   stack..**.** Th
24fb0 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73 68 65  is routine pushe
24fc0 73 20 74 68 65 20 57 49 54 48 20 63 6c 61 75 73  s the WITH claus
24fd0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
24fe0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
24ff0 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20  ** onto the top 
25000 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66  of the stack. If
25010 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65 65 20   argument bFree 
25020 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
25030 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73  is.** WITH claus
25040 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  e will never be 
25050 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  popped from the 
25060 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63  stack. In this c
25070 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64  ase it.** should
25080 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20   be freed along 
25090 77 69 74 68 20 74 68 65 20 50 61 72 73 65 20 6f  with the Parse o
250a0 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65 72 20  bject. In other 
250b0 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62  cases, when.** b
250c0 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57 69 74  Free==0, the Wit
250d0 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65  h object will be
250e0 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74   freed along wit
250f0 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a  h the SELECT .**
25100 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20   statement with 
25110 77 68 69 63 68 20 69 74 20 69 73 20 61 73 73 6f  which it is asso
25120 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ciated..*/.void 
25130 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28  sqlite3WithPush(
25140 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57  Parse *pParse, W
25150 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38 20 62  ith *pWith, u8 b
25160 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Free){.  assert(
25170 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 28 70 50   bFree==0 || (pP
25180 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20 26  arse->pWith==0 &
25190 26 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54  & pParse->pWithT
251a0 6f 46 72 65 65 3d 3d 30 29 20 29 3b 0a 20 20 69  oFree==0) );.  i
251b0 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20  f( pWith ){.    
251c0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
251d0 70 57 69 74 68 21 3d 70 57 69 74 68 20 29 3b 0a  pWith!=pWith );.
251e0 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75 74 65      pWith->pOute
251f0 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74  r = pParse->pWit
25200 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  h;.    pParse->p
25210 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20  With = pWith;.  
25220 20 20 69 66 28 20 62 46 72 65 65 20 29 20 70 50    if( bFree ) pP
25230 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65  arse->pWithToFre
25240 65 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 0a 7d  e = pWith;.  }.}
25250 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
25260 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20  ction checks if 
25270 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72  argument pFrom r
25280 65 66 65 72 73 20 74 6f 20 61 20 43 54 45 20 64  efers to a CTE d
25290 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a 20 61  eclared by .** a
252a0 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f 6e 20   WITH clause on 
252b0 74 68 65 20 73 74 61 63 6b 20 63 75 72 72 65 6e  the stack curren
252c0 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64 20 62  tly maintained b
252d0 79 20 74 68 65 20 70 61 72 73 65 72 2e 20 41 6e  y the parser. An
252e0 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65 6e 74  d,.** if current
252f0 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  ly processing a 
25300 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  CTE expression, 
25310 69 66 20 69 74 20 69 73 20 61 20 72 65 63 75 72  if it is a recur
25320 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  sive.** referenc
25330 65 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  e to the current
25340 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70   CTE..**.** If p
25350 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20  From falls into 
25360 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 74 77  either of the tw
25370 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61 62 6f  o categories abo
25380 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a  ve, pFrom->pTab.
25390 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65  ** and other fie
253a0 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65  lds are populate
253b0 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54  d accordingly. T
253c0 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
253d0 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d   check.** (pFrom
253e0 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20 64 65  ->pTab!=0) to de
253f0 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
25400 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65 73 73  or not a success
25410 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73  ful match.** was
25420 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68   found..**.** Wh
25430 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d  ether or not a m
25440 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 53  atch is found, S
25450 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
25460 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
25470 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66 20 61  .** occurs. If a
25480 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  n error does occ
25490 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ur, an error mes
254a0 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69  sage is stored i
254b0 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65 72 20  n the.** parser 
254c0 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72 20 63  and some error c
254d0 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ode other than S
254e0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
254f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
25500 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20 20 57   withExpand(.  W
25510 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
25520 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
25530 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b  t_item *pFrom.){
25540 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
25550 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
25560 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  se;.  sqlite3 *d
25570 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
25580 20 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43    struct Cte *pC
25590 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
255a0 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43 54 45    /* Matched CTE
255b0 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20   (or NULL if no 
255c0 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69 74 68  match) */.  With
255d0 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20 20 20   *pWith;        
255e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
255f0 49 54 48 20 63 6c 61 75 73 65 20 74 68 61 74 20  ITH clause that 
25600 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20  pCte belongs to 
25610 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  */..  assert( pF
25620 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
25630 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72 63 68  .  pCte = search
25640 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70 57 69  With(pParse->pWi
25650 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57 69 74  th, pFrom, &pWit
25660 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65 20 29  h);.  if( pCte )
25670 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
25680 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  b;.    ExprList 
25690 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c  *pEList;.    Sel
256a0 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53  ect *pSel;.    S
256b0 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20 20 20  elect *pLeft;   
256c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
256d0 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  Left-most SELECT
256e0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
256f0 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75 72 73    int bMayRecurs
25700 69 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ive;            
25710 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d 70 6f  /* True if compo
25720 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e  und joined by UN
25730 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20  ION [ALL] */.   
25740 20 57 69 74 68 20 2a 70 53 61 76 65 64 57 69 74   With *pSavedWit
25750 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  h;             /
25760 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  * Initial value 
25770 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  of pParse->pWith
25780 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   */..    /* If p
25790 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20  Cte->zCteErr is 
257a0 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73  non-NULL at this
257b0 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69   point, then thi
257c0 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a  s is an illegal.
257d0 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65      ** recursive
257e0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 43 54   reference to CT
257f0 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20 61 6e  E pCte. Leave an
25800 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
25810 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20   and return.    
25820 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70 43 74  ** early. If pCt
25830 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20 4e 55  e->zCteErr is NU
25840 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  LL, then this is
25850 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   not a recursive
25860 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20 20 20   reference..    
25870 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  ** In this case,
25880 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20   proceed.  */.  
25890 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 43 74 65    if( pCte->zCte
258a0 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Err ){.      sql
258b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
258c0 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43 74 65 45  rse, pCte->zCteE
258d0 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  rr, pCte->zName)
258e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
258f0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
25900 20 7d 0a 20 20 20 20 69 66 28 20 63 61 6e 6e 6f   }.    if( canno
25910 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  tBeFunction(pPar
25920 73 65 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74  se, pFrom) ) ret
25930 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
25940 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
25950 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
25960 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62  .    pFrom->pTab
25970 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
25980 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
25990 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
259a0 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d  ;.    if( pTab==
259b0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
259c0 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62 2d 3e  bort;.    pTab->
259d0 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20 20  nTabRef = 1;.   
259e0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
259f0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
25a00 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b  b, pCte->zName);
25a10 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
25a20 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d   = -1;.    pTab-
25a30 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
25a40 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
25a50 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
25a60 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20 70 54  48576) );.    pT
25a70 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
25a80 54 46 5f 45 70 68 65 6d 65 72 61 6c 20 7c 20 54  TF_Ephemeral | T
25a90 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64  F_NoVisibleRowid
25aa0 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65  ;.    pFrom->pSe
25ab0 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
25ac0 6c 65 63 74 44 75 70 28 64 62 2c 20 70 43 74 65  lectDup(db, pCte
25ad0 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
25ae0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
25af0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
25b00 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
25b10 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
25b20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pFrom->pSelect )
25b30 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
25b40 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 63  if this is a rec
25b50 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20  ursive CTE. */. 
25b60 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d     pSel = pFrom-
25b70 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d  >pSelect;.    bM
25b80 61 79 52 65 63 75 72 73 69 76 65 20 3d 20 28 20  ayRecursive = ( 
25b90 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  pSel->op==TK_ALL
25ba0 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b   || pSel->op==TK
25bb0 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66  _UNION );.    if
25bc0 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  ( bMayRecursive 
25bd0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
25be0 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
25bf0 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Src = pFrom->pSe
25c00 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20  lect->pSrc;.    
25c10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
25c20 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
25c30 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
25c40 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
25c50 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b  m = &pSrc->a[i];
25c60 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
25c70 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30  em->zDatabase==0
25c80 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49   .         && pI
25c90 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20  tem->zName!=0 . 
25ca0 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
25cb0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 74  lite3StrICmp(pIt
25cc0 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d  em->zName, pCte-
25cd0 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20  >zName).        
25ce0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
25cf0 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  Item->pTab = pTa
25d00 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  b;.          pIt
25d10 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69  em->fg.isRecursi
25d20 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ve = 1;.        
25d30 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b    pTab->nTabRef+
25d40 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65  +;.          pSe
25d50 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  l->selFlags |= S
25d60 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20  F_Recursive;.   
25d70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
25d80 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c     }..    /* Onl
25d90 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76 65 20  y one recursive 
25da0 72 65 66 65 72 65 6e 63 65 20 69 73 20 70 65 72  reference is per
25db0 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20  mitted. */ .    
25dc0 69 66 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65  if( pTab->nTabRe
25dd0 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  f>2 ){.      sql
25de0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20 20  ite3ErrorMsg(.  
25df0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
25e00 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65  "multiple refere
25e10 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73 69 76  nces to recursiv
25e20 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70 43  e table: %s", pC
25e30 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  te->zName.      
25e40 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
25e50 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
25e60 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
25e70 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 31  pTab->nTabRef==1
25e80 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
25e90 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67   ((pSel->selFlag
25ea0 73 26 53 46 5f 52 65 63 75 72 73 69 76 65 29 20  s&SF_Recursive) 
25eb0 26 26 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66  && pTab->nTabRef
25ec0 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70 43 74  ==2 ));..    pCt
25ed0 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 63 69  e->zCteErr = "ci
25ee0 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65  rcular reference
25ef0 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76 65  : %s";.    pSave
25f00 64 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d 3e  dWith = pParse->
25f10 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73  pWith;.    pPars
25f20 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
25f30 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65  ;.    if( bMayRe
25f40 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
25f50 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20   Select *pPrior 
25f60 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a  = pSel->pPrior;.
25f70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
25f80 72 69 6f 72 2d 3e 70 57 69 74 68 3d 3d 30 20 29  rior->pWith==0 )
25f90 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
25fa0 70 57 69 74 68 20 3d 20 70 53 65 6c 2d 3e 70 57  pWith = pSel->pW
25fb0 69 74 68 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ith;.      sqlit
25fc0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
25fd0 6c 6b 65 72 2c 20 70 50 72 69 6f 72 29 3b 0a 20  lker, pPrior);. 
25fe0 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69       pPrior->pWi
25ff0 74 68 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  th = 0;.    }els
26000 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
26010 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
26020 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d  er, pSel);.    }
26030 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
26040 74 68 20 3d 20 70 57 69 74 68 3b 0a 0a 20 20 20  th = pWith;..   
26050 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b   for(pLeft=pSel;
26060 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20   pLeft->pPrior; 
26070 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72  pLeft=pLeft->pPr
26080 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69 73 74  ior);.    pEList
26090 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74   = pLeft->pEList
260a0 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e  ;.    if( pCte->
260b0 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20 69  pCols ){.      i
260c0 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
260d0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65  ist->nExpr!=pCte
260e0 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29  ->pCols->nExpr )
260f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
26100 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
26110 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20  , "table %s has 
26120 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25 64  %d values for %d
26130 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20   columns",.     
26140 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61         pCte->zNa
26150 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  me, pEList->nExp
26160 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e  r, pCte->pCols->
26170 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b  nExpr.        );
26180 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
26190 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57  >pWith = pSavedW
261a0 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ith;.        ret
261b0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
261c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
261d0 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e 70  pEList = pCte->p
261e0 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Cols;.    }..   
261f0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
26200 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
26210 73 65 2c 20 70 45 4c 69 73 74 2c 20 26 70 54 61  se, pEList, &pTa
26220 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
26230 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 62  aCol);.    if( b
26240 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a  MayRecursive ){.
26250 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d 3e        if( pSel->
26260 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
26270 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
26280 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72     pCte->zCteErr
26290 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 63   = "multiple rec
262a0 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
262b0 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 65  s: %s";.      }e
262c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74  lse{.        pCt
262d0 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 72 65  e->zCteErr = "re
262e0 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
262f0 65 20 69 6e 20 61 20 73 75 62 71 75 65 72 79 3a  e in a subquery:
26300 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20   %s";.      }.  
26310 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
26320 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
26330 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sel);.    }.    
26340 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20  pCte->zCteErr = 
26350 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  0;.    pParse->p
26360 57 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74  With = pSavedWit
26370 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  h;.  }..  return
26380 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
26390 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
263a0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a  LITE_OMIT_CTE./*
263b0 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43  .** If the SELEC
263c0 54 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  T passed as the 
263d0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
263e0 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65  has an associate
263f0 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73  d WITH .** claus
26400 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d 20 74  e, pop it from t
26410 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65 64 20  he stack stored 
26420 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 50  as part of the P
26430 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  arse object..**.
26440 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
26450 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20   is used as the 
26460 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
26470 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a  () callback by.*
26480 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  * sqlite3SelectE
26490 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77 61 6c  xpand() when wal
264a0 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20 74 72  king a SELECT tr
264b0 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 61  ee to resolve ta
264c0 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64  ble.** names and
264d0 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75   other FROM clau
264e0 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f  se elements. .*/
264f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
26500 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c 6b 65  ectPopWith(Walke
26510 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
26520 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
26530 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
26540 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 66 28  r->pParse;.  if(
26550 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52   OK_IF_ALWAYS_TR
26560 55 45 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68  UE(pParse->pWith
26570 29 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ) && p->pPrior==
26580 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70  0 ){.    With *p
26590 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67 68 74  With = findRight
265a0 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 3b 0a  most(p)->pWith;.
265b0 20 20 20 20 69 66 28 20 70 57 69 74 68 21 3d 30      if( pWith!=0
265c0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
265d0 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d  ( pParse->pWith=
265e0 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20 20 20  =pWith );.      
265f0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
26600 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20  pWith->pOuter;. 
26610 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65     }.  }.}.#else
26620 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63 74 50  .#define selectP
26630 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69 66 0a  opWith 0.#endif.
26640 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
26650 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20  ine is a Walker 
26660 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78  callback for "ex
26670 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43  panding" a SELEC
26680 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
26690 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e  "Expanding" mean
266a0 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c  s to do the foll
266b0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
266c0 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56  (1)  Make sure V
266d0 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
266e0 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
266f0 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a  igned to every.*
26700 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e  *         elemen
26710 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
26720 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ause..**.**    (
26730 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  2)  Fill in the 
26740 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54  pTabList->a[].pT
26750 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  ab fields in the
26760 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a   SrcList that .*
26770 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  *         define
26780 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
26790 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61  When views appea
267a0 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
267b0 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20  ause,.**        
267c0 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e   fill pTabList->
267d0 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68  a[].pSelect with
267e0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
267f0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
26800 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20  **         that 
26810 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
26820 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20  iew.  A copy is 
26830 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77  made of the view
26840 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  's SELECT.**    
26850 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73       statement s
26860 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72  o that we can fr
26870 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64  eely modify or d
26880 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65  elete that state
26890 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
268a0 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67  without worrying
268b0 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75   about messing u
268c0 70 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  p the persistent
268d0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a   representation.
268e0 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68  **         of th
268f0 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20  e view..**.**   
26900 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20   (3)  Add terms 
26910 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
26920 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61  use to accommoda
26930 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  te the NATURAL k
26940 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20  eyword.**       
26950 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74    on joins and t
26960 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
26970 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e  clause of joins.
26980 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53  .**.**    (4)  S
26990 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  can the list of 
269a0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
269b0 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73  esult set (pELis
269c0 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20  t) looking.**   
269d0 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e        for instan
269e0 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f  ces of the "*" o
269f0 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54  perator or the T
26a00 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e  ABLE.* operator.
26a10 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66  .**         If f
26a20 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63  ound, expand eac
26a30 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72  h "*" to be ever
26a40 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72  y column in ever
26a50 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  y table.**      
26a60 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74     and TABLE.* t
26a70 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
26a80 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  n in TABLE..**.*
26a90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
26aa0 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b  ectExpander(Walk
26ab0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
26ac0 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
26ad0 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
26ae0 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e  er->pParse;.  in
26af0 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63  t i, j, k;.  Src
26b00 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
26b10 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
26b20 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
26b30 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
26b40 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
26b50 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
26b60 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68  Expr *pE, *pRigh
26b70 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36  t, *pExpr;.  u16
26b80 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73   selFlags = p->s
26b90 65 6c 46 6c 61 67 73 3b 0a 20 20 75 33 32 20 65  elFlags;.  u32 e
26ba0 6c 69 73 74 46 6c 61 67 73 20 3d 20 30 3b 0a 0a  listFlags = 0;..
26bb0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
26bc0 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20   SF_Expanded;.  
26bd0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
26be0 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74  iled  ){.    ret
26bf0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
26c00 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
26c10 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSrc!=0 );.  if(
26c20 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f   (selFlags & SF_
26c30 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a  Expanded)!=0 ){.
26c40 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
26c50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rune;.  }.  pTab
26c60 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
26c70 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
26c80 4c 69 73 74 3b 0a 20 20 69 66 28 20 4f 4b 5f 49  List;.  if( OK_I
26c90 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70 2d  F_ALWAYS_TRUE(p-
26ca0 3e 70 57 69 74 68 29 20 29 7b 0a 20 20 20 20 73  >pWith) ){.    s
26cb0 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 70  qlite3WithPush(p
26cc0 50 61 72 73 65 2c 20 70 2d 3e 70 57 69 74 68 2c  Parse, p->pWith,
26cd0 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d   0);.  }..  /* M
26ce0 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20  ake sure cursor 
26cf0 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
26d00 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  n assigned to al
26d10 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a  l entries in.  *
26d20 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
26d30 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  e of the SELECT 
26d40 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
26d50 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
26d60 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
26d70 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b  arse, pTabList);
26d80 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
26d90 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64  very table named
26da0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
26db0 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63  use of the selec
26dc0 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  t.  If.  ** an e
26dd0 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
26de0 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62   clause is a sub
26df0 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66  query instead of
26e00 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
26e10 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61  ,.  ** then crea
26e20 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  te a transient t
26e30 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
26e40 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73  o describe the s
26e50 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  ubquery..  */.  
26e60 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
26e70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
26e80 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
26e90 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
26ea0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
26eb0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
26ec0 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 3d  >fg.isRecursive=
26ed0 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61  =0 || pFrom->pTa
26ee0 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b!=0 );.    if( 
26ef0 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75  pFrom->fg.isRecu
26f00 72 73 69 76 65 20 29 20 63 6f 6e 74 69 6e 75 65  rsive ) continue
26f10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
26f20 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
26f30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
26f40 4d 49 54 5f 43 54 45 0a 20 20 20 20 69 66 28 20  MIT_CTE.    if( 
26f50 77 69 74 68 45 78 70 61 6e 64 28 70 57 61 6c 6b  withExpand(pWalk
26f60 65 72 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74  er, pFrom) ) ret
26f70 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
26f80 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54     if( pFrom->pT
26f90 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e  ab ) {} else.#en
26fa0 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 72 6f  dif.    if( pFro
26fb0 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23  m->zName==0 ){.#
26fc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26fd0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
26fe0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
26ff0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
27000 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
27010 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
27020 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
27030 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73  LECT */.      as
27040 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b  sert( pSel!=0 );
27050 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
27060 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
27070 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
27080 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
27090 6c 6b 65 72 2c 20 70 53 65 6c 29 20 29 20 72 65  lker, pSel) ) re
270a0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
270b0 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
270c0 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
270d0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
270e0 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
270f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
27100 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
27110 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70  C_Abort;.      p
27120 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31  Tab->nTabRef = 1
27130 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f  ;.      if( pFro
27140 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
27150 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
27160 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
27170 75 70 28 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a 41  up(db, pFrom->zA
27180 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lias);.      }el
27190 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62  se{.        pTab
271a0 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
271b0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 75  3MPrintf(db, "su
271c0 62 71 75 65 72 79 5f 25 70 22 2c 20 28 76 6f 69  bquery_%p", (voi
271d0 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20  d*)pTab);.      
271e0 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  }.      while( p
271f0 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70  Sel->pPrior ){ p
27200 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
27210 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69  or; }.      sqli
27220 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
27230 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
27240 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54 61  Sel->pEList,&pTa
27250 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e 61  b->nCol,&pTab->a
27260 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Col);.      pTab
27270 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
27280 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f      pTab->nRowLo
27290 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
272a0 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
272b0 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
272c0 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  );.      pTab->t
272d0 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70  abFlags |= TF_Ep
272e0 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a  hemeral;.#endif.
272f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27300 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
27310 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
27320 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
27330 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  lause */.      a
27340 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
27350 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
27360 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
27370 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
27380 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73  eTableItem(pPars
27390 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20  e, 0, pFrom);.  
273a0 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
273b0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
273c0 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  rt;.      if( pT
273d0 61 62 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66  ab->nTabRef>=0xf
273e0 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73  fff ){.        s
273f0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
27400 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
27410 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c   references to \
27420 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35  "%s\": max 65535
27430 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  ",.           pT
27440 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
27450 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
27460 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
27470 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
27480 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61       }.      pTa
27490 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20  b->nTabRef++;.  
274a0 20 20 20 20 69 66 28 20 21 49 73 56 69 72 74 75      if( !IsVirtu
274b0 61 6c 28 70 54 61 62 29 20 26 26 20 63 61 6e 6e  al(pTab) && cann
274c0 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61  otBeFunction(pPa
274d0 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20  rse, pFrom) ){. 
274e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
274f0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
27500 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
27510 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
27520 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c  || !defined (SQL
27530 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
27540 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28  TABLE).      if(
27550 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
27560 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
27570 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36  t ){.        i16
27580 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69   nCol;.        i
27590 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  f( sqlite3ViewGe
275a0 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
275b0 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74  rse, pTab) ) ret
275c0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
275d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
275e0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  From->pSelect==0
275f0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f   );.        pFro
27600 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
27610 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
27620 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c  , pTab->pSelect,
27630 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
27640 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d  ite3SelectSetNam
27650 65 28 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  e(pFrom->pSelect
27660 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
27670 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70          nCol = p
27680 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
27690 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20     pTab->nCol = 
276a0 2d 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  -1;.        sqli
276b0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
276c0 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53  alker, pFrom->pS
276d0 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
276e0 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  pTab->nCol = nCo
276f0 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  l;.      }.#endi
27700 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
27710 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  Locate the index
27720 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e   named by the IN
27730 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
27740 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
27750 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
27760 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73  edByLookup(pPars
27770 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
27780 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
27790 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ort;.    }.  }..
277a0 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
277b0 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
277c0 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
277d0 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
277e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
277f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
27800 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
27810 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  in(pParse, p) ){
27820 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
27830 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Abort;.  }..  /*
27840 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74   For every "*" t
27850 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68  hat occurs in th
27860 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69  e column list, i
27870 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20  nsert the names 
27880 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  of.  ** all colu
27890 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
278a0 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72  s.  And for ever
278b0 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74  y TABLE.* insert
278c0 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20   the names.  ** 
278d0 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
278e0 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61  n TABLE.  The pa
278f0 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20  rser inserted a 
27900 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69  special expressi
27910 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65  on.  ** with the
27920 20 54 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70 65   TK_ASTERISK ope
27930 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
27940 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
27950 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20   in the column. 
27960 20 2a 2a 20 6c 69 73 74 2e 20 20 54 68 65 20 66   ** list.  The f
27970 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75  ollowing code ju
27980 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65  st has to locate
27990 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b   the TK_ASTERISK
279a0 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
279b0 73 20 61 6e 64 20 65 78 70 61 6e 64 20 65 61 63  s and expand eac
279c0 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73  h one to the lis
279d0 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  t of all columns
279e0 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61 62   in.  ** all tab
279f0 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
27a00 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75  he first loop ju
27a10 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  st checks to see
27a20 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
27a30 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a  y "*" operators.
27a40 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65    ** that need e
27a50 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  xpanding..  */. 
27a60 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
27a70 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
27a80 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74  .    pE = pEList
27a90 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[k].pExpr;.  
27aa0 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
27ab0 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72 65 61  _ASTERISK ) brea
27ac0 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  k;.    assert( p
27ad0 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
27ae0 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29   pE->pRight!=0 )
27af0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
27b00 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
27b10 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26  (pE->pLeft!=0 &&
27b20 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d   pE->pLeft->op==
27b30 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66  TK_ID) );.    if
27b40 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
27b50 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   && pE->pRight->
27b60 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20  op==TK_ASTERISK 
27b70 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 65 6c 69  ) break;.    eli
27b80 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66  stFlags |= pE->f
27b90 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lags;.  }.  if( 
27ba0 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  k<pEList->nExpr 
27bb0 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
27bc0 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20   If we get here 
27bd0 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73  it means the res
27be0 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  ult set contains
27bf0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22   one or more "*"
27c00 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
27c10 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
27c20 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f  e expanded.  Loo
27c30 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
27c40 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
27c50 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
27c60 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68  et and expand th
27c70 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  em one by one.. 
27c80 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74     */.    struct
27c90 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
27ca0 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  a = pEList->a;. 
27cb0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
27cc0 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66  w = 0;.    int f
27cd0 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64  lags = pParse->d
27ce0 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e  b->flags;.    in
27cf0 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66  t longNames = (f
27d00 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
27d10 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20  llColNames)!=0. 
27d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d30 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26       && (flags &
27d40 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
27d50 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20  Names)==0;..    
27d60 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
27d70 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
27d80 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e        pE = a[k].
27d90 70 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6c 69  pExpr;.      eli
27da0 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66  stFlags |= pE->f
27db0 6c 61 67 73 3b 0a 20 20 20 20 20 20 70 52 69 67  lags;.      pRig
27dc0 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b  ht = pE->pRight;
27dd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
27de0 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
27df0 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
27e00 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d      if( pE->op!=
27e10 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 20 20  TK_ASTERISK.    
27e20 20 20 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54     && (pE->op!=T
27e30 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d  K_DOT || pRight-
27e40 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op!=TK_ASTERISK
27e50 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
27e60 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
27e70 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
27e80 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
27e90 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
27ea0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
27eb0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
27ec0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
27ed0 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b  Parse, pNew, a[k
27ee0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
27ef0 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
27f00 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
27f10 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
27f20 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d  Name = a[k].zNam
27f30 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e;.          pNe
27f40 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
27f50 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d  -1].zSpan = a[k]
27f60 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20  .zSpan;.        
27f70 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
27f80 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d  ;.          a[k]
27f90 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20  .zSpan = 0;.    
27fa0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b      }.        a[
27fb0 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  k].pExpr = 0;.  
27fc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27fd0 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65     /* This expre
27fe0 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f  ssion is a "*" o
27ff0 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e  r a "TABLE.*" an
28000 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  d needs to be.  
28010 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65        ** expande
28020 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  d. */.        in
28030 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b  t tableSeen = 0;
28040 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
28050 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74  1 when TABLE mat
28060 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ches */.        
28070 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30  char *zTName = 0
28080 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20  ;       /* text 
28090 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45  of name of TABLE
280a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
280b0 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  pE->op==TK_DOT )
280c0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
280d0 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30  rt( pE->pLeft!=0
280e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
280f0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
28100 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74  operty(pE->pLeft
28110 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
28120 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  ;.          zTNa
28130 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  me = pE->pLeft->
28140 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
28150 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
28160 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
28170 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
28180 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
28190 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  From++){.       
281a0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
281b0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
281c0 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
281d0 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSub = pFrom->pS
281e0 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20  elect;.         
281f0 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
28200 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b  = pFrom->zAlias;
28210 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
28220 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61   char *zSchemaNa
28230 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
28240 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
28250 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
28260 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
28270 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70      zTabName = p
28280 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
28290 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
282a0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
282b0 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a  Failed ) break;.
282c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
282d0 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e  ub==0 || (pSub->
282e0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
282f0 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a  stedFrom)==0 ){.
28300 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62              pSub
28310 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
28320 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
28330 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
28340 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29  TName, zTabName)
28350 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
28360 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
28370 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
28380 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73           iDb = s
28390 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
283a0 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
283b0 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
283c0 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20      zSchemaName 
283d0 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61  = iDb>=0 ? db->a
283e0 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
283f0 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20   : "*";.        
28400 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f    }.          fo
28410 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
28420 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
28430 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
28440 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
28450 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
28460 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
28470 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f  name;  /* The co
28480 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
28490 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  me */.          
284a0 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b    char *zToFree;
284b0 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73     /* Malloced s
284c0 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73  tring that needs
284d0 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
284e0 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65              Toke
284f0 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20  n sColname;  /* 
28500 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  Computed column 
28510 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20  name as a token 
28520 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  */..            
28530 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b  assert( zName );
28540 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
28550 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a   zTName && pSub.
28560 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
28570 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e  sqlite3MatchSpan
28580 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73  Name(pSub->pELis
28590 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30  t->a[j].zSpan, 0
285a0 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a  , zTName, 0)==0.
285b0 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
285c0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
285d0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
285e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
285f0 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e    /* If a column
28600 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68   is marked as 'h
28610 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20  idden', omit it 
28620 66 72 6f 6d 20 74 68 65 20 65 78 70 61 6e 64 65  from the expande
28630 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
28640 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74   result-set list
28650 20 75 6e 6c 65 73 73 20 74 68 65 20 53 45 4c 45   unless the SELE
28660 43 54 20 68 61 73 20 74 68 65 20 53 46 5f 49 6e  CT has the SF_In
28670 63 6c 75 64 65 48 69 64 64 65 6e 0a 20 20 20 20  cludeHidden.    
28680 20 20 20 20 20 20 20 20 2a 2a 20 62 69 74 20 73          ** bit s
28690 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  et..            
286a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
286b0 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
286c0 26 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64  & SF_IncludeHidd
286d0 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  en)==0.         
286e0 20 20 20 20 26 26 20 49 73 48 69 64 64 65 6e 43      && IsHiddenC
286f0 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f  olumn(&pTab->aCo
28700 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20 20 20  l[j]) .         
28710 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
28720 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
28730 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28740 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65          tableSee
28750 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  n = 1;..        
28760 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a      if( i>0 && z
28770 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  TName==0 ){.    
28780 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
28790 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  From->fg.jointyp
287a0 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
287b0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
287c0 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f     && tableAndCo
287d0 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69  lumnIndex(pTabLi
287e0 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c  st, i, zName, 0,
287f0 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   0).            
28800 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
28810 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
28820 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
28830 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
28840 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
28850 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
28860 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  ble to the right
28870 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
28880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28890 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
288a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
288b0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
288c0 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
288d0 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e  From->pUsing, zN
288e0 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
288f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
28900 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
28910 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
28920 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
28930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28940 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
28950 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
28960 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
28970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28980 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
28990 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
289a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
289b0 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
289c0 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
289d0 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  _ID, zName);.   
289e0 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
289f0 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  e = zName;.     
28a00 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
28a10 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
28a20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c  if( longNames ||
28a30 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
28a40 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
28a50 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a     Expr *pLeft;.
28a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
28a70 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
28a80 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61  r(db, TK_ID, zTa
28a90 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
28aa0 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
28ab0 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
28ac0 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
28ad0 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
28ae0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63           if( zSc
28af0 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20  hemaName ){.    
28b00 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
28b10 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
28b20 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65  db, TK_ID, zSche
28b30 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  maName);.       
28b40 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
28b50 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
28b60 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
28b70 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  eft, pExpr);.   
28b80 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
28b90 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
28ba0 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
28bc0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  name = sqlite3MP
28bd0 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
28be0 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
28bf0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
28c00 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a       zToFree = z
28c10 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
28c20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28c30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28c40 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
28c50 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
28c60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28c70 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
28c80 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
28c90 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
28ca0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
28cb0 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49     sqlite3TokenI
28cc0 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a  nit(&sColname, z
28cd0 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
28ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28cf0 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
28d00 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c  rse, pNew, &sCol
28d10 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  name, 0);.      
28d20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
28d30 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
28d40 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21   SF_NestedFrom)!
28d50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
28d60 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
28d70 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26  ist_item *pX = &
28d80 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
28d90 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  xpr-1];.        
28da0 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20 29        if( pSub )
28db0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
28dc0 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71    pX->zSpan = sq
28dd0 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
28de0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  , pSub->pEList->
28df0 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[j].zSpan);.   
28e00 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
28e10 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
28e20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
28e30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28e40 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
28e50 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d  zSpan = sqlite3M
28e60 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
28e70 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  s.%s",.         
28e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ea0 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a    zSchemaName, z
28eb0 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d  TabName, zColnam
28ec0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
28ed0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
28ee0 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20  ->zSpan==0 );.  
28ef0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28f00 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
28f10 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a  bSpanIsTab = 1;.
28f20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28f30 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
28f40 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46  3DbFree(db, zToF
28f50 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
28f60 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
28f70 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
28f80 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
28f90 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
28fa0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
28fb0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
28fc0 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
28fd0 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
28fe0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
28ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
29000 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
29010 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
29020 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
29030 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29040 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
29050 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
29060 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
29070 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
29080 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
29090 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  }.  if( p->pELis
290a0 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  t ){.    if( p->
290b0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62  pEList->nExpr>db
290c0 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
290d0 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
290e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
290f0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
29100 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
29110 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29   in result set")
29120 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
29130 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
29140 20 20 20 20 69 66 28 20 28 65 6c 69 73 74 46 6c      if( (elistFl
29150 61 67 73 20 26 20 28 45 50 5f 48 61 73 46 75 6e  ags & (EP_HasFun
29160 63 7c 45 50 5f 53 75 62 71 75 65 72 79 29 29 21  c|EP_Subquery))!
29170 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  =0 ){.      p->s
29180 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f  elFlags |= SF_Co
29190 6d 70 6c 65 78 52 65 73 75 6c 74 3b 0a 20 20 20  mplexResult;.   
291a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
291b0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
291c0 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75  ./*.** No-op rou
291d0 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72  tine for the par
291e0 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a  se-tree walker..
291f0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
29200 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 57  routine is the W
29210 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
29220 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73  ack then express
29230 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65  ion trees.** are
29240 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20   walked without 
29250 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e  any actions bein
29260 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20  g taken at each 
29270 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c  node.  Presumabl
29280 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  y,.** when this 
29290 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
292a0 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72  for Walker.xExpr
292b0 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a  Callback then .*
292c0 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  * Walker.xSelect
292d0 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20  Callback is set 
292e0 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  to do something 
292f0 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79  useful for every
29300 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e   .** subquery in
29310 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65   the parser tree
29320 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29330 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c  ExprWalkNoop(Wal
29340 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78  ker *NotUsed, Ex
29350 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20  pr *NotUsed2){. 
29360 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
29370 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
29380 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
29390 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
293a0 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75  ./*.** No-op rou
293b0 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72  tine for the par
293c0 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 20 66  se-tree walker f
293d0 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
293e0 65 6e 74 73 2e 0a 2a 2a 20 73 75 62 71 75 65 72  ents..** subquer
293f0 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20  y in the parser 
29400 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tree..*/.int sql
29410 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f  ite3SelectWalkNo
29420 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73  op(Walker *NotUs
29430 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55  ed, Select *NotU
29440 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
29450 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
29460 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
29470 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
29480 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  inue;.}..#if SQL
29490 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
294a0 41 6c 77 61 79 73 20 61 73 73 65 72 74 2e 20 20  Always assert.  
294b0 54 68 69 73 20 78 53 65 6c 65 63 74 43 61 6c 6c  This xSelectCall
294c0 62 61 63 6b 32 20 69 6d 70 6c 65 6d 65 6e 74 61  back2 implementa
294d0 74 69 6f 6e 20 70 72 6f 76 65 73 20 74 68 61 74  tion proves that
294e0 20 74 68 65 0a 2a 2a 20 78 53 65 6c 65 63 74 43   the.** xSelectC
294f0 61 6c 6c 62 61 63 6b 32 20 69 73 20 6e 65 76 65  allback2 is neve
29500 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 76 6f  r invoked..*/.vo
29510 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
29520 57 61 6c 6b 41 73 73 65 72 74 32 28 57 61 6c 6b  WalkAssert2(Walk
29530 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c  er *NotUsed, Sel
29540 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a  ect *NotUsed2){.
29550 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
29560 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
29570 55 73 65 64 32 29 3b 0a 20 20 61 73 73 65 72 74  Used2);.  assert
29580 28 20 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ( 0 );.}.#endif.
29590 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
295a0 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61 20 53  ne "expands" a S
295b0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
295c0 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
295d0 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f  ubqueries..** Fo
295e0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
295f0 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74  ormation on what
29600 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78   it means to "ex
29610 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a  pand" a SELECT.*
29620 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65  * statement, see
29630 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
29640 74 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64  the selectExpand
29650 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b   worker callback
29660 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78   above..**.** Ex
29670 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54  panding a SELECT
29680 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68   statement is th
29690 65 20 66 69 72 73 74 20 73 74 65 70 20 69 6e 20  e first step in 
296a0 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20  processing a.** 
296b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
296c0 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  .  The SELECT st
296d0 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  atement must be 
296e0 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a  expanded before.
296f0 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  ** name resoluti
29700 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e  on is performed.
29710 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69  .**.** If anythi
29720 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61  ng goes wrong, a
29730 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
29740 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
29750 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63  pParse..** The c
29760 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
29770 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20 70  can detect the p
29780 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e  roblem by lookin
29790 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72  g at pParse->nEr
297a0 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72  r.** and/or pPar
297b0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
297c0 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iled..*/.static 
297d0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
297e0 63 74 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a  ctExpand(Parse *
297f0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
29800 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b  pSelect){.  Walk
29810 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43  er w;.  w.xExprC
29820 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
29830 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20  3ExprWalkNoop;. 
29840 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
29850 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f  se;.  if( OK_IF_
29860 41 4c 57 41 59 53 5f 54 52 55 45 28 70 50 61 72  ALWAYS_TRUE(pPar
29870 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 29  se->hasCompound)
29880 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63   ){.    w.xSelec
29890 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76  tCallback = conv
298a0 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63  ertCompoundSelec
298b0 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20  tToSubquery;.   
298c0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
298d0 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ck2 = 0;.    sql
298e0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
298f0 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  w, pSelect);.  }
29900 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
29910 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70  back = selectExp
29920 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65  ander;.  w.xSele
29930 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65  ctCallback2 = se
29940 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a 20 20 73  lectPopWith;.  s
29950 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
29960 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d  (&w, pSelect);.}
29970 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
29980 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
29990 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
299a0 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
299b0 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20  llback callback 
299c0 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53  for the sqlite3S
299d0 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a  electTypeInfo().
299e0 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  ** interface..**
299f0 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f  .** For each FRO
29a00 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
29a10 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54  y, add Column.zT
29a20 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a  ype and Column.z
29a30 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  Coll.** informat
29a40 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65  ion to the Table
29a50 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
29a60 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
29a70 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20  esult set.** of 
29a80 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a  that subquery..*
29a90 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
29aa0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
29ab0 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
29ac0 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73  ult set was cons
29ad0 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65  tructed.** by se
29ae0 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62  lectExpander() b
29af0 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ut the type and 
29b00 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
29b10 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65  ation was omitte
29b20 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69  d.** at that poi
29b30 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74  nt because ident
29b40 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79  ifiers had not y
29b50 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  et been resolved
29b60 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
29b70 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
29b80 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65  er identifier re
29b90 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
29ba0 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41  tic void selectA
29bb0 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
29bc0 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  fo(Walker *pWalk
29bd0 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
29be0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
29bf0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c  .  int i;.  SrcL
29c00 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
29c10 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
29c20 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20  item *pFrom;..  
29c30 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
29c40 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
29c50 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  d );.  assert( (
29c60 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
29c70 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30  _HasTypeInfo)==0
29c80 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   );.  p->selFlag
29c90 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49  s |= SF_HasTypeI
29ca0 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20  nfo;.  pParse = 
29cb0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
29cc0 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
29cd0 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >pSrc;.  for(i=0
29ce0 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
29cf0 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
29d00 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
29d10 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  m++){.    Table 
29d20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
29d30 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
29d40 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
29d50 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
29d60 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
29d70 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
29d80 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
29d90 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
29da0 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
29db0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
29dc0 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
29dd0 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20  lect;.      if( 
29de0 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pSel ){.        
29df0 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
29e00 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65  ior ) pSel = pSe
29e10 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  l->pPrior;.     
29e20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
29e30 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
29e40 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
29e50 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20  , pTab, pSel);. 
29e60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
29e70 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
29e80 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
29e90 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64  dds datatype and
29ea0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
29eb0 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nce information 
29ec0 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20  to.** the Table 
29ed0 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c  structures of al
29ee0 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
29ef0 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a  bqueries in a.**
29f00 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
29f10 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69  t..**.** Use thi
29f20 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  s routine after 
29f30 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  name resolution.
29f40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
29f50 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
29f60 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a  TypeInfo(Parse *
29f70 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
29f80 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65  pSelect){.#ifnde
29f90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
29fa0 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20  BQUERY.  Walker 
29fb0 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  w;.  w.xSelectCa
29fc0 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
29fd0 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a  SelectWalkNoop;.
29fe0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
29ff0 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64  ack2 = selectAdd
2a000 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
2a010 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
2a020 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ack = sqlite3Exp
2a030 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
2a040 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2a050 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
2a060 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
2a070 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
2a080 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2a090 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43 54  sets up a SELECT
2a0a0 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70   statement for p
2a0b0 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a  rocessing.  The.
2a0c0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
2a0d0 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a  accomplished:.**
2a0e0 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20  .**     *  VDBE 
2a0f0 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61  Cursor numbers a
2a100 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  re assigned to a
2a110 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74  ll FROM-clause t
2a120 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  erms..**     *  
2a130 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20  Ephemeral Table 
2a140 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61  objects are crea
2a150 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d  ted for all FROM
2a160 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
2a170 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e  es..**     *  ON
2a180 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
2a190 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69  es are shifted i
2a1a0 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d  nto WHERE statem
2a1b0 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57  ents.**     *  W
2a1c0 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64  ildcards "*" and
2a1d0 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65   "TABLE.*" in re
2a1e0 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78  sult sets are ex
2a1f0 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a  panded..**     *
2a200 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e    Identifiers in
2a210 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20   expression are 
2a220 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65  matched to table
2a230 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
2a240 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72  utine acts recur
2a250 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75  sively on all su
2a260 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20  bqueries within 
2a270 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76  the SELECT..*/.v
2a280 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
2a290 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a  tPrep(.  Parse *
2a2a0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2a2b0 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
2a2c0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
2a2d0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
2a2e0 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
2a2f0 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
2a300 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65  coded. */.  Name
2a310 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e  Context *pOuterN
2a320 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65  C  /* Name conte
2a330 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72  xt for container
2a340 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
2a350 20 70 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p!=0 || pParse-
2a360 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2a370 64 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  d );.  if( pPars
2a380 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
2a390 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
2a3a0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
2a3b0 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
2a3c0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
2a3d0 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
2a3e0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69  (pParse, p);.  i
2a3f0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
2a400 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
2a410 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
2a420 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52  turn;.  sqlite3R
2a430 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65  esolveSelectName
2a440 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75  s(pParse, p, pOu
2a450 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50  terNC);.  if( pP
2a460 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50  arse->nErr || pP
2a470 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
2a480 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
2a490 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
2a4a0 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72  AddTypeInfo(pPar
2a4b0 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  se, p);.}../*.**
2a4c0 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65   Reset the aggre
2a4d0 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
2a4e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72  ..**.** The aggr
2a4f0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
2a500 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65  r is a set of me
2a510 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20  mory cells that 
2a520 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64  hold.** intermed
2a530 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69  iate results whi
2a540 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61  le calculating a
2a550 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68  n aggregate.  Th
2a560 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  is.** routine ge
2a570 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61  nerates code tha
2a580 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69  t stores NULLs i
2a590 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d  n all of those m
2a5a0 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a  emory.** cells..
2a5b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
2a5c0 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
2a5d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
2a5e0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
2a5f0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
2a600 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
2a610 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
2a620 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
2a630 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20  unc;.  int nReg 
2a640 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  = pAggInfo->nFun
2a650 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  c + pAggInfo->nC
2a660 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65  olumn;.  if( nRe
2a670 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23  g==0 ) return;.#
2a680 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2a690 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
2a6a0 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20  hat all AggInfo 
2a6b0 72 65 67 69 73 74 65 72 73 20 61 72 65 20 77 69  registers are wi
2a6c0 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73  thin the range s
2a6d0 70 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a  pecified by.  **
2a6e0 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e   AggInfo.mnReg..
2a6f0 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f  AggInfo.mxReg */
2a700 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d  .  assert( nReg=
2a710 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
2a720 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  -pAggInfo->mnReg
2a730 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  +1 );.  for(i=0;
2a740 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   i<pAggInfo->nCo
2a750 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
2a760 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f  assert( pAggInfo
2a770 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d  ->aCol[i].iMem>=
2a780 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a  pAggInfo->mnReg.
2a790 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67           && pAgg
2a7a0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
2a7b0 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  em<=pAggInfo->mx
2a7c0 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  Reg );.  }.  for
2a7d0 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
2a7e0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20  ->nFunc; i++){. 
2a7f0 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49     assert( pAggI
2a800 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d  nfo->aFunc[i].iM
2a810 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  em>=pAggInfo->mn
2a820 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
2a830 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2a840 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66  i].iMem<=pAggInf
2a850 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a  o->mxReg );.  }.
2a860 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
2a870 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2a880 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e  _Null, 0, pAggIn
2a890 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49  fo->mnReg, pAggI
2a8a0 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66  nfo->mxReg);.  f
2a8b0 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66  or(pFunc=pAggInf
2a8c0 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69  o->aFunc, i=0; i
2a8d0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
2a8e0 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b  ; i++, pFunc++){
2a8f0 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
2a900 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
2a910 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
2a920 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
2a930 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2a940 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2a950 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2a960 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
2a970 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
2a980 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  E->x.pList->nExp
2a990 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  r!=1 ){.        
2a9a0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2a9b0 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
2a9c0 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73  T aggregates mus
2a9d0 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f  t have exactly o
2a9e0 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ne ".           
2a9f0 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20  "argument");.   
2aa00 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
2aa10 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
2aa20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2aa30 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
2aa40 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
2aa50 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
2aa60 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c   pE->x.pList, 0,
2aa70 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
2aa80 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2aa90 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
2aaa0 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  al, pFunc->iDist
2aab0 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20  inct, 0, 0,.    
2aac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aad0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
2aae0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
2aaf0 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  O);.      }.    
2ab00 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
2ab10 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67  nvoke the OP_Agg
2ab20 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20  Finalize opcode 
2ab30 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67  for every aggreg
2ab40 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ate function.** 
2ab50 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73  in the AggInfo s
2ab60 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
2ab70 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a  tic void finaliz
2ab80 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61  eAggFunctions(Pa
2ab90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
2aba0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
2abb0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
2abc0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
2abd0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
2abe0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
2abf0 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
2ac00 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
2ac10 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
2ac20 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
2ac30 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
2ac40 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
2ac50 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
2ac60 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2ac70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
2ac80 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2ac90 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2aca0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67  AddOp2(v, OP_Agg
2acb0 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c  Final, pF->iMem,
2acc0 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
2acd0 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20  nExpr : 0);.    
2ace0 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
2acf0 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63  dP4(v, pF->pFunc
2ad00 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
2ad10 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61   }.}../*.** Upda
2ad20 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  te the accumulat
2ad30 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  or memory cells 
2ad40 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
2ad50 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
2ad60 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
2ad70 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  position..*/.sta
2ad80 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
2ad90 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
2ada0 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
2adb0 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
2adc0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
2add0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
2ade0 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d  ;.  int regHit =
2adf0 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69   0;.  int addrHi
2ae00 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72  tTest = 0;.  str
2ae10 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
2ae20 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41   *pF;.  struct A
2ae30 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a  ggInfo_col *pC;.
2ae40 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
2ae50 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66  ectMode = 1;.  f
2ae60 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
2ae70 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
2ae80 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
2ae90 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69  ++, pF++){.    i
2aea0 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74  nt nArg;.    int
2aeb0 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20   addrNext = 0;. 
2aec0 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20     int regAgg;. 
2aed0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
2aee0 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
2aef0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
2af00 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2af10 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
2af20 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
2af30 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
2af40 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  ){.      nArg = 
2af50 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
2af60 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c      regAgg = sql
2af70 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
2af80 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a  (pParse, nArg);.
2af90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2afa0 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
2afb0 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67  arse, pList, reg
2afc0 41 67 67 2c 20 30 2c 20 53 51 4c 49 54 45 5f 45  Agg, 0, SQLITE_E
2afd0 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65  CEL_DUP);.    }e
2afe0 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  lse{.      nArg 
2aff0 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67  = 0;.      regAg
2b000 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 0;.    }.   
2b010 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e   if( pF->iDistin
2b020 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ct>=0 ){.      a
2b030 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65  ddrNext = sqlite
2b040 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
2b050 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2b060 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f  e( nArg==0 );  /
2b070 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f  * Error conditio
2b080 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  n */.      testc
2b090 61 73 65 28 20 6e 41 72 67 3e 31 20 29 3b 20 20  ase( nArg>1 );  
2b0a0 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f   /* Also an erro
2b0b0 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 44  r */.      codeD
2b0c0 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
2b0d0 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61  pF->iDistinct, a
2b0e0 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41  ddrNext, 1, regA
2b0f0 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gg);.    }.    i
2b100 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75  f( pF->pFunc->fu
2b110 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
2b120 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
2b130 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
2b140 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
2b150 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2b160 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
2b170 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
2b180 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
2b190 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21  =0 );  /* pList!
2b1a0 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20  =0 if pF->pFunc 
2b1b0 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a  has NEEDCOLL */.
2b1c0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
2b1d0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21  Item=pList->a; !
2b1e0 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b  pColl && j<nArg;
2b1f0 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
2b200 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
2b210 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
2b220 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
2b230 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
2b240 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  }.      if( !pCo
2b250 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
2b260 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
2b270 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
2b280 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2b290 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67  egHit==0 && pAgg
2b2a0 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
2b2b0 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b  or ) regHit = ++
2b2c0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2b2d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2b2e0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
2b2f0 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20  Seq, regHit, 0, 
2b300 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
2b310 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
2b320 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2b330 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2b340 5f 41 67 67 53 74 65 70 30 2c 20 30 2c 20 72 65  _AggStep0, 0, re
2b350 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b  gAgg, pF->iMem);
2b360 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2b370 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e  AppendP4(v, pF->
2b380 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
2b390 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
2b3a0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
2b3b0 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  u8)nArg);.    sq
2b3c0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
2b3d0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
2b3e0 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
2b3f0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  g);.    sqlite3R
2b400 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
2b410 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
2b420 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61  nArg);.    if( a
2b430 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ddrNext ){.     
2b440 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2b450 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
2b460 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Next);.      sql
2b470 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2b480 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
2b490 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f  }.  }..  /* Befo
2b4a0 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68  re populating th
2b4b0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
2b4c0 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74  gisters, clear t
2b4d0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
2b4e0 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
2b4f0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72   if any of the r
2b500 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76  equired column v
2b510 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61 64  alues are alread
2b520 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20  y present .  ** 
2b530 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73 71  in registers, sq
2b540 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 20  lite3ExprCode() 
2b550 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79  may use OP_SCopy
2b560 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c   to copy the val
2b570 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69  ue.  ** to pC->i
2b580 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20  Mem. But by the 
2b590 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69  time the value i
2b5a0 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67  s used, the orig
2b5b0 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20  inal register.  
2b5c0 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ** may have been
2b5d0 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74   used, invalidat
2b5e0 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ing the underlyi
2b5f0 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e  ng buffer holdin
2b600 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20  g the.  ** text 
2b610 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53  or blob value. S
2b620 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33  ee ticket [88303
2b630 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  4dcb5]..  **.  *
2b640 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69  * Another soluti
2b650 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63  on would be to c
2b660 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f  hange the OP_SCo
2b670 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20  py used to copy 
2b680 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75  cached.  ** valu
2b690 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79  es to an OP_Copy
2b6a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67  ..  */.  if( reg
2b6b0 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48  Hit ){.    addrH
2b6c0 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  itTest = sqlite3
2b6d0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2b6e0 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64  _If, regHit); Vd
2b6f0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2b700 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
2b710 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
2b720 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  e);.  for(i=0, p
2b730 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  C=pAggInfo->aCol
2b740 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41  ; i<pAggInfo->nA
2b750 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c  ccumulator; i++,
2b760 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   pC++){.    sqli
2b770 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
2b780 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70  se, pC->pExpr, p
2b790 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  C->iMem);.  }.  
2b7a0 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
2b7b0 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Mode = 0;.  sqli
2b7c0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2b7d0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  r(pParse);.  if(
2b7e0 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a   addrHitTest ){.
2b7f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2b800 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48  umpHere(v, addrH
2b810 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  itTest);.  }.}..
2b820 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
2b830 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  le OP_Explain in
2b840 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65  struction to the
2b850 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e   VDBE to explain
2b860 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75   a simple.** cou
2b870 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45  nt(*) query ("SE
2b880 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2b890 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69  OM pTab")..*/.#i
2b8a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2b8b0 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63  T_EXPLAIN.static
2b8c0 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d   void explainSim
2b8d0 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73  pleCount(.  Pars
2b8e0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2b8f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2b900 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
2b910 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
2b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b930 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67    /* Table being
2b940 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e   queried */.  In
2b950 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
2b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b970 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f   Index used to o
2b980 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72  ptimize scan, or
2b990 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66   NULL */.){.  if
2b9a0 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
2b9b0 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  n==2 ){.    int 
2b9c0 62 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d  bCover = (pIdx!=
2b9d0 30 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70  0 && (HasRowid(p
2b9e0 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61  Tab) || !IsPrima
2b9f0 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
2ba00 29 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  ));.    char *zE
2ba10 71 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  qp = sqlite3MPri
2ba20 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
2ba30 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73  "SCAN TABLE %s%s
2ba40 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
2ba50 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
2ba60 20 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49    bCover ? " USI
2ba70 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
2ba80 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20  X " : "",.      
2ba90 20 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d    bCover ? pIdx-
2baa0 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20  >zName : "".    
2bab0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2bac0 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20  beAddOp4(.      
2bad0 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c    pParse->pVdbe,
2bae0 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
2baf0 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
2bb00 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44  0, 0, zEqp, P4_D
2bb10 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20  YNAMIC.    );.  
2bb20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
2bb30 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  ne explainSimple
2bb40 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e  Count(a,b,c).#en
2bb50 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74  dif../*.** sqlit
2bb60 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63 61 6c  e3WalkExpr() cal
2bb70 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 68 61  lback used by ha
2bb80 76 69 6e 67 54 6f 57 68 65 72 65 28 29 2e 0a 2a  vingToWhere()..*
2bb90 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 64 65  *.** If the node
2bba0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 63   passed to the c
2bbb0 61 6c 6c 62 61 63 6b 20 69 73 20 61 20 54 4b 5f  allback is a TK_
2bbc0 41 4e 44 20 6e 6f 64 65 2c 20 72 65 74 75 72 6e  AND node, return
2bbd0 20 0a 2a 2a 20 57 52 43 5f 43 6f 6e 74 69 6e 75   .** WRC_Continu
2bbe0 65 20 74 6f 20 74 65 6c 6c 20 73 71 6c 69 74 65  e to tell sqlite
2bbf0 33 57 61 6c 6b 45 78 70 72 28 29 20 74 6f 20 69  3WalkExpr() to i
2bc00 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 63  terate through c
2bc10 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a  hild nodes..**.*
2bc20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
2bc30 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 2e 20 49  urn WRC_Prune. I
2bc40 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c 73  n this case, als
2bc50 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 0a  o check if the .
2bc60 2a 2a 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f  ** sub-expressio
2bc70 6e 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 72  n matches the cr
2bc80 69 74 65 72 69 61 20 66 6f 72 20 62 65 69 6e 67  iteria for being
2bc90 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 57 48   moved to the WH
2bca0 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 49  ERE.** clause. I
2bcb0 66 20 73 6f 2c 20 61 64 64 20 69 74 20 74 6f 20  f so, add it to 
2bcc0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2bcd0 20 61 6e 64 20 72 65 70 6c 61 63 65 20 74 68 65   and replace the
2bce0 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f 6e 0a   sub-expression.
2bcf0 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 48 41  ** within the HA
2bd00 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20  VING expression 
2bd10 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20  with a constant 
2bd20 22 31 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  "1"..*/.static i
2bd30 6e 74 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65  nt havingToWhere
2bd40 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a 70  ExprCb(Walker *p
2bd50 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
2bd60 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70  xpr){.  if( pExp
2bd70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44 20 29 7b  r->op!=TK_AND ){
2bd80 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20  .    Select *pS 
2bd90 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65  = pWalker->u.pSe
2bda0 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20 73 71  lect;.    if( sq
2bdb0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
2bdc0 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 70 57 61  antOrGroupBy(pWa
2bdd0 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 45  lker->pParse, pE
2bde0 78 70 72 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42  xpr, pS->pGroupB
2bdf0 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  y) ){.      sqli
2be00 74 65 33 20 2a 64 62 20 3d 20 70 57 61 6c 6b 65  te3 *db = pWalke
2be10 72 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  r->pParse->db;. 
2be20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
2be30 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
2be40 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  oc(db, TK_INTEGE
2be50 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f  R, &sqlite3IntTo
2be60 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 20  kens[1], 0);.   
2be70 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
2be80 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 57 68         Expr *pWh
2be90 65 72 65 20 3d 20 70 53 2d 3e 70 57 68 65 72 65  ere = pS->pWhere
2bea0 3b 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 45  ;.        SWAP(E
2beb0 78 70 72 2c 20 2a 70 4e 65 77 2c 20 2a 70 45 78  xpr, *pNew, *pEx
2bec0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  pr);.        pNe
2bed0 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  w = sqlite3ExprA
2bee0 6e 64 28 64 62 2c 20 70 57 68 65 72 65 2c 20 70  nd(db, pWhere, p
2bef0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 53  New);.        pS
2bf00 2d 3e 70 57 68 65 72 65 20 3d 20 70 4e 65 77 3b  ->pWhere = pNew;
2bf10 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72  .        pWalker
2bf20 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ->eCode = 1;.   
2bf30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
2bf40 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
2bf50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
2bf60 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
2bf70 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 6c  *.** Transfer el
2bf80 69 67 69 62 6c 65 20 74 65 72 6d 73 20 66 72 6f  igible terms fro
2bf90 6d 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61  m the HAVING cla
2bfa0 75 73 65 20 6f 66 20 61 20 71 75 65 72 79 2c 20  use of a query, 
2bfb0 77 68 69 63 68 20 69 73 0a 2a 2a 20 70 72 6f 63  which is.** proc
2bfc0 65 73 73 65 64 20 61 66 74 65 72 20 67 72 6f 75  essed after grou
2bfd0 70 69 6e 67 2c 20 74 6f 20 74 68 65 20 57 48 45  ping, to the WHE
2bfe0 52 45 20 63 6c 61 75 73 65 2c 20 77 68 69 63 68  RE clause, which
2bff0 20 69 73 20 70 72 6f 63 65 73 73 65 64 20 62 65   is processed be
2c000 66 6f 72 65 0a 2a 2a 20 67 72 6f 75 70 69 6e 67  fore.** grouping
2c010 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  . For example, t
2c020 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
2c030 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2c040 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20 61  <tables> WHERE a
2c050 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48 41  =? GROUP BY b HA
2c060 56 49 4e 47 20 62 3d 3f 20 41 4e 44 20 63 3d 3f  VING b=? AND c=?
2c070 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 20 72 65  .**.** can be re
2c080 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
2c090 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
2c0a0 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45  M <tables> WHERE
2c0b0 20 61 3d 3f 20 41 4e 44 20 62 3d 3f 20 47 52 4f   a=? AND b=? GRO
2c0c0 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 63  UP BY b HAVING c
2c0d0 3d 3f 0a 2a 2a 0a 2a 2a 20 41 20 74 65 72 6d 20  =?.**.** A term 
2c0e0 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 65 78  of the HAVING ex
2c0f0 70 72 65 73 73 69 6f 6e 20 69 73 20 65 6c 69 67  pression is elig
2c100 69 62 6c 65 20 66 6f 72 20 74 72 61 6e 73 66 65  ible for transfe
2c110 72 20 69 66 20 69 74 20 63 6f 6e 73 69 73 74 73  r if it consists
2c120 0a 2a 2a 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  .** entirely of 
2c130 63 6f 6e 73 74 61 6e 74 73 20 61 6e 64 20 65 78  constants and ex
2c140 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61  pressions that a
2c150 72 65 20 61 6c 73 6f 20 47 52 4f 55 50 20 42 59  re also GROUP BY
2c160 20 74 65 72 6d 73 20 74 68 61 74 0a 2a 2a 20 75   terms that.** u
2c170 73 65 20 74 68 65 20 22 42 49 4e 41 52 59 22 20  se the "BINARY" 
2c180 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
2c190 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ce..*/.static vo
2c1a0 69 64 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65  id havingToWhere
2c1b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2c1c0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 57 61  Select *p){.  Wa
2c1d0 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20 20  lker sWalker;.  
2c1e0 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b 65 72 2c  memset(&sWalker,
2c1f0 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 61 6c 6b   0, sizeof(sWalk
2c200 65 72 29 29 3b 0a 20 20 73 57 61 6c 6b 65 72 2e  er));.  sWalker.
2c210 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
2c220 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72  .  sWalker.xExpr
2c230 43 61 6c 6c 62 61 63 6b 20 3d 20 68 61 76 69 6e  Callback = havin
2c240 67 54 6f 57 68 65 72 65 45 78 70 72 43 62 3b 0a  gToWhereExprCb;.
2c250 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70 53 65 6c    sWalker.u.pSel
2c260 65 63 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74  ect = p;.  sqlit
2c270 65 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61 6c  e3WalkExpr(&sWal
2c280 6b 65 72 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  ker, p->pHaving)
2c290 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
2c2a0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
2c2b0 73 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 26 26  sWalker.eCode &&
2c2c0 20 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54   (sqlite3SelectT
2c2d0 72 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30  race & 0x100)!=0
2c2e0 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
2c2f0 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
2c300 2c 70 2c 28 22 4d 6f 76 65 20 48 41 56 49 4e 47  ,p,("Move HAVING
2c310 20 74 65 72 6d 73 20 69 6e 74 6f 20 57 48 45 52   terms into WHER
2c320 45 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  E:\n"));.    sql
2c330 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
2c340 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
2c350 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
2c360 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2c370 20 74 68 65 20 70 54 68 69 73 20 65 6e 74 72 79   the pThis entry
2c380 20 6f 66 20 70 54 61 62 4c 69 73 74 20 69 73 20   of pTabList is 
2c390 61 20 73 65 6c 66 2d 6a 6f 69 6e 20 6f 66 20 61  a self-join of a
2c3a0 20 70 72 69 6f 72 20 76 69 65 77 2e 0a 2a 2a 20   prior view..** 
2c3b0 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 72  If it is, then r
2c3c0 65 74 75 72 6e 20 74 68 65 20 53 72 63 4c 69 73  eturn the SrcLis
2c3d0 74 5f 69 74 65 6d 20 66 6f 72 20 74 68 65 20 70  t_item for the p
2c3e0 72 69 6f 72 20 76 69 65 77 2e 20 20 49 66 20 69  rior view.  If i
2c3f0 74 20 69 73 20 6e 6f 74 2c 0a 2a 2a 20 74 68 65  t is not,.** the
2c400 6e 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  n return 0..*/.s
2c410 74 61 74 69 63 20 73 74 72 75 63 74 20 53 72 63  tatic struct Src
2c420 4c 69 73 74 5f 69 74 65 6d 20 2a 69 73 53 65 6c  List_item *isSel
2c430 66 4a 6f 69 6e 56 69 65 77 28 0a 20 20 53 72 63  fJoinView(.  Src
2c440 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
2c450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61            /* Sea
2c460 72 63 68 20 66 6f 72 20 73 65 6c 66 2d 6a 6f 69  rch for self-joi
2c470 6e 73 20 69 6e 20 74 68 69 73 20 46 52 4f 4d 20  ns in this FROM 
2c480 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
2c490 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2c4a0 2a 70 54 68 69 73 20 20 20 2f 2a 20 53 65 61 72  *pThis   /* Sear
2c4b0 63 68 20 66 6f 72 20 70 72 69 6f 72 20 72 65 66  ch for prior ref
2c4c0 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 73  erence to this s
2c4d0 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20  ubquery */.){.  
2c4e0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2c4f0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66 6f  tem *pItem;.  fo
2c500 72 28 70 49 74 65 6d 20 3d 20 70 54 61 62 4c 69  r(pItem = pTabLi
2c510 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 54 68  st->a; pItem<pTh
2c520 69 73 3b 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  is; pItem++){.  
2c530 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
2c540 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  lect==0 ) contin
2c550 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ue;.    if( pIte
2c560 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69  m->fg.viaCorouti
2c570 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ne ) continue;. 
2c580 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e     if( pItem->zN
2c590 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ame==0 ) continu
2c5a0 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
2c5b0 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65 6d  e3_stricmp(pItem
2c5c0 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20 70 54 68  ->zDatabase, pTh
2c5d0 69 73 2d 3e 7a 44 61 74 61 62 61 73 65 29 21 3d  is->zDatabase)!=
2c5e0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2c5f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
2c600 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61  ricmp(pItem->zNa
2c610 6d 65 2c 20 70 54 68 69 73 2d 3e 7a 4e 61 6d 65  me, pThis->zName
2c620 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
2c630 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2c640 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 0a  ExprCompare(0, .
2c650 20 20 20 20 20 20 20 20 20 20 70 54 68 69 73 2d            pThis-
2c660 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65  >pSelect->pWhere
2c670 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
2c680 2d 3e 70 57 68 65 72 65 2c 20 2d 31 29 20 0a 20  ->pWhere, -1) . 
2c690 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54     ){.      /* T
2c6a0 68 65 20 76 69 65 77 20 77 61 73 20 6d 6f 64 69  he view was modi
2c6b0 66 69 65 64 20 62 79 20 73 6f 6d 65 20 6f 74 68  fied by some oth
2c6c0 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  er optimization 
2c6d0 73 75 63 68 20 61 73 0a 20 20 20 20 20 20 2a 2a  such as.      **
2c6e0 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
2c6f0 72 6d 73 28 29 20 2a 2f 0a 20 20 20 20 20 20 63  rms() */.      c
2c700 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
2c710 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d 3b     return pItem;
2c720 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2c730 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
2c740 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50  E_COUNTOFVIEW_OP
2c750 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  TIMIZATION./*.**
2c760 20 41 74 74 65 6d 70 74 20 74 6f 20 74 72 61 6e   Attempt to tran
2c770 73 66 6f 72 6d 20 61 20 71 75 65 72 79 20 6f 66  sform a query of
2c780 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
2c790 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
2c7a0 2a 29 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  *) FROM (SELECT 
2c7b0 78 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  x FROM t1 UNION 
2c7c0 41 4c 4c 20 53 45 4c 45 43 54 20 79 20 46 52 4f  ALL SELECT y FRO
2c7d0 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 49 6e 74 6f  M t2).**.** Into
2c7e0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
2c7f0 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
2c800 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 29  ount(*) FROM t1)
2c810 2b 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  +(SELECT count(*
2c820 29 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a  ) FROM t2).**.**
2c830 20 54 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74   The transformat
2c840 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69  ion only works i
2c850 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
2c860 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
2c870 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20  .**.**   *  The 
2c880 73 75 62 71 75 65 72 79 20 69 73 20 61 20 55 4e  subquery is a UN
2c890 49 4f 4e 20 41 4c 4c 20 6f 66 20 74 77 6f 20 6f  ION ALL of two o
2c8a0 72 20 6d 6f 72 65 20 74 65 72 6d 73 0a 2a 2a 20  r more terms.** 
2c8b0 20 20 2a 20 20 54 68 65 72 65 20 69 73 20 6e 6f    *  There is no
2c8c0 20 57 48 45 52 45 20 6f 72 20 47 52 4f 55 50 20   WHERE or GROUP 
2c8d0 42 59 20 6f 72 20 48 41 56 49 4e 47 20 63 6c 61  BY or HAVING cla
2c8e0 75 73 65 73 20 6f 6e 20 74 68 65 20 73 75 62 71  uses on the subq
2c8f0 75 65 72 69 65 73 0a 2a 2a 20 20 20 2a 20 20 54  ueries.**   *  T
2c900 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
2c910 73 20 61 20 73 69 6d 70 6c 65 20 63 6f 75 6e 74  s a simple count
2c920 28 2a 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  (*).**.** Return
2c930 20 54 52 55 45 20 69 66 20 74 68 65 20 6f 70 74   TRUE if the opt
2c940 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 6e 64  imization is und
2c950 65 72 74 61 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74  ertaken..*/.stat
2c960 69 63 20 69 6e 74 20 63 6f 75 6e 74 4f 66 56 69  ic int countOfVi
2c970 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28 50  ewOptimization(P
2c980 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
2c990 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65  lect *p){.  Sele
2c9a0 63 74 20 2a 70 53 75 62 2c 20 2a 70 50 72 69 6f  ct *pSub, *pPrio
2c9b0 72 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  r;.  Expr *pExpr
2c9c0 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 75 6e 74  ;.  Expr *pCount
2c9d0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
2c9e0 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
2c9f0 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
2ca00 74 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  te)==0 ) return 
2ca10 30 3b 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  0;   /* This is 
2ca20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a  an aggregate */.
2ca30 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
2ca40 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
2ca50 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
2ca60 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 72 65      /* Single re
2ca70 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  sult column */. 
2ca80 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   pExpr = p->pELi
2ca90 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
2caa0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
2cab0 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
2cac0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2cad0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 69 73      /* Result is
2cae0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f   an aggregate */
2caf0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
2cb00 74 72 69 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e  tricmp(pExpr->u.
2cb10 7a 54 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22 29 20  zToken,"count") 
2cb20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
2cb30 49 73 20 63 6f 75 6e 74 28 29 20 2a 2f 0a 20 20  Is count() */.  
2cb40 69 66 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  if( pExpr->x.pLi
2cb50 73 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st!=0 ) return 0
2cb60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cb70 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 75    /* Must be cou
2cb80 6e 74 28 2a 29 20 2a 2f 0a 20 20 69 66 28 20 70  nt(*) */.  if( p
2cb90 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ->pSrc->nSrc!=1 
2cba0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
2cbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cbc0 4f 6e 65 20 74 61 62 6c 65 20 69 6e 20 46 52 4f  One table in FRO
2cbd0 4d 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70  M  */.  pSub = p
2cbe0 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ->pSrc->a[0].pSe
2cbf0 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 53 75 62  lect;.  if( pSub
2cc00 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
2cc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2cc30 20 46 52 4f 4d 20 69 73 20 61 20 73 75 62 71 75   FROM is a subqu
2cc40 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ery */.  if( pSu
2cc50 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72  b->pPrior==0 ) r
2cc60 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
2cc70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
2cc80 73 74 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64  st be a compound
2cc90 20 72 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20   ry */.  do{.   
2cca0 20 69 66 28 20 70 53 75 62 2d 3e 6f 70 21 3d 54   if( pSub->op!=T
2ccb0 4b 5f 41 4c 4c 20 26 26 20 70 53 75 62 2d 3e 70  K_ALL && pSub->p
2ccc0 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30  Prior ) return 0
2ccd0 3b 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 55 4e  ;  /* Must be UN
2cce0 49 4f 4e 20 41 4c 4c 20 2a 2f 0a 20 20 20 20 69  ION ALL */.    i
2ccf0 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20  f( pSub->pWhere 
2cd00 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
2cd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd20 20 2f 2a 20 4e 6f 20 57 48 45 52 45 20 63 6c 61   /* No WHERE cla
2cd30 75 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  use */.    if( p
2cd40 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
2cd50 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 20 72  SF_Aggregate ) r
2cd60 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20  eturn 0;     /* 
2cd70 4e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  Not an aggregate
2cd80 20 2a 2f 0a 20 20 20 20 70 53 75 62 20 3d 20 70   */.    pSub = p
2cd90 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 20 20 20  Sub->pPrior;    
2cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cdb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70            /* Rep
2cdc0 65 61 74 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e  eat over compoun
2cdd0 64 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 70  d */.  }while( p
2cde0 53 75 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Sub );..  /* If 
2cdf0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
2ce00 69 6e 74 20 74 68 65 6e 20 69 74 20 69 73 20 4f  int then it is O
2ce10 4b 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65  K to perform the
2ce20 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
2ce30 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  */..  db = pPars
2ce40 65 2d 3e 64 62 3b 0a 20 20 70 43 6f 75 6e 74 20  e->db;.  pCount 
2ce50 3d 20 70 45 78 70 72 3b 0a 20 20 70 45 78 70 72  = pExpr;.  pExpr
2ce60 20 3d 20 30 3b 0a 20 20 70 53 75 62 20 3d 20 70   = 0;.  pSub = p
2ce70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ->pSrc->a[0].pSe
2ce80 6c 65 63 74 3b 0a 20 20 70 2d 3e 70 53 72 63 2d  lect;.  p->pSrc-
2ce90 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20  >a[0].pSelect = 
2cea0 30 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  0;.  sqlite3SrcL
2ceb0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
2cec0 3e 70 53 72 63 29 3b 0a 20 20 70 2d 3e 70 53 72  >pSrc);.  p->pSr
2ced0 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
2cee0 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
2cef0 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 2d 3e 70  db, sizeof(*p->p
2cf00 53 72 63 29 29 3b 0a 20 20 77 68 69 6c 65 28 20  Src));.  while( 
2cf10 70 53 75 62 20 29 7b 0a 20 20 20 20 45 78 70 72  pSub ){.    Expr
2cf20 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 70 50 72   *pTerm;.    pPr
2cf30 69 6f 72 20 3d 20 70 53 75 62 2d 3e 70 50 72 69  ior = pSub->pPri
2cf40 6f 72 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 50  or;.    pSub->pP
2cf50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 53  rior = 0;.    pS
2cf60 75 62 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ub->pNext = 0;. 
2cf70 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67     pSub->selFlag
2cf80 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74  s |= SF_Aggregat
2cf90 65 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73 65 6c  e;.    pSub->sel
2cfa0 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d  Flags &= ~SF_Com
2cfb0 70 6f 75 6e 64 3b 0a 20 20 20 20 70 53 75 62 2d  pound;.    pSub-
2cfc0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b  >nSelectRow = 0;
2cfd0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2cfe0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2cff0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
2d000 20 20 70 54 65 72 6d 20 3d 20 70 50 72 69 6f 72    pTerm = pPrior
2d010 20 3f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   ? sqlite3ExprDu
2d020 70 28 64 62 2c 20 70 43 6f 75 6e 74 2c 20 30 29  p(db, pCount, 0)
2d030 20 3a 20 70 43 6f 75 6e 74 3b 0a 20 20 20 20 70   : pCount;.    p
2d040 53 75 62 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  Sub->pEList = sq
2d050 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
2d060 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 70  end(pParse, 0, p
2d070 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d  Term);.    pTerm
2d080 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2d090 70 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43  pParse, TK_SELEC
2d0a0 54 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  T, 0, 0);.    sq
2d0b0 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65 6c  lite3PExprAddSel
2d0c0 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 65 72  ect(pParse, pTer
2d0d0 6d 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 69 66  m, pSub);.    if
2d0e0 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
2d0f0 20 20 20 20 70 45 78 70 72 20 3d 20 70 54 65 72      pExpr = pTer
2d100 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  m;.    }else{.  
2d110 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
2d120 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2d130 20 54 4b 5f 50 4c 55 53 2c 20 70 54 65 72 6d 2c   TK_PLUS, pTerm,
2d140 20 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20   pExpr);.    }. 
2d150 20 20 20 70 53 75 62 20 3d 20 70 50 72 69 6f 72     pSub = pPrior
2d160 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 45 4c 69 73  ;.  }.  p->pELis
2d170 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20  t->a[0].pExpr = 
2d180 70 45 78 70 72 3b 0a 20 20 70 2d 3e 73 65 6c 46  pExpr;.  p->selF
2d190 6c 61 67 73 20 26 3d 20 7e 53 46 5f 41 67 67 72  lags &= ~SF_Aggr
2d1a0 65 67 61 74 65 3b 0a 0a 23 69 66 20 53 45 4c 45  egate;..#if SELE
2d1b0 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
2d1c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2d1d0 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
2d1e0 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
2d1f0 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
2d200 2c 70 2c 28 22 41 66 74 65 72 20 63 6f 75 6e 74  ,p,("After count
2d210 2d 6f 66 2d 76 69 65 77 20 6f 70 74 69 6d 69 7a  -of-view optimiz
2d220 61 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20  ation:\n"));.   
2d230 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2d240 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2d250 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
2d260 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
2d270 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54   /* SQLITE_COUNT
2d280 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54  OFVIEW_OPTIMIZAT
2d290 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65  ION */../*.** Ge
2d2a0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
2d2b0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
2d2c0 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68  ment given in th
2d2d0 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a  e p argument.  .
2d2e0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
2d2f0 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 61  s are returned a
2d300 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
2d310 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
2d320 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d  ture..** See com
2d330 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65 49  ments in sqliteI
2d340 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65 72  nt.h for further
2d350 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
2d360 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2d370 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
2d380 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
2d390 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
2d3a0 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64  e.** encountered
2d3b0 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70  , then an approp
2d3c0 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
2d3d0 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a  age is left in.*
2d3e0 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  * pParse->zErrMs
2d3f0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
2d400 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66  utine does NOT f
2d410 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73  ree the Select s
2d420 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
2d430 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  in.  The.** call
2d440 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65  ing function nee
2d450 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ds to do that..*
2d460 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
2d470 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
2d480 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
2d490 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
2d4a0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
2d4b0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
2d4c0 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
2d4d0 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
2d4e0 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ded. */.  Select
2d4f0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
2d500 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
2d510 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65  ith the query re
2d520 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
2d530 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
2d540 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2d550 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
2d560 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
2d570 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d    /* Return from
2d580 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2d590 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a  in() */.  Vdbe *
2d5a0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
2d5b0 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
2d5c0 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f  machine under co
2d5d0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
2d5e0 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20  int isAgg;      
2d5f0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
2d600 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
2d610 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
2d620 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2d630 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c  EList = 0;  /* L
2d640 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
2d650 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20  o extract. */.  
2d660 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
2d670 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  t;     /* List o
2d680 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
2d690 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
2d6a0 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
2d6b0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2d6c0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
2d6d0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
2d6e0 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
2d6f0 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
2d700 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
2d710 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
2d720 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20   *pHaving;      
2d730 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47     /* The HAVING
2d740 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
2d750 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72   NULL */.  int r
2d760 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  c = 1;          
2d770 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
2d780 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66  turn from this f
2d790 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73  unction */.  Dis
2d7a0 74 69 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e  tinctCtx sDistin
2d7b0 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68  ct; /* Info on h
2d7c0 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44  ow to code the D
2d7d0 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
2d7e0 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53 6f  */.  SortCtx sSo
2d7f0 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  rt;         /* I
2d800 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f  nfo on how to co
2d810 64 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  de the ORDER BY 
2d820 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67 49  clause */.  AggI
2d830 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20  nfo sAggInfo;   
2d840 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
2d850 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67  n used by aggreg
2d860 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  ate queries */. 
2d870 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20   int iEnd;      
2d880 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
2d890 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66  ss of the end of
2d8a0 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
2d8b0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
2d8c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
2d8d0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2d8e0 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  n */.  ExprList 
2d8f0 2a 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 20  *pMinMaxOrderBy 
2d900 3d 20 30 3b 20 20 2f 2a 20 41 64 64 65 64 20 4f  = 0;  /* Added O
2d910 52 44 45 52 20 42 59 20 66 6f 72 20 6d 69 6e 2f  RDER BY for min/
2d920 6d 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  max queries */. 
2d930 20 75 38 20 6d 69 6e 4d 61 78 46 6c 61 67 3b 20   u8 minMaxFlag; 
2d940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d950 2f 2a 20 46 6c 61 67 20 66 6f 72 20 6d 69 6e 2f  /* Flag for min/
2d960 6d 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a 0a  max queries */..
2d970 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d980 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e  MIT_EXPLAIN.  in
2d990 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74  t iRestoreSelect
2d9a0 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65  Id = pParse->iSe
2d9b0 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73 65  lectId;.  pParse
2d9c0 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70 50  ->iSelectId = pP
2d9d0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
2d9e0 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  tId++;.#endif.. 
2d9f0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
2da00 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
2da10 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2da20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
2da30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
2da40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
2da50 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
2da60 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
2da70 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  CT, 0, 0, 0) ) r
2da80 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65  eturn 1;.  memse
2da90 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20  t(&sAggInfo, 0, 
2daa0 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29  sizeof(sAggInfo)
2dab0 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
2dac0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c  CE_ENABLED.  SEL
2dad0 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
2dae0 65 2c 70 2c 20 28 22 62 65 67 69 6e 20 70 72 6f  e,p, ("begin pro
2daf0 63 65 73 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20  cessing:\n"));. 
2db00 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
2db10 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
2db20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  ){.    sqlite3Tr
2db30 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
2db40 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
2db50 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  f..  assert( p->
2db60 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
2db70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
2db80 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61  _DistFifo );.  a
2db90 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
2dba0 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
2dbb0 65 44 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20  eDest!=SRT_Fifo 
2dbc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2dbd0 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
2dbe0 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
2dbf0 5f 44 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20  _DistQueue );.  
2dc00 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
2dc10 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
2dc20 3e 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75  >eDest!=SRT_Queu
2dc30 65 20 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72  e );.  if( Ignor
2dc40 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
2dc50 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  t) ){.    assert
2dc60 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53  (pDest->eDest==S
2dc70 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65  RT_Exists || pDe
2dc80 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55  st->eDest==SRT_U
2dc90 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20  nion || .       
2dca0 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
2dcb0 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20  ==SRT_Except || 
2dcc0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2dcd0 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20  T_Discard ||.   
2dce0 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
2dcf0 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20  Dest==SRT_Queue 
2dd00 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2dd10 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c  ==SRT_DistFifo |
2dd20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65  |.           pDe
2dd30 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
2dd40 69 73 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73  istQueue || pDes
2dd50 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69  t->eDest==SRT_Fi
2dd60 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f  fo);.    /* If O
2dd70 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f  RDER BY makes no
2dd80 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74   difference in t
2dd90 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e  he output then n
2dda0 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20  either does.    
2ddb0 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69  ** DISTINCT so i
2ddc0 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64  t can be removed
2ddd0 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c   too. */.    sql
2dde0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
2ddf0 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  te(db, p->pOrder
2de00 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  By);.    p->pOrd
2de10 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  erBy = 0;.    p-
2de20 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
2de30 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20  _Distinct;.  }. 
2de40 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
2de50 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29  ep(pParse, p, 0)
2de60 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72  ;.  memset(&sSor
2de70 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f  t, 0, sizeof(sSo
2de80 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f  rt));.  sSort.pO
2de90 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
2dea0 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74  erBy;.  pTabList
2deb0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66   = p->pSrc;.  if
2dec0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
2ded0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
2dee0 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  ed ){.    goto s
2def0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
2df00 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
2df10 73 74 21 3d 30 20 29 3b 0a 20 20 69 73 41 67 67  st!=0 );.  isAgg
2df20 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20   = (p->selFlags 
2df30 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21  & SF_Aggregate)!
2df40 3d 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  =0;.#if SELECTTR
2df50 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
2df60 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
2df70 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
2df80 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
2df90 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 20  0x100,pParse,p, 
2dfa0 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73  ("after name res
2dfb0 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20  olution:\n"));. 
2dfc0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2dfd0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
2dfe0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
2dff0 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65   /* Get a pointe
2e000 72 20 74 68 65 20 56 44 42 45 20 75 6e 64 65 72  r the VDBE under
2e010 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2c 20 61   construction, a
2e020 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
2e030 56 44 42 45 20 69 66 20 6f 6e 65 0a 20 20 2a 2a  VDBE if one.  **
2e040 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
2e050 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 76 20 3d  y exist */.  v =
2e060 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
2e070 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
2e080 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
2e090 74 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 44 65  t_end;.  if( pDe
2e0a0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
2e0b0 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e  utput ){.    gen
2e0c0 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
2e0d0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d  (pParse, p);.  }
2e0e0 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 76 61  ..  /* Try to va
2e0f0 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69  rious optimizati
2e100 6f 6e 73 20 28 66 6c 61 74 74 65 6e 69 6e 67 20  ons (flattening 
2e110 73 75 62 71 75 65 72 69 65 73 2c 20 61 6e 64 20  subqueries, and 
2e120 73 74 72 65 6e 67 74 68 0a 20 20 2a 2a 20 72 65  strength.  ** re
2e130 64 75 63 74 69 6f 6e 20 6f 66 20 6a 6f 69 6e 20  duction of join 
2e140 6f 70 65 72 61 74 6f 72 73 29 20 69 6e 20 74 68  operators) in th
2e150 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 75 70  e FROM clause up
2e160 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 71   into the main q
2e170 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21 64  uery.  */.#if !d
2e180 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2e190 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
2e1a0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2e1b0 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72  OMIT_VIEW).  for
2e1c0 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72  (i=0; !p->pPrior
2e1d0 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e   && i<pTabList->
2e1e0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
2e1f0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2e200 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
2e210 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20  abList->a[i];.  
2e220 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d    Select *pSub =
2e230 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b   pItem->pSelect;
2e240 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
2e250 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
2e260 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
2e270 4c 45 46 54 20 4a 4f 49 4e 20 69 6e 74 6f 20 4a  LEFT JOIN into J
2e280 4f 49 4e 20 69 66 20 74 68 65 72 65 20 61 72 65  OIN if there are
2e290 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 72 69   terms of the ri
2e2a0 67 68 74 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  ght table.    **
2e2b0 20 6f 66 20 74 68 65 20 4c 45 46 54 20 4a 4f 49   of the LEFT JOI
2e2c0 4e 20 75 73 65 64 20 69 6e 20 74 68 65 20 57 48  N used in the WH
2e2d0 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 20 20  ERE clause..    
2e2e0 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 74 65  */.    if( (pIte
2e2f0 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
2e300 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20 20 20   JT_LEFT)!=0.   
2e310 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
2e320 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f  ImpliesNonNullRo
2e330 77 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74  w(p->pWhere, pIt
2e340 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20 20  em->iCursor).   
2e350 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
2e360 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
2e370 49 54 45 5f 53 69 6d 70 6c 69 66 79 4a 6f 69 6e  ITE_SimplifyJoin
2e380 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 53  ).    ){.      S
2e390 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30  ELECTTRACE(0x100
2e3a0 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20 20  ,pParse,p,.     
2e3b0 20 20 20 20 20 20 20 20 20 20 20 28 22 4c 45 46             ("LEF
2e3c0 54 2d 4a 4f 49 4e 20 73 69 6d 70 6c 69 66 69 65  T-JOIN simplifie
2e3d0 73 20 74 6f 20 4a 4f 49 4e 20 6f 6e 20 74 65 72  s to JOIN on ter
2e3e0 6d 20 25 64 5c 6e 22 2c 69 29 29 3b 0a 20 20 20  m %d\n",i));.   
2e3f0 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69     pItem->fg.joi
2e400 6e 74 79 70 65 20 26 3d 20 7e 28 4a 54 5f 4c 45  ntype &= ~(JT_LE
2e410 46 54 7c 4a 54 5f 4f 55 54 45 52 29 3b 0a 20 20  FT|JT_OUTER);.  
2e420 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70      unsetJoinExp
2e430 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74  r(p->pWhere, pIt
2e440 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
2e450 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 66    }..    /* No f
2e460 75 74 68 65 72 20 61 63 74 69 6f 6e 20 69 66 20  uther action if 
2e470 74 68 69 73 20 74 65 72 6d 20 6f 66 20 74 68 65  this term of the
2e480 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
2e490 6e 6f 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f  no a subquery */
2e4a0 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30  .    if( pSub==0
2e4b0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
2e4c0 20 20 2f 2a 20 43 61 74 63 68 20 6d 69 73 6d 61    /* Catch misma
2e4d0 74 63 68 20 69 6e 20 74 68 65 20 64 65 63 6c 61  tch in the decla
2e4e0 72 65 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61  red columns of a
2e4f0 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 6e 75   view and the nu
2e500 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 63  mber of.    ** c
2e510 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 53 45  olumns in the SE
2e520 4c 45 43 54 20 6f 6e 20 74 68 65 20 52 48 53 20  LECT on the RHS 
2e530 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  */.    if( pTab-
2e540 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e 70 45 4c  >nCol!=pSub->pEL
2e550 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
2e560 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2e570 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65 78 70  Msg(pParse, "exp
2e580 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73  ected %d columns
2e590 20 66 6f 72 20 27 25 73 27 20 62 75 74 20 67 6f   for '%s' but go
2e5a0 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  t %d",.         
2e5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
2e5c0 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 7a  b->nCol, pTab->z
2e5d0 4e 61 6d 65 2c 20 70 53 75 62 2d 3e 70 45 4c 69  Name, pSub->pELi
2e5e0 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
2e5f0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
2e600 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
2e610 20 44 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 66   Do not try to f
2e620 6c 61 74 74 65 6e 20 61 6e 20 61 67 67 72 65 67  latten an aggreg
2e630 61 74 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  ate subquery..  
2e640 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6c 61 74    **.    ** Flat
2e650 74 65 6e 69 6e 67 20 61 6e 20 61 67 67 72 65 67  tening an aggreg
2e660 61 74 65 20 73 75 62 71 75 65 72 79 20 69 73 20  ate subquery is 
2e670 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66  only possible if
2e680 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
2e690 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  .    ** is not a
2e6a0 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66 20 74   join.  But if t
2e6b0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
2e6c0 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2c 20 74 68  s not a join, th
2e6d0 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 79 0a  en the subquery.
2e6e0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 69      ** will be i
2e6f0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
2e700 63 6f 2d 72 6f 75 74 69 6e 65 20 61 6e 64 20 74  co-routine and t
2e710 68 65 72 65 20 69 73 20 6e 6f 20 61 64 76 61 6e  here is no advan
2e720 74 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 66  tage to.    ** f
2e730 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 74 68 61  lattening in tha
2e740 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  t case..    */. 
2e750 20 20 20 69 66 28 20 28 70 53 75 62 2d 3e 73 65     if( (pSub->se
2e760 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
2e770 65 67 61 74 65 29 21 3d 30 20 29 20 63 6f 6e 74  egate)!=0 ) cont
2e780 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
2e790 28 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79  ( pSub->pGroupBy
2e7a0 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ==0 );..    /* I
2e7b0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
2e7c0 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 22 63 6f  y contains a "co
2e7d0 6d 70 6c 65 78 22 20 72 65 73 75 6c 74 20 73 65  mplex" result se
2e7e0 74 20 28 74 68 61 74 20 69 73 2c 0a 20 20 20 20  t (that is,.    
2e7f0 2a 2a 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  ** if the result
2e800 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65   set of the oute
2e810 72 20 71 75 65 72 79 20 75 73 65 73 20 66 75 6e  r query uses fun
2e820 63 74 69 6f 6e 73 20 6f 72 20 73 75 62 71 75 65  ctions or subque
2e830 72 69 65 73 29 0a 20 20 20 20 2a 2a 20 61 6e 64  ries).    ** and
2e840 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
2e850 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 4f 52 44   contains an ORD
2e860 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
2e870 20 69 66 0a 20 20 20 20 2a 2a 20 69 74 20 77 69   if.    ** it wi
2e880 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ll be implemente
2e890 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e  d as a co-routin
2e8a0 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66  e, then do not f
2e8b0 6c 61 74 74 65 6e 2e 20 20 54 68 69 73 0a 20 20  latten.  This.  
2e8c0 20 20 2a 2a 20 72 65 73 74 72 69 63 74 69 6f 6e    ** restriction
2e8d0 20 61 6c 6c 6f 77 73 20 53 51 4c 20 63 6f 6e 73   allows SQL cons
2e8e0 74 72 75 63 74 73 20 6c 69 6b 65 20 74 68 69 73  tructs like this
2e8f0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2e900 20 53 45 4c 45 43 54 20 65 78 70 65 6e 73 69 76   SELECT expensiv
2e910 65 5f 66 75 6e 63 74 69 6f 6e 28 78 29 0a 20 20  e_function(x).  
2e920 20 20 2a 2a 20 20 20 20 46 52 4f 4d 20 28 53 45    **    FROM (SE
2e930 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 20  LECT x FROM tab 
2e940 4f 52 44 45 52 20 42 59 20 79 20 4c 49 4d 49 54  ORDER BY y LIMIT
2e950 20 31 30 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20   10);.    **.   
2e960 20 2a 2a 20 54 68 65 20 65 78 70 65 6e 73 69 76   ** The expensiv
2e970 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73 20  e_function() is 
2e980 6f 6e 6c 79 20 63 6f 6d 70 75 74 65 64 20 6f 6e  only computed on
2e990 20 74 68 65 20 31 30 20 72 6f 77 73 20 74 68 61   the 10 rows tha
2e9a0 74 0a 20 20 20 20 2a 2a 20 61 72 65 20 6f 75 74  t.    ** are out
2e9b0 70 75 74 2c 20 72 61 74 68 65 72 20 74 68 61 6e  put, rather than
2e9c0 20 65 76 65 72 79 20 72 6f 77 20 6f 66 20 74 68   every row of th
2e9d0 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a  e table..    **.
2e9e0 20 20 20 20 2a 2a 20 54 68 65 20 72 65 71 75 69      ** The requi
2e9f0 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20  rement that the 
2ea00 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 76 65  outer query have
2ea10 20 61 20 63 6f 6d 70 6c 65 78 20 72 65 73 75 6c   a complex resul
2ea20 74 20 73 65 74 0a 20 20 20 20 2a 2a 20 6d 65 61  t set.    ** mea
2ea30 6e 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69  ns that flatteni
2ea40 6e 67 20 64 6f 65 73 20 6f 63 63 75 72 20 6f 6e  ng does occur on
2ea50 20 73 69 6d 70 6c 65 72 20 53 51 4c 20 63 6f 6e   simpler SQL con
2ea60 73 74 72 61 69 6e 74 73 20 77 69 74 68 6f 75 74  straints without
2ea70 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 78 70 65  .    ** the expe
2ea80 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29  nsive_function()
2ea90 20 6c 69 6b 65 3a 0a 20 20 20 20 2a 2a 0a 20 20   like:.    **.  
2eaa0 20 20 2a 2a 20 20 53 45 4c 45 43 54 20 78 20 46    **  SELECT x F
2eab0 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52  ROM (SELECT x FR
2eac0 4f 4d 20 74 61 62 20 4f 52 44 45 52 20 42 59 20  OM tab ORDER BY 
2ead0 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a 20 20 20  y LIMIT 10);.   
2eae0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
2eaf0 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 0a 20 20  ->pOrderBy!=0.  
2eb00 20 20 20 26 26 20 69 3d 3d 30 0a 20 20 20 20 20     && i==0.     
2eb10 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  && (p->selFlags 
2eb20 26 20 53 46 5f 43 6f 6d 70 6c 65 78 52 65 73 75  & SF_ComplexResu
2eb30 6c 74 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  lt)!=0.     && (
2eb40 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
2eb50 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70  1.         || (p
2eb60 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67  TabList->a[1].fg
2eb70 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45  .jointype&(JT_LE
2eb80 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
2eb90 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63  ).    ){.      c
2eba0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
2ebb0 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53      if( flattenS
2ebc0 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20  ubquery(pParse, 
2ebd0 70 2c 20 69 2c 20 69 73 41 67 67 29 20 29 7b 0a  p, i, isAgg) ){.
2ebe0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75        /* This su
2ebf0 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62  bquery can be ab
2ec00 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20  sorbed into its 
2ec10 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  parent. */.     
2ec20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20   i = -1;.    }. 
2ec30 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
2ec40 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 64  >pSrc;.    if( d
2ec50 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2ec60 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
2ec70 64 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f  d;.    if( !Igno
2ec80 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65  rableOrderby(pDe
2ec90 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73 53 6f  st) ){.      sSo
2eca0 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  rt.pOrderBy = p-
2ecb0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d  >pOrderBy;.    }
2ecc0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
2ecd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2ece0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
2ecf0 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6d  .  /* Handle com
2ed00 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
2ed10 74 65 6d 65 6e 74 73 20 75 73 69 6e 67 20 74 68  tements using th
2ed20 65 20 73 65 70 61 72 61 74 65 20 6d 75 6c 74 69  e separate multi
2ed30 53 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70 72  Select().  ** pr
2ed40 6f 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20 20  ocedure..  */.  
2ed50 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
2ed60 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53  .    rc = multiS
2ed70 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
2ed80 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78 70   pDest);.    exp
2ed90 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
2eda0 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
2edb0 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74  , iRestoreSelect
2edc0 49 64 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  Id);.#if SELECTT
2edd0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
2ede0 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
2edf0 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f  Parse,p,("end co
2ee00 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72  mpound-select pr
2ee10 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 23  ocessing\n"));.#
2ee20 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
2ee30 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
2ee40 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 74  .  /* For each t
2ee50 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  erm in the FROM 
2ee60 63 6c 61 75 73 65 2c 20 64 6f 20 74 77 6f 20 74  clause, do two t
2ee70 68 69 6e 67 73 3a 0a 20 20 2a 2a 20 28 31 29 20  hings:.  ** (1) 
2ee80 41 75 74 68 6f 72 69 7a 65 64 20 75 6e 72 65 66  Authorized unref
2ee90 65 72 65 6e 63 65 64 20 74 61 62 6c 65 73 0a 20  erenced tables. 
2eea0 20 2a 2a 20 28 32 29 20 47 65 6e 65 72 61 74 65   ** (2) Generate
2eeb0 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
2eec0 62 2d 71 75 65 72 69 65 73 0a 20 20 2a 2f 0a 20  b-queries.  */. 
2eed0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
2eee0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
2eef0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
2ef00 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2ef10 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
2ef20 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65  i];.    SelectDe
2ef30 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c  st dest;.    Sel
2ef40 65 63 74 20 2a 70 53 75 62 3b 0a 23 69 66 20 21  ect *pSub;.#if !
2ef50 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2ef60 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
2ef70 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2ef80 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20 20  _OMIT_VIEW).    
2ef90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76  const char *zSav
2efa0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 23  edAuthContext;.#
2efb0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 73  endif..    /* Is
2efc0 73 75 65 20 53 51 4c 49 54 45 5f 52 45 41 44 20  sue SQLITE_READ 
2efd0 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73 20 77  authorizations w
2efe0 69 74 68 20 61 20 66 61 6b 65 20 63 6f 6c 75 6d  ith a fake colum
2eff0 6e 20 6e 61 6d 65 20 66 6f 72 20 61 6e 79 0a 20  n name for any. 
2f000 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 74 68 61     ** tables tha
2f010 74 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 64  t are referenced
2f020 20 62 75 74 20 66 72 6f 6d 20 77 68 69 63 68 20   but from which 
2f030 6e 6f 20 76 61 6c 75 65 73 20 61 72 65 20 65 78  no values are ex
2f040 74 72 61 63 74 65 64 2e 0a 20 20 20 20 2a 2a 20  tracted..    ** 
2f050 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 65 72  Examples of wher
2f060 65 20 74 68 65 73 65 20 6b 69 6e 64 73 20 6f 66  e these kinds of
2f070 20 6e 75 6c 6c 20 53 51 4c 49 54 45 5f 52 45 41   null SQLITE_REA
2f080 44 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73  D authorizations
2f090 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 6f 63  .    ** would oc
2f0a0 63 75 72 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  cur:.    **.    
2f0b0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f  **     SELECT co
2f0c0 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 20  unt(*) FROM t1; 
2f0d0 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44    -- SQLITE_READ
2f0e0 20 74 31 2e 22 22 0a 20 20 20 20 2a 2a 20 20 20   t1."".    **   
2f0f0 20 20 53 45 4c 45 43 54 20 74 31 2e 2a 20 46 52    SELECT t1.* FR
2f100 4f 4d 20 74 31 2c 20 74 32 3b 20 20 20 2d 2d 20  OM t1, t2;   -- 
2f110 53 51 4c 49 54 45 5f 52 45 41 44 20 74 32 2e 22  SQLITE_READ t2."
2f120 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ".    **.    ** 
2f130 54 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20  The fake column 
2f140 6e 61 6d 65 20 69 73 20 61 6e 20 65 6d 70 74 79  name is an empty
2f150 20 73 74 72 69 6e 67 2e 20 20 49 74 20 69 73 20   string.  It is 
2f160 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 74  possible for a t
2f170 61 62 6c 65 20 74 6f 0a 20 20 20 20 2a 2a 20 68  able to.    ** h
2f180 61 76 65 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ave a column nam
2f190 65 64 20 62 79 20 74 68 65 20 65 6d 70 74 79 20  ed by the empty 
2f1a0 73 74 72 69 6e 67 2c 20 69 6e 20 77 68 69 63 68  string, in which
2f1b0 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e   case there is n
2f1c0 6f 20 77 61 79 20 74 6f 0a 20 20 20 20 2a 2a 20  o way to.    ** 
2f1d0 64 69 73 74 69 6e 67 75 69 73 68 20 62 65 74 77  distinguish betw
2f1e0 65 65 6e 20 61 6e 20 75 6e 72 65 66 65 72 65 6e  een an unreferen
2f1f0 63 65 64 20 74 61 62 6c 65 20 61 6e 64 20 61 6e  ced table and an
2f200 20 61 63 74 75 61 6c 20 72 65 66 65 72 65 6e 63   actual referenc
2f210 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  e to the.    ** 
2f220 22 22 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 20 6f  "" column. The o
2f230 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 77  riginal design w
2f240 61 73 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20  as for the fake 
2f250 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74 6f 20 62  column name to b
2f260 65 20 61 20 4e 55 4c 4c 2c 0a 20 20 20 20 2a 2a  e a NULL,.    **
2f270 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20   which would be 
2f280 75 6e 61 6d 62 69 67 75 6f 75 73 2e 20 20 42 75  unambiguous.  Bu
2f290 74 20 6c 65 67 61 63 79 20 61 75 74 68 6f 72 69  t legacy authori
2f2a0 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73  zation callbacks
2f2b0 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 61 73   might.    ** as
2f2c0 73 75 6d 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  sume the column 
2f2d0 6e 61 6d 65 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  name is non-NULL
2f2e0 20 61 6e 64 20 73 65 67 66 61 75 6c 74 2e 20 20   and segfault.  
2f2f0 54 68 65 20 75 73 65 20 6f 66 20 61 6e 20 65 6d  The use of an em
2f300 70 74 79 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e  pty.    ** strin
2f310 67 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20 63  g for the fake c
2f320 6f 6c 75 6d 6e 20 6e 61 6d 65 20 73 65 65 6d 73  olumn name seems
2f330 20 73 61 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20   safer..    */. 
2f340 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 63 6f     if( pItem->co
2f350 6c 55 73 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  lUsed==0 ){.    
2f360 20 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65    sqlite3AuthChe
2f370 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
2f380 45 5f 52 45 41 44 2c 20 70 49 74 65 6d 2d 3e 7a  E_READ, pItem->z
2f390 4e 61 6d 65 2c 20 22 22 2c 20 70 49 74 65 6d 2d  Name, "", pItem-
2f3a0 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
2f3b0 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
2f3c0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
2f3d0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
2f3e0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
2f3f0 49 45 57 29 0a 20 20 20 20 2f 2a 20 47 65 6e 65  IEW).    /* Gene
2f400 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c  rate code for al
2f410 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e  l sub-queries in
2f420 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2f430 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 53 75 62  .    */.    pSub
2f440 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63   = pItem->pSelec
2f450 74 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d  t;.    if( pSub=
2f460 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  =0 ) continue;..
2f470 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73      /* Sometimes
2f480 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20   the code for a 
2f490 73 75 62 71 75 65 72 79 20 77 69 6c 6c 20 62 65  subquery will be
2f4a0 20 67 65 6e 65 72 61 74 65 64 20 6d 6f 72 65 20   generated more 
2f4b0 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65  than.    ** once
2f4c0 2c 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  , if the subquer
2f4d0 79 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  y is part of the
2f4e0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
2f4f0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20   a LEFT JOIN,.  
2f500 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65    ** for example
2f510 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
2f520 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72 61   do not regenera
2f530 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 6d  te the code to m
2f540 61 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a 20 61  anifest.    ** a
2f550 20 76 69 65 77 20 6f 72 20 74 68 65 20 63 6f 2d   view or the co-
2f560 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65  routine to imple
2f570 6d 65 6e 74 20 61 20 76 69 65 77 2e 20 20 54 68  ment a view.  Th
2f580 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65  e first instance
2f590 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 66 66 69  .    ** is suffi
2f5a0 63 69 65 6e 74 2c 20 74 68 6f 75 67 68 20 74 68  cient, though th
2f5b0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  e subroutine to 
2f5c0 6d 61 6e 69 66 65 73 74 20 74 68 65 20 76 69 65  manifest the vie
2f5d0 77 20 64 6f 65 73 20 6e 65 65 64 0a 20 20 20 20  w does need.    
2f5e0 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ** to be invoked
2f5f0 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69   again. */.    i
2f600 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  f( pItem->addrFi
2f610 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20 20 69  llSub ){.      i
2f620 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61  f( pItem->fg.via
2f630 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a  Coroutine==0 ){.
2f640 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
2f650 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d  ubroutine that m
2f660 61 6e 69 66 65 73 74 73 20 74 68 65 20 76 69 65  anifests the vie
2f670 77 20 6d 69 67 68 74 20 62 65 20 61 20 6f 6e 65  w might be a one
2f680 2d 74 69 6d 65 20 72 6f 75 74 69 6e 65 2c 0a 20  -time routine,. 
2f690 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 69 74 20         ** or it 
2f6a0 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65  might need to be
2f6b0 20 72 65 72 75 6e 20 6f 6e 20 65 61 63 68 20 69   rerun on each i
2f6c0 74 65 72 61 74 69 6f 6e 20 62 65 63 61 75 73 65  teration because
2f6d0 20 69 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   it.        ** e
2f6e0 6e 63 6f 64 65 73 20 61 20 63 6f 72 72 65 6c 61  ncodes a correla
2f6f0 74 65 64 20 73 75 62 71 75 65 72 79 2e 20 2a 2f  ted subquery. */
2f700 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2f710 65 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  e( sqlite3VdbeGe
2f720 74 4f 70 28 76 2c 20 70 49 74 65 6d 2d 3e 61 64  tOp(v, pItem->ad
2f730 64 72 46 69 6c 6c 53 75 62 29 2d 3e 6f 70 63 6f  drFillSub)->opco
2f740 64 65 3d 3d 4f 50 5f 4f 6e 63 65 20 29 3b 0a 20  de==OP_Once );. 
2f750 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2f760 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2f770 6f 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67  osub, pItem->reg
2f780 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61  Return, pItem->a
2f790 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20  ddrFillSub);.   
2f7a0 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69     }.      conti
2f7b0 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
2f7c0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72  /* Increment Par
2f7d0 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68  se.nHeight by th
2f7e0 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20  e height of the 
2f7f0 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73 69  largest expressi
2f800 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72  on.    ** tree r
2f810 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 74 68  eferred to by th
2f820 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73  is, the parent s
2f830 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64  elect. The child
2f840 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d   select.    ** m
2f850 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65  ay contain expre
2f860 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61  ssion trees of a
2f870 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53  t most.    ** (S
2f880 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
2f890 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67  EPTH-Parse.nHeig
2f8a0 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73  ht) height. This
2f8b0 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a   is a bit.    **
2f8c0 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69   more conservati
2f8d0 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72  ve than necessar
2f8e0 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69  y, but much easi
2f8f0 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e  er than enforcin
2f900 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63  g.    ** an exac
2f910 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a  t limit..    */.
2f920 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
2f930 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65  ght += sqlite3Se
2f940 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
2f950 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  );..    /* Make 
2f960 63 6f 70 69 65 73 20 6f 66 20 63 6f 6e 73 74 61  copies of consta
2f970 6e 74 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20  nt WHERE-clause 
2f980 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6f 75 74  terms in the out
2f990 65 72 20 71 75 65 72 79 20 64 6f 77 6e 0a 20 20  er query down.  
2f9a0 20 20 2a 2a 20 69 6e 73 69 64 65 20 74 68 65 20    ** inside the 
2f9b0 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20  subquery.  This 
2f9c0 63 61 6e 20 68 65 6c 70 20 74 68 65 20 73 75 62  can help the sub
2f9d0 71 75 65 72 79 20 74 6f 20 72 75 6e 20 6d 6f 72  query to run mor
2f9e0 65 20 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a 20  e efficiently.. 
2f9f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4f 70     */.    if( Op
2fa00 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
2fa10 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 50 75 73  d(db, SQLITE_Pus
2fa20 68 44 6f 77 6e 29 0a 20 20 20 20 20 26 26 20 70  hDown).     && p
2fa30 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d  ushDownWhereTerm
2fa40 73 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20  s(pParse, pSub, 
2fa50 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d  p->pWhere, pItem
2fa60 2d 3e 69 43 75 72 73 6f 72 2c 0a 20 20 20 20 20  ->iCursor,.     
2fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa80 20 20 20 20 20 20 28 70 49 74 65 6d 2d 3e 66 67        (pItem->fg
2fa90 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
2faa0 55 54 45 52 29 21 3d 30 29 0a 20 20 20 20 29 7b  UTER)!=0).    ){
2fab0 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
2fac0 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 69  _ENABLED.      i
2fad0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2fae0 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
2faf0 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 54  .        SELECTT
2fb00 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
2fb10 65 2c 70 2c 28 22 41 66 74 65 72 20 57 48 45 52  e,p,("After WHER
2fb20 45 2d 63 6c 61 75 73 65 20 70 75 73 68 2d 64 6f  E-clause push-do
2fb30 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  wn:\n"));.      
2fb40 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2fb50 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
2fb60 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
2fb70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2fb80 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2fb90 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 50  100,pParse,p,("P
2fba0 75 73 68 2d 64 6f 77 6e 20 6e 6f 74 20 70 6f 73  ush-down not pos
2fbb0 73 69 62 6c 65 5c 6e 22 29 29 3b 0a 20 20 20 20  sible\n"));.    
2fbc0 7d 0a 0a 20 20 20 20 7a 53 61 76 65 64 41 75 74  }..    zSavedAut
2fbd0 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73  hContext = pPars
2fbe0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b  e->zAuthContext;
2fbf0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  .    pParse->zAu
2fc00 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49 74 65  thContext = pIte
2fc10 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f  m->zName;..    /
2fc20 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2fc30 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
2fc40 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2a   subquery.    **
2fc50 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 75 62 71  .    ** The subq
2fc60 75 65 72 79 20 69 73 20 69 6d 70 6c 65 6d 65 6e  uery is implemen
2fc70 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74  ted as a co-rout
2fc80 69 6e 65 20 69 66 20 74 68 65 20 73 75 62 71 75  ine if the subqu
2fc90 65 72 79 20 69 73 0a 20 20 20 20 2a 2a 20 67 75  ery is.    ** gu
2fca0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 74  aranteed to be t
2fcb0 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 28 73  he outer loop (s
2fcc0 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  o that it does n
2fcd0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
2fce0 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 6d 6f    ** computed mo
2fcf0 72 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a 20 20  re than once).  
2fd00 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f    **.    ** TODO
2fd10 3a 20 41 72 65 20 74 68 65 72 65 20 6f 74 68 65  : Are there othe
2fd20 72 20 72 65 61 73 6f 6e 73 20 62 65 73 69 64 65  r reasons beside
2fd30 20 28 31 29 20 74 6f 20 75 73 65 20 61 20 63 6f   (1) to use a co
2fd40 2d 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20  -routine.    ** 
2fd50 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 3f 0a  implementation?.
2fd60 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
2fd70 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 61  ==0.     && (pTa
2fd80 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20  bList->nSrc==1. 
2fd90 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
2fda0 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67  TabList->a[1].fg
2fdb0 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45  .jointype&(JT_LE
2fdc0 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
2fdd0 29 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20  )  /* (1) */.   
2fde0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70   ){.      /* Imp
2fdf0 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74  lement a co-rout
2fe00 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ine that will re
2fe10 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f  turn a single ro
2fe20 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a  w of the result.
2fe30 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20        ** set on 
2fe40 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  each invocation.
2fe50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2fe60 69 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73 71  int addrTop = sq
2fe70 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2fe80 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20 20  Addr(v)+1;.     
2fe90 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  .      pItem->re
2fea0 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72  gReturn = ++pPar
2feb0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2fec0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2fed0 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
2fee0 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65  utine, pItem->re
2fef0 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72  gReturn, 0, addr
2ff00 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Top);.      Vdbe
2ff10 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
2ff20 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
2ff30 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49  Name));.      pI
2ff40 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2ff50 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20   = addrTop;.    
2ff60 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
2ff70 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
2ff80 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49  RT_Coroutine, pI
2ff90 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
2ffa0 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
2ffb0 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e  tInteger(pItem->
2ffc0 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70  iSelectId, (u8)p
2ffd0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
2ffe0 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ctId);.      sql
2fff0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
30000 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b  e, pSub, &dest);
30010 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54  .      pItem->pT
30020 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
30030 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f   pSub->nSelectRo
30040 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  w;.      pItem->
30050 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
30060 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  = 1;.      pItem
30070 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65  ->regResult = de
30080 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20  st.iSdst;.      
30090 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f  sqlite3VdbeEndCo
300a0 72 6f 75 74 69 6e 65 28 76 2c 20 70 49 74 65 6d  routine(v, pItem
300b0 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
300c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
300d0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
300e0 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  op-1);.      sql
300f0 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
30100 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20  Cache(pParse);. 
30110 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30120 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
30130 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
30140 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d  ll fill an ephem
30150 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a  eral table with.
30160 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e        ** the con
30170 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62  tent of this sub
30180 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61  query.  pItem->a
30190 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20  ddrFillSub will 
301a0 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74  point.      ** t
301b0 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  o the address of
301c0 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 73   the generated s
301d0 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65  ubroutine.  pIte
301e0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20  m->regReturn.   
301f0 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73     ** is a regis
30200 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ter allocated to
30210 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75   hold the subrou
30220 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72  tine return addr
30230 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ess.      */.   
30240 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a     int topAddr;.
30250 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64        int onceAd
30260 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  dr = 0;.      in
30270 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20  t retAddr;.     
30280 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
30290 69 74 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a 20  item *pPrior;.. 
302a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
302b0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d  em->addrFillSub=
302c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65  =0 );.      pIte
302d0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  m->regReturn = +
302e0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
302f0 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73       topAddr = s
30300 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
30310 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
30320 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  0, pItem->regRet
30330 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65  urn);.      pIte
30340 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
30350 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20   topAddr+1;.    
30360 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
30370 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20  isCorrelated==0 
30380 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
30390 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
303a0 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20   not correlated 
303b0 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f  and if we are no
303c0 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20  t inside of.    
303d0 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72      ** a trigger
303e0 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e  , then we only n
303f0 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
30400 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
30410 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20  subquery.       
30420 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20   ** once. */.   
30430 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20       onceAddr = 
30440 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30450 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56  0(v, OP_Once); V
30460 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
30470 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
30480 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61  ent((v, "materia
30490 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49  lize \"%s\"", pI
304a0 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
304b0 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
304c0 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f  .        VdbeNoo
304d0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61  pComment((v, "ma
304e0 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22  terialize \"%s\"
304f0 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
30500 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d  zName));.      }
30510 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20  .      pPrior = 
30520 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 70  isSelfJoinView(p
30530 54 61 62 4c 69 73 74 2c 20 70 49 74 65 6d 29 3b  TabList, pItem);
30540 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f  .      if( pPrio
30550 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
30560 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
30570 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 49  , OP_OpenDup, pI
30580 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50  tem->iCursor, pP
30590 72 69 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  rior->iCursor);.
305a0 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53          explainS
305b0 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
305c0 3e 69 53 65 6c 65 63 74 49 64 2c 20 70 50 72 69  >iSelectId, pPri
305d0 6f 72 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a  or->iSelectId);.
305e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
305f0 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 21  pPrior->pSelect!
30600 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53  =0 );.        pS
30610 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d  ub->nSelectRow =
30620 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74   pPrior->pSelect
30630 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
30640 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30650 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
30660 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
30670 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49  SRT_EphemTab, pI
30680 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
30690 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65         explainSe
306a0 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e  tInteger(pItem->
306b0 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70  iSelectId, (u8)p
306c0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
306d0 63 74 49 64 29 3b 0a 20 20 20 20 20 20 20 20 73  ctId);.        s
306e0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
306f0 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
30700 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
30710 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52   pItem->pTab->nR
30720 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d  owLogEst = pSub-
30730 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
30740 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20     if( onceAddr 
30750 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
30760 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64  pHere(v, onceAdd
30770 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64  r);.      retAdd
30780 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
30790 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
307a0 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  rn, pItem->regRe
307b0 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62  turn);.      Vdb
307c0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
307d0 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54  d %s", pItem->pT
307e0 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
307f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
30800 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64  angeP1(v, topAdd
30810 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20  r, retAddr);.   
30820 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54     sqlite3ClearT
30830 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72  empRegCache(pPar
30840 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  se);.    }.    i
30850 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
30860 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  led ) goto selec
30870 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61 72 73  t_end;.    pPars
30880 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71  e->nHeight -= sq
30890 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
308a0 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 50  eight(p);.    pP
308b0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
308c0 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
308d0 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 20  ontext;.#endif. 
308e0 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73   }..  /* Various
308f0 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
30900 20 53 45 4c 45 43 54 20 63 6f 70 69 65 64 20 69   SELECT copied i
30910 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  nto local variab
30920 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e  les for.  ** con
30930 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45  venience */.  pE
30940 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
30950 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  ;.  pWhere = p->
30960 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70  pWhere;.  pGroup
30970 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
30980 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d  ;.  pHaving = p-
30990 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73  >pHaving;.  sDis
309a0 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28  tinct.isTnct = (
309b0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
309c0 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a  _Distinct)!=0;..
309d0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
309e0 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
309f0 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
30a00 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
30a10 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30  SELECTTRACE(0x40
30a20 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74  0,pParse,p,("Aft
30a30 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  er all FROM-clau
30a40 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29  se analysis:\n")
30a50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
30a60 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
30a70 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
30a80 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
30a90 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54  _COUNTOFVIEW_OPT
30aa0 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  IMIZATION.  if( 
30ab0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
30ac0 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51  led(db, SQLITE_Q
30ad0 75 65 72 79 46 6c 61 74 74 65 6e 65 72 7c 53 51  ueryFlattener|SQ
30ae0 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65 77  LITE_CountOfView
30af0 29 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f 66 56  ).   && countOfV
30b00 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28  iewOptimization(
30b10 70 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b 0a  pParse, p).  ){.
30b20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
30b30 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
30b40 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
30b50 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
30b60 73 74 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  st;.    pTabList
30b70 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d 0a   = p->pSrc;.  }.
30b80 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
30b90 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53  the query is DIS
30ba0 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52  TINCT with an OR
30bb0 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f  DER BY but is no
30bc0 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20  t an aggregate, 
30bd0 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65  and .  ** if the
30be0 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20   select-list is 
30bf0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
30c00 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74  ORDER BY list, t
30c10 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20  hen this query. 
30c20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69   ** can be rewri
30c30 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20  tten as a GROUP 
30c40 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  BY. In other wor
30c50 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ds, this:.  **. 
30c60 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44   **     SELECT D
30c70 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d  ISTINCT xyz FROM
30c80 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79   ... ORDER BY xy
30c90 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74  z.  **.  ** is t
30ca0 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20  ransformed to:. 
30cb0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
30cc0 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e  ECT xyz FROM ...
30cd0 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f 52   GROUP BY xyz OR
30ce0 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a  DER BY xyz.  **.
30cf0 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20    ** The second 
30d00 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65  form is preferre
30d10 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e  d as a single in
30d20 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62  dex (or temp-tab
30d30 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a  le) may be .  **
30d40 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74   used for both t
30d50 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20  he ORDER BY and 
30d60 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73  DISTINCT process
30d70 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c  ing. As original
30d80 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e  ly .  ** written
30d90 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20   the query must 
30da0 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65  use a temp-table
30db0 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e   for at least on
30dc0 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a  e of the ORDER .
30dd0 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54    ** BY and DIST
30de0 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64  INCT, and an ind
30df0 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74  ex or separate t
30e00 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68  emp-table for th
30e10 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20  e other..  */.  
30e20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
30e30 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
30e40 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
30e50 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20  SF_Distinct .   
30e60 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  && sqlite3ExprLi
30e70 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e  stCompare(sSort.
30e80 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73 74  pOrderBy, pEList
30e90 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20  , -1)==0.  ){.  
30ea0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
30eb0 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20   ~SF_Distinct;. 
30ec0 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
30ed0 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
30ee0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
30ef0 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20  b, pEList, 0);. 
30f00 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61     /* Notice tha
30f10 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53  t even thought S
30f20 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20 62  F_Distinct has b
30f30 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d  een cleared from
30f40 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20   p->selFlags,.  
30f50 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e    ** the sDistin
30f60 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69  ct.isTnct is sti
30f70 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20  ll set.  Hence, 
30f80 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74  isTnct represent
30f90 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69  s the.    ** ori
30fa0 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66  ginal setting of
30fb0 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74   the SF_Distinct
30fc0 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63   flag, not the c
30fd0 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a  urrent setting *
30fe0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 44  /.    assert( sD
30ff0 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29  istinct.isTnct )
31000 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
31010 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69  CE_ENABLED.    i
31020 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
31030 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b  Trace & 0x400 ){
31040 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
31050 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c  CE(0x400,pParse,
31060 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20 44 49  p,("Transform DI
31070 53 54 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f 55  STINCT into GROU
31080 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  P BY:\n"));.    
31090 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
310a0 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
310b0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
310c0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
310d0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
310e0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63 72   clause, then cr
310f0 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61  eate an ephemera
31100 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a 20  l index to.  ** 
31110 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e 20  do the sorting. 
31120 20 42 75 74 20 74 68 69 73 20 73 6f 72 74 69 6e   But this sortin
31130 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  g ephemeral inde
31140 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a 20  x might end up. 
31150 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65 64   ** being unused
31160 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e   if the data can
31170 20 62 65 20 65 78 74 72 61 63 74 65 64 20 69 6e   be extracted in
31180 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65   pre-sorted orde
31190 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74 20  r..  ** If that 
311a0 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
311b0 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  n the OP_OpenEph
311c0 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
311d0 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  on will be.  ** 
311e0 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50  changed to an OP
311f0 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66 69  _Noop once we fi
31200 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68  gure out that th
31210 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
31220 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64  is.  ** not need
31230 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e 61  ed.  The sSort.a
31240 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61 72  ddrSortIndex var
31250 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
31260 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a 2a   facilitate.  **
31270 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20   that change..  
31280 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70  */.  if( sSort.p
31290 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b  OrderBy ){.    K
312a0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
312b0 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
312c0 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
312d0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73 53 6f  List(pParse, sSo
312e0 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20  rt.pOrderBy, 0, 
312f0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
31300 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73      sSort.iECurs
31310 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
31320 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61  b++;.    sSort.a
31330 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20  ddrSortIndex =. 
31340 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
31350 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
31360 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
31370 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75        sSort.iECu
31380 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64  rsor, sSort.pOrd
31390 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45  erBy->nExpr+1+pE
313a0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a  List->nExpr, 0,.
313b0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
313c0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
313d0 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20  YINFO.      );. 
313e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72   }else{.    sSor
313f0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
31400 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
31410 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
31420 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
31430 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
31440 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
31450 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  ..  */.  if( pDe
31460 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
31470 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73  phemTab ){.    s
31480 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
31490 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
314a0 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44  eral, pDest->iSD
314b0 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Parm, pEList->nE
314c0 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  xpr);.  }..  /* 
314d0 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e  Set the limiter.
314e0 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73  .  */.  iEnd = s
314f0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
31500 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 28 70  bel(v);.  if( (p
31510 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
31520 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20 29  FixedLimit)==0 )
31530 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74  {.    p->nSelect
31540 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34  Row = 320;  /* 4
31550 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f   billion rows */
31560 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c 69  .  }.  computeLi
31570 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
31580 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20  rse, p, iEnd);. 
31590 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d   if( p->iLimit==
315a0 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72 53  0 && sSort.addrS
315b0 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20  ortIndex>=0 ){. 
315c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
315d0 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73 53  angeOpcode(v, sS
315e0 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
315f0 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  x, OP_SorterOpen
31600 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72  );.    sSort.sor
31610 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c  tFlags |= SORTFL
31620 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20  AG_UseSorter;.  
31630 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 20  }..  /* Open an 
31640 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
31650 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
31660 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a  istinct set..  *
31670 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
31680 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
31690 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e  t ){.    sDistin
316a0 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61  ct.tabTnct = pPa
316b0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
316c0 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54   sDistinct.addrT
316d0 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nct = sqlite3Vdb
316e0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
316f0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
31700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31710 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69            sDisti
31720 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20  nct.tabTnct, 0, 
31730 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
31740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31750 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72  (char*)keyInfoFr
31760 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
31770 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30  e, p->pEList,0,0
31780 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
31790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317a0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
317b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
317c0 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e  geP5(v, BTREE_UN
317d0 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73 44  ORDERED);.    sD
317e0 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
317f0 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e = WHERE_DISTIN
31800 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20  CT_UNORDERED;.  
31810 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73 74  }else{.    sDist
31820 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
31830 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
31840 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  NOOP;.  }..  if(
31850 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75   !isAgg && pGrou
31860 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBy==0 ){.    /*
31870 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   No aggregate fu
31880 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47  nctions and no G
31890 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
318a0 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c 46  /.    u16 wctrlF
318b0 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e 63  lags = (sDistinc
318c0 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52 45  t.isTnct ? WHERE
318d0 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a  _WANT_DISTINCT :
318e0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
318f0 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54   WHERE_USE_LIMIT
31900 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 20  ==SF_FixedLimit 
31910 29 3b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67  );.    wctrlFlag
31920 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  s |= p->selFlags
31930 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74   & SF_FixedLimit
31940 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  ;..    /* Begin 
31950 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
31960 6e 2e 20 2a 2f 0a 20 20 20 20 53 45 4c 45 43 54  n. */.    SELECT
31970 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
31980 2c 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e 22  ,("WhereBegin\n"
31990 29 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d  ));.    pWInfo =
319a0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
319b0 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
319c0 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f  ist, pWhere, sSo
319d0 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20  rt.pOrderBy,.   
319e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319f0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
31a00 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67  EList, wctrlFlag
31a10 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  s, p->nSelectRow
31a20 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
31a30 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
31a40 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  ct_end;.    if( 
31a50 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
31a60 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
31a70 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52  o) < p->nSelectR
31a80 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  ow ){.      p->n
31a90 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
31aa0 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
31ab0 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a  wCount(pWInfo);.
31ac0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44      }.    if( sD
31ad0 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26  istinct.isTnct &
31ae0 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  & sqlite3WhereIs
31af0 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29  Distinct(pWInfo)
31b00 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69   ){.      sDisti
31b10 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
31b20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69  sqlite3WhereIsDi
31b30 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a  stinct(pWInfo);.
31b40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 53      }.    if( sS
31b50 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ort.pOrderBy ){.
31b60 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53        sSort.nOBS
31b70 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  at = sqlite3Wher
31b80 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66  eIsOrdered(pWInf
31b90 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e  o);.      sSort.
31ba0 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f  bOrderedInnerLoo
31bb0 70 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  p = sqlite3Where
31bc0 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70  OrderedInnerLoop
31bd0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
31be0 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74  if( sSort.nOBSat
31bf0 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ==sSort.pOrderBy
31c00 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
31c10 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
31c20 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 0;.      }. 
31c30 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
31c40 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
31c50 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62  at was created b
31c60 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65  y a prior OP_Ope
31c70 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20  nEphemeral .    
31c80 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65  ** instruction e
31c90 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e  nded up not bein
31ca0 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63  g needed, then c
31cb0 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65  hange the OP_Ope
31cc0 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a  nEphemeral.    *
31cd0 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  * into an OP_Noo
31ce0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  p..    */.    if
31cf0 28 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  ( sSort.addrSort
31d00 49 6e 64 65 78 3e 3d 30 20 26 26 20 73 53 6f 72  Index>=0 && sSor
31d10 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  t.pOrderBy==0 ){
31d20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
31d30 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
31d40 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  , sSort.addrSort
31d50 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20  Index);.    }.. 
31d60 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74     /* Use the st
31d70 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f  andard inner loo
31d80 70 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p. */.    assert
31d90 28 20 70 2d 3e 70 45 4c 69 73 74 3d 3d 70 45 4c  ( p->pEList==pEL
31da0 69 73 74 20 29 3b 0a 20 20 20 20 73 65 6c 65 63  ist );.    selec
31db0 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
31dc0 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72 74  e, p, -1, &sSort
31dd0 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44  , &sDistinct, pD
31de0 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
31df0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31e00 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62  WhereContinueLab
31e10 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20  el(pWInfo),.    
31e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e30 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
31e40 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b  kLabel(pWInfo));
31e50 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65  ..    /* End the
31e60 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c   database scan l
31e70 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
31e80 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
31e90 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65  pWInfo);.  }else
31ea0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
31eb0 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65 78  se when there ex
31ec0 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66 75  ist aggregate fu
31ed0 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f  nctions or a GRO
31ee0 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20  UP BY clause.   
31ef0 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20   ** or both */. 
31f00 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
31f10 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63  NC;    /* Name c
31f20 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65  ontext for proce
31f30 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20  ssing aggregate 
31f40 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
31f50 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20     int iAMem;   
31f60 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
31f70 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
31f80 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20  storing current 
31f90 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
31fa0 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20  int iBMem;      
31fb0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
31fc0 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65   address for pre
31fd0 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a  vious GROUP BY *
31fe0 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c  /.    int iUseFl
31ff0 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d  ag;       /* Mem
32000 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67   address holding
32010 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67   flag indicating
32020 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20   that at least. 
32030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32040 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f         ** one ro
32050 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74  w of the input t
32060 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72  o the aggregator
32070 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20   has been.      
32080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32090 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a    ** processed *
320a0 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74  /.    int iAbort
320b0 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d  Flag;     /* Mem
320c0 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63   address which c
320d0 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72  auses query abor
320e0 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f  t if positive */
320f0 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79  .    int groupBy
32100 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73  Sort;    /* Rows
32110 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63   come from sourc
32120 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  e in GROUP BY or
32130 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  der */.    int a
32140 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f  ddrEnd;        /
32150 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73  * End of process
32160 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c  ing for this SEL
32170 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ECT */.    int s
32180 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f  ortPTab = 0;   /
32190 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73  * Pseudotable us
321a0 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72  ed to decode sor
321b0 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a  ting results */.
321c0 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20      int sortOut 
321d0 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75  = 0;    /* Outpu
321e0 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20  t register from 
321f0 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20  the sorter */.  
32200 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72 70    int orderByGrp
32210 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66   = 0; /* True if
32220 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 6e   the GROUP BY an
32230 64 20 4f 52 44 45 52 20 42 59 20 61 72 65 20 74  d ORDER BY are t
32240 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20 20  he same */..    
32250 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e  /* Remove any an
32260 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65  d all aliases be
32270 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74  tween the result
32280 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20   set and the.   
32290 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61   ** GROUP BY cla
322a0 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  use..    */.    
322b0 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
322c0 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20        int k;    
322d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
322e0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
322f0 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  ter */.      str
32300 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
32310 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f  m *pItem;  /* Fo
32320 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65  r looping over e
32330 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c  xpression in a l
32340 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f  ist */..      fo
32350 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  r(k=p->pEList->n
32360 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70  Expr, pItem=p->p
32370 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b  EList->a; k>0; k
32380 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
32390 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78        pItem->u.x
323a0 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  .iAlias = 0;.   
323b0 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b     }.      for(k
323c0 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  =pGroupBy->nExpr
323d0 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79  , pItem=pGroupBy
323e0 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70  ->a; k>0; k--, p
323f0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
32400 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69   pItem->u.x.iAli
32410 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  as = 0;.      }.
32420 20 20 20 20 20 20 61 73 73 65 72 74 28 20 36 36        assert( 66
32430 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
32440 31 30 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66  100) );.      if
32450 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  ( p->nSelectRow>
32460 36 36 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  66 ) p->nSelectR
32470 6f 77 20 3d 20 36 36 3b 0a 20 20 20 20 7d 65 6c  ow = 66;.    }el
32480 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
32490 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  ( 0==sqlite3LogE
324a0 73 74 28 31 29 20 29 3b 0a 20 20 20 20 20 20 70  st(1) );.      p
324b0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30  ->nSelectRow = 0
324c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
324d0 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68  If there is both
324e0 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20   a GROUP BY and 
324f0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
32500 73 65 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a  se and they are.
32510 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c      ** identical
32520 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62 65  , then it may be
32530 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 69 73   possible to dis
32540 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42  able the ORDER B
32550 59 20 63 6c 61 75 73 65 20 0a 20 20 20 20 2a 2a  Y clause .    **
32560 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64 73 20   on the grounds 
32570 74 68 61 74 20 74 68 65 20 47 52 4f 55 50 20 42  that the GROUP B
32580 59 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65  Y will cause ele
32590 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75  ments to come ou
325a0 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  t .    ** in the
325b0 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20   correct order. 
325c0 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74 20  It also may not 
325d0 2d 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 6d  - the GROUP BY m
325e0 69 67 68 74 20 75 73 65 20 61 0a 20 20 20 20 2a  ight use a.    *
325f0 2a 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  * database index
32600 20 74 68 61 74 20 63 61 75 73 65 73 20 72 6f 77   that causes row
32610 73 20 74 6f 20 62 65 20 67 72 6f 75 70 65 64 20  s to be grouped 
32620 74 6f 67 65 74 68 65 72 20 61 73 20 72 65 71 75  together as requ
32630 69 72 65 64 0a 20 20 20 20 2a 2a 20 62 75 74 20  ired.    ** but 
32640 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 73 6f 72  not actually sor
32650 74 65 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ted. Either way,
32660 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
32670 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
32680 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47 52   ORDER BY and GR
32690 4f 55 50 20 42 59 20 63 6c 61 75 73 65 73 20 61  OUP BY clauses a
326a0 72 65 20 74 68 65 20 73 61 6d 65 20 62 79 20 73  re the same by s
326b0 65 74 74 69 6e 67 20 74 68 65 20 6f 72 64 65 72  etting the order
326c0 42 79 47 72 70 0a 20 20 20 20 2a 2a 20 76 61 72  ByGrp.    ** var
326d0 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69  iable.  */.    i
326e0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
326f0 73 74 43 6f 6d 70 61 72 65 28 70 47 72 6f 75 70  stCompare(pGroup
32700 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  By, sSort.pOrder
32710 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  By, -1)==0 ){.  
32720 20 20 20 20 6f 72 64 65 72 42 79 47 72 70 20 3d      orderByGrp =
32730 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20   1;.    }. .    
32740 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62 65  /* Create a labe
32750 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65  l to jump to whe
32760 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f  n we want to abo
32770 72 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  rt the query */.
32780 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71      addrEnd = sq
32790 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
327a0 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  el(v);..    /* C
327b0 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e  onvert TK_COLUMN
327c0 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41   nodes into TK_A
327d0 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61  GG_COLUMN and ma
327e0 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ke entries in.  
327f0 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f    ** sAggInfo fo
32800 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e  r all TK_AGG_FUN
32810 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65  CTION nodes in e
32820 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
32830 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  e.    ** SELECT 
32840 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a  statement..    *
32850 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  /.    memset(&sN
32860 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
32870 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72  ));.    sNC.pPar
32880 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
32890 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
328a0 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e  pTabList;.    sN
328b0 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41  C.pAggInfo = &sA
328c0 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67  ggInfo;.    sAgg
328d0 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61  Info.mnReg = pPa
328e0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
328f0 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
32900 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75  ngColumn = pGrou
32910 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e  pBy ? pGroupBy->
32920 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 73  nExpr : 0;.    s
32930 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79  AggInfo.pGroupBy
32940 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20   = pGroupBy;.   
32950 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
32960 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
32970 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71   pEList);.    sq
32980 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
32990 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 53  AggList(&sNC, sS
329a0 6f 72 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20  ort.pOrderBy);. 
329b0 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
329c0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 47 72 6f  {.      if( pGro
329d0 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  upBy ){.        
329e0 61 73 73 65 72 74 28 20 70 57 68 65 72 65 3d 3d  assert( pWhere==
329f0 70 2d 3e 70 57 68 65 72 65 20 29 3b 0a 20 20 20  p->pWhere );.   
32a00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48 61       assert( pHa
32a10 76 69 6e 67 3d 3d 70 2d 3e 70 48 61 76 69 6e 67  ving==p->pHaving
32a20 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
32a30 72 74 28 20 70 47 72 6f 75 70 42 79 3d 3d 70 2d  rt( pGroupBy==p-
32a40 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20 20  >pGroupBy );.   
32a50 20 20 20 20 20 68 61 76 69 6e 67 54 6f 57 68 65       havingToWhe
32a60 72 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  re(pParse, p);. 
32a70 20 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20         pWhere = 
32a80 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20  p->pWhere;.     
32a90 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
32aa0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
32ab0 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76  gates(&sNC, pHav
32ac0 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ing);.    }.    
32ad0 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75  sAggInfo.nAccumu
32ae0 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f  lator = sAggInfo
32af0 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66  .nColumn;.    if
32b00 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
32b10 20 26 26 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d   && p->pHaving==
32b20 30 20 26 26 20 73 41 67 67 49 6e 66 6f 2e 6e 46  0 && sAggInfo.nF
32b30 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  unc==1 ){.      
32b40 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20 6d 69 6e  minMaxFlag = min
32b50 4d 61 78 51 75 65 72 79 28 64 62 2c 20 73 41 67  MaxQuery(db, sAg
32b60 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 70  gInfo.aFunc[0].p
32b70 45 78 70 72 2c 20 26 70 4d 69 6e 4d 61 78 4f 72  Expr, &pMinMaxOr
32b80 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 65 6c 73  derBy);.    }els
32b90 65 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78 46  e{.      minMaxF
32ba0 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  lag = WHERE_ORDE
32bb0 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  RBY_NORMAL;.    
32bc0 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
32bd0 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
32be0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
32bf0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
32c00 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61  perty(sAggInfo.a
32c10 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45  Func[i].pExpr, E
32c20 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
32c30 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
32c40 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e  s |= NC_InAggFun
32c50 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
32c60 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
32c70 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66  st(&sNC, sAggInf
32c80 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
32c90 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
32ca0 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d    sNC.ncFlags &=
32cb0 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a   ~NC_InAggFunc;.
32cc0 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
32cd0 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73  fo.mxReg = pPars
32ce0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28  e->nMem;.    if(
32cf0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
32d00 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
32d10 65 6e 64 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  end;.#if SELECTT
32d20 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
32d30 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
32d40 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20  ctTrace & 0x400 
32d50 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
32d60 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
32d70 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c  CE(0x400,pParse,
32d80 70 2c 28 22 41 66 74 65 72 20 61 67 67 72 65 67  p,("After aggreg
32d90 61 74 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22  ate analysis:\n"
32da0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
32db0 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
32dc0 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, p, 0);.      
32dd0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41 67  for(ii=0; ii<sAg
32de0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
32df0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
32e00 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
32e10 28 22 61 67 67 2d 63 6f 6c 75 6d 6e 5b 25 64 5d  ("agg-column[%d]
32e20 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20   iMem=%d\n",.   
32e30 20 20 20 20 20 20 20 20 20 69 69 2c 20 73 41 67           ii, sAg
32e40 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e 69  gInfo.aCol[ii].i
32e50 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Mem);.        sq
32e60 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
32e70 72 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43  r(0, sAggInfo.aC
32e80 6f 6c 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 29  ol[ii].pExpr, 0)
32e90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32ea0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41 67  for(ii=0; ii<sAg
32eb0 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 69 2b  gInfo.nFunc; ii+
32ec0 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
32ed0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
32ee0 61 67 67 2d 66 75 6e 63 5b 25 64 5d 3a 20 69 4d  agg-func[%d]: iM
32ef0 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  em=%d\n",.      
32f00 20 20 20 20 20 20 69 69 2c 20 73 41 67 67 49 6e        ii, sAggIn
32f10 66 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 69 4d 65  fo.aFunc[ii].iMe
32f20 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
32f30 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
32f40 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  0, sAggInfo.aFun
32f50 63 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b  c[ii].pExpr, 0);
32f60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
32f70 65 6e 64 69 66 0a 0a 0a 20 20 20 20 2f 2a 20 50  endif...    /* P
32f80 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67  rocessing for ag
32f90 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47 52  gregates with GR
32fa0 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20 64  OUP BY is very d
32fb0 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20  ifferent and.   
32fc0 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f   ** much more co
32fd0 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65  mplex than aggre
32fe0 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20  gates without a 
32ff0 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f  GROUP BY..    */
33000 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
33010 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e  y ){.      KeyIn
33020 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f  fo *pKeyInfo;  /
33030 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61  * Keying informa
33040 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f  tion for the gro
33050 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  up by clause */.
33060 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b        int addr1;
33070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76            /* A-v
33080 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20  s-B comparision 
33090 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e  jump */.      in
330a0 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b  t addrOutputRow;
330b0 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75    /* Start of su
330c0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
330d0 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72  tputs a result r
330e0 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ow */.      int 
330f0 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20  regOutputRow;   
33100 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73  /* Return addres
33110 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f  s register for o
33120 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
33130 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
33140 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a  drSetAbort;   /*
33150 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66   Set the abort f
33160 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a  lag and return *
33170 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
33180 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54  TopOfLoop;  /* T
33190 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  op of the input 
331a0 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e  loop */.      in
331b0 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  t addrSortingIdx
331c0 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e  ; /* The OP_Open
331d0 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68  Ephemeral for th
331e0 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
331f0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
33200 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
33210 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72  Subroutine for r
33220 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63  esetting the acc
33230 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20  umulator */.    
33240 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20    int regReset; 
33250 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
33260 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
33270 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f   for reset subro
33280 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20  utine */..      
33290 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
332a0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
332b0 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61   we might need a
332c0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
332d0 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65  o.      ** imple
332e0 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61  ment it.  Alloca
332f0 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20  te that sorting 
33300 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69  index now.  If i
33310 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20  t turns out.    
33320 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
33330 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65  not need it afte
33340 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f  r all, the OP_So
33350 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63  rterOpen instruc
33360 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69  tion.      ** wi
33370 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ll be converted 
33380 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20  into a Noop.  . 
33390 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41       */.      sA
333a0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
333b0 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
333c0 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  ++;.      pKeyIn
333d0 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
333e0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
333f0 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 73 41   pGroupBy, 0, sA
33400 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b  ggInfo.nColumn);
33410 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69  .      addrSorti
33420 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56  ngIdx = sqlite3V
33430 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
33440 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20  SorterOpen, .   
33450 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
33460 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67  sortingIdx, sAgg
33470 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
33480 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  umn, .          
33490 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  0, (char*)pKeyIn
334a0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
334b0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69  ..      /* Initi
334c0 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63  alize memory loc
334d0 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47  ations used by G
334e0 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74  ROUP BY aggregat
334f0 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20  e processing.   
33500 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65     */.      iUse
33510 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Flag = ++pParse-
33520 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62  >nMem;.      iAb
33530 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  ortFlag = ++pPar
33540 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
33550 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b  regOutputRow = +
33560 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
33570 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
33580 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
33590 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
335a0 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b      regReset = +
335b0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
335c0 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d       addrReset =
335d0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
335e0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
335f0 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iAMem = pParse->
33600 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20  nMem + 1;.      
33610 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
33620 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
33630 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70  .      iBMem = p
33640 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
33650 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
33660 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
33670 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >nExpr;.      sq
33680 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
33690 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
336a0 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
336b0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
336c0 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72  ((v, "clear abor
336d0 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
336e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
336f0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
33700 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 0, iUseFlag);.
33710 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
33720 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
33730 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74  accumulator empt
33740 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  y"));.      sqli
33750 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
33760 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d   OP_Null, 0, iAM
33770 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70  em, iAMem+pGroup
33780 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20  By->nExpr-1);.. 
33790 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20       /* Begin a 
337a0 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65  loop that will e
337b0 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63  xtract all sourc
337c0 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20  e rows in GROUP 
337d0 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20  BY order..      
337e0 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e  ** This might in
337f0 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61  volve two separa
33800 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e  te loops with an
33810 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77   OP_Sort in betw
33820 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a  een, or.      **
33830 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73   it might be a s
33840 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20  ingle loop that 
33850 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f  uses an index to
33860 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61   extract informa
33870 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tion.      ** in
33880 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72   the right order
33890 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a   to begin with..
338a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
338b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
338c0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
338d0 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65  gReset, addrRese
338e0 74 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  t);.      SELECT
338f0 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
33900 2c 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e 22  ,("WhereBegin\n"
33910 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  ));.      pWInfo
33920 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
33930 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
33940 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70  bList, pWhere, p
33950 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20  GroupBy, 0,.    
33960 20 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55        WHERE_GROU
33970 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72  PBY | (orderByGr
33980 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59  p ? WHERE_SORTBY
33990 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20  GROUP : 0), 0.  
339a0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
339b0 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
339c0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
339d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
339e0 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
339f0 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d  Info)==pGroupBy-
33a00 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
33a10 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a    /* The optimiz
33a20 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65  er is able to de
33a30 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72  liver rows in gr
33a40 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a  oup by order so.
33a50 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f          ** we do
33a60 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72   not have to sor
33a70 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45  t.  The OP_OpenE
33a80 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
33a90 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
33aa0 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65  * cancelled late
33ab0 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69  r because we sti
33ac0 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74  ll need to use t
33ad0 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20  he pKeyInfo.    
33ae0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67      */.        g
33af0 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a  roupBySort = 0;.
33b00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33b10 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65       /* Rows are
33b20 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75   coming out in u
33b30 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65  ndetermined orde
33b40 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70  r.  We have to p
33b50 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  ush.        ** e
33b60 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73  ach row into a s
33b70 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65  orting index, te
33b80 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73  rminate the firs
33b90 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  t loop,.        
33ba0 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65  ** then loop ove
33bb0 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
33bc0 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  dex in order to 
33bd0 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20  get the output. 
33be0 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72         ** in sor
33bf0 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ted order.      
33c00 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
33c10 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
33c20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
33c30 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
33c40 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  l;.        int n
33c50 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20  GroupBy;..      
33c60 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
33c70 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  le(pParse, .    
33c80 20 20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e          (sDistin
33c90 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d  ct.isTnct && (p-
33ca0 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73  >selFlags&SF_Dis
33cb0 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20  tinct)==0) ?.   
33cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33cd0 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47   "DISTINCT" : "G
33ce0 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20  ROUP BY");..    
33cf0 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
33d00 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72  = 1;.        nGr
33d10 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
33d20 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
33d30 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79   nCol = nGroupBy
33d40 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
33d50 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
33d60 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
33d70 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
33d80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
33d90 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69   sAggInfo.aCol[i
33da0 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e  ].iSorterColumn>
33db0 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
33dc0 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20    nCol++;.      
33dd0 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
33de0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
33df0 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65  .        regBase
33e00 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
33e10 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
33e20 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
33e30 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
33e40 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
33e50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
33e60 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
33e70 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72  rse, pGroupBy, r
33e80 65 67 42 61 73 65 2c 20 30 2c 20 30 29 3b 0a 20  egBase, 0, 0);. 
33e90 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
33ea0 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  pBy;.        for
33eb0 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
33ec0 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  .nColumn; i++){.
33ed0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
33ee0 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
33ef0 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61  ol = &sAggInfo.a
33f00 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Col[i];.        
33f10 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72    if( pCol->iSor
33f20 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
33f30 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
33f40 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65  r1 = j + regBase
33f50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
33f60 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
33f70 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 70 50 61 72  ColumnToReg(pPar
33f80 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
33f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33fa0 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20      pCol->pTab, 
33fb0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70  pCol->iColumn, p
33fc0 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 29  Col->iTable, r1)
33fd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  ;.            j+
33fe0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
33ff0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34000 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
34010 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
34020 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
34030 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34040 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
34050 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  rd, regBase, nCo
34060 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  l, regRecord);. 
34070 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
34080 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
34090 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67  orterInsert, sAg
340a0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
340b0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
340c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
340d0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
340e0 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
340f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
34100 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
34110 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
34120 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
34130 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
34140 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
34150 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
34160 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50  gIdxPTab = sortP
34170 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
34180 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f  ab++;.        so
34190 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47  rtOut = sqlite3G
341a0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
341b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
341c0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
341d0 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73  OP_OpenPseudo, s
341e0 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74  ortPTab, sortOut
341f0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
34200 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34210 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53  p2(v, OP_SorterS
34220 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ort, sAggInfo.so
34230 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e  rtingIdx, addrEn
34240 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  d);.        Vdbe
34250 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f  Comment((v, "GRO
34260 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 20 56  UP BY sort")); V
34270 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
34280 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
34290 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d  .useSortingIdx =
342a0 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   1;.        sqli
342b0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
342c0 72 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  r(pParse);..    
342d0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
342e0 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20 74 65   the index or te
342f0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 75 73  mporary table us
34300 65 64 20 62 79 20 74 68 65 20 47 52 4f 55 50 20  ed by the GROUP 
34310 42 59 20 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a  BY sort.      **
34320 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20   will naturally 
34330 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20  deliver rows in 
34340 74 68 65 20 6f 72 64 65 72 20 72 65 71 75 69 72  the order requir
34350 65 64 20 62 79 20 74 68 65 20 4f 52 44 45 52 20  ed by the ORDER 
34360 42 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75  BY.      ** clau
34370 73 65 2c 20 63 61 6e 63 65 6c 20 74 68 65 20 65  se, cancel the e
34380 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f  phemeral table o
34390 70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c 69 65  pen coded earlie
343a0 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
343b0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20    ** This is an 
343c0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74  optimization - t
343d0 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
343e0 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20  r should result 
343f0 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20  regardless..    
34400 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51 4c    ** Use the SQL
34410 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72  ITE_GroupByOrder
34420 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49 54   flag with SQLIT
34430 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
34440 49 5a 45 52 20 74 6f 20 0a 20 20 20 20 20 20 2a  IZER to .      *
34450 2a 20 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f  * disable this o
34460 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
34470 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
34480 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
34490 6f 72 64 65 72 42 79 47 72 70 20 26 26 20 4f 70  orderByGrp && Op
344a0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
344b0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f  d(db, SQLITE_Gro
344c0 75 70 42 79 4f 72 64 65 72 29 20 0a 20 20 20 20  upByOrder) .    
344d0 20 20 20 26 26 20 28 67 72 6f 75 70 42 79 53 6f     && (groupBySo
344e0 72 74 20 7c 7c 20 73 71 6c 69 74 65 33 57 68 65  rt || sqlite3Whe
344f0 72 65 49 73 53 6f 72 74 65 64 28 70 57 49 6e 66  reIsSorted(pWInf
34500 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  o)).      ){.   
34510 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65       sSort.pOrde
34520 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rBy = 0;.       
34530 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
34540 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72  geToNoop(v, sSor
34550 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  t.addrSortIndex)
34560 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
34570 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
34580 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
34590 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72  Y terms and stor
345a0 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e  e in b0, b1, b2.
345b0 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20  ...      ** (b0 
345c0 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  is memory locati
345d0 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69  on iBMem+0, b1 i
345e0 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73  s iBMem+1, and s
345f0 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a  o forth).      *
34600 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74  * Then compare t
34610 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
34620 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73   BY terms agains
34630 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  t the GROUP BY t
34640 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72  erms.      ** fr
34650 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  om the previous 
34660 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74  row currently st
34670 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20  ored in a0, a1, 
34680 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  a2....      */. 
34690 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f       addrTopOfLo
346a0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
346b0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
346c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
346d0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
346e0 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67  se);.      if( g
346f0 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
34700 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34710 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
34720 72 74 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e  rterData, sAggIn
34730 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20  fo.sortingIdx,. 
34740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34750 20 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74           sortOut
34760 2c 20 73 6f 72 74 50 54 61 62 29 3b 0a 20 20 20  , sortPTab);.   
34770 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
34780 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; j<pGroupBy->
34790 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
347a0 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
347b0 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
347c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
347d0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
347e0 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69  , sortPTab, j, i
347f0 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
34800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
34810 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63    sAggInfo.direc
34820 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20  tMode = 1;.     
34830 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
34840 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72  Code(pParse, pGr
34850 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70  oupBy->a[j].pExp
34860 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  r, iBMem+j);.   
34870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
34880 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34890 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
348a0 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d  pare, iAMem, iBM
348b0 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
348c0 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
348d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
348e0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
348f0 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
34900 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
34910 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71        addr1 = sq
34920 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
34930 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
34940 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
34950 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
34960 72 31 2b 31 2c 20 30 2c 20 61 64 64 72 31 2b 31  r1+1, 0, addr1+1
34970 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
34980 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  v);..      /* Ge
34990 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
349a0 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74   runs whenever t
349b0 68 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e  he GROUP BY chan
349c0 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68  ges..      ** Ch
349d0 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f  anges in the GRO
349e0 55 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74  UP BY are detect
349f0 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
34a00 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a  us code.      **
34a10 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72   block.  If ther
34a20 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65  e were no change
34a30 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73  s, this block is
34a40 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20   skipped..      
34a50 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  **.      ** This
34a60 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72   code copies cur
34a70 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65  rent group by te
34a80 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c  rms in b0,b1,b2,
34a90 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ....      ** ove
34aa0 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20  r to a0,a1,a2.  
34ab0 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68  It then calls th
34ac0 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
34ad0 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ine.      ** and
34ae0 20 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72   resets the aggr
34af0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
34b00 72 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70  r registers in p
34b10 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20  reparation.     
34b20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74   ** for the next
34b30 20 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e   GROUP BY batch.
34b40 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
34b50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
34b60 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65  ove(pParse, iBMe
34b70 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iAMem, pGroup
34b80 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  By->nExpr);.    
34b90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34ba0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
34bb0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
34bc0 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
34bd0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
34be0 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65  ((v, "output one
34bf0 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73   row"));.      s
34c00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
34c10 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41  (v, OP_IfPos, iA
34c20 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e  bortFlag, addrEn
34c30 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  d); VdbeCoverage
34c40 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
34c50 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63  omment((v, "chec
34c60 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  k abort flag"));
34c70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
34c80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
34c90 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
34ca0 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
34cb0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
34cc0 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c  , "reset accumul
34cd0 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
34ce0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67  /* Update the ag
34cf0 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
34d00 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68  tors based on th
34d10 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20  e content of.   
34d20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
34d30 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20  t row.      */. 
34d40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34d50 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
34d60 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65  1);.      update
34d70 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
34d80 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
34d90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34da0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
34db0 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c  teger, 1, iUseFl
34dc0 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
34dd0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69  omment((v, "indi
34de0 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63 63  cate data in acc
34df0 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
34e00 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
34e10 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a  e loop.      */.
34e20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
34e30 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
34e40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34e50 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
34e60 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ext, sAggInfo.so
34e70 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f  rtingIdx, addrTo
34e80 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  pOfLoop);.      
34e90 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
34ea0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
34eb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
34ec0 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
34ed0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34ee0 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
34ef0 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49  (v, addrSortingI
34f00 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  dx);.      }..  
34f10 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68      /* Output th
34f20 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72  e final row of r
34f30 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20  esult.      */. 
34f40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34f50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
34f60 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  ub, regOutputRow
34f70 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
34f80 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
34f90 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20  ent((v, "output 
34fa0 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20  final row"));.. 
34fb0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65       /* Jump ove
34fc0 72 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  r the subroutine
34fd0 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  s.      */.     
34fe0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
34ff0 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20  (v, addrEnd);.. 
35000 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
35010 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
35020 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e  at outputs a sin
35030 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  gle row of the r
35040 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73  esult.      ** s
35050 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75  et.  This subrou
35060 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73  tine first looks
35070 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67   at the iUseFlag
35080 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20  .  If iUseFlag. 
35090 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20       ** is less 
350a0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
350b0 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f   zero, the subro
350c0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
350d0 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74  .  If.      ** t
350e0 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61  he processing ca
350f0 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72  lls for the quer
35100 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73  y to abort, this
35110 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
35120 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20    ** increments 
35130 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d  the iAbortFlag m
35140 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62  emory location b
35150 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
35160 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
35170 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20  r to signal the 
35180 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e  caller to abort.
35190 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
351a0 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73  addrSetAbort = s
351b0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
351c0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
351d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
351e0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
351f0 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   1, iAbortFlag);
35200 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
35210 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72  nt((v, "set abor
35220 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
35230 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
35240 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
35250 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
35260 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
35270 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
35280 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
35290 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
352a0 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
352b0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
352c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
352d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
352e0 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c  IfPos, iUseFlag,
352f0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32   addrOutputRow+2
35300 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
35310 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
35320 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
35330 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20  "Groupby result 
35340 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20  generator entry 
35350 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20  point"));.      
35360 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
35370 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
35380 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
35390 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
353a0 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
353b0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
353c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
353d0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
353e0 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70  Having, addrOutp
353f0 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f  utRow+1, SQLITE_
35400 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
35410 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
35420 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31  op(pParse, p, -1
35430 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20 20 20 20  , &sSort,.      
35440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35450 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
35460 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
35470 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74           addrOut
35480 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65  putRow+1, addrSe
35490 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73  tAbort);.      s
354a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
354b0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
354c0 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
354d0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
354e0 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79  (v, "end groupby
354f0 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
35500 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
35510 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
35520 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
35530 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d  reset the group-
35540 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20  by accumulator. 
35550 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
35560 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
35570 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73  Label(v, addrRes
35580 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74  et);.      reset
35590 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
355a0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
355b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
355c0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
355d0 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b  turn, regReset);
355e0 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20  .     .    } /* 
355f0 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20  endif pGroupBy. 
35600 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74 65   Begin aggregate
35610 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74   queries without
35620 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20   GROUP BY: */.  
35630 20 20 65 6c 73 65 20 7b 0a 23 69 66 6e 64 65 66    else {.#ifndef
35640 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
35650 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61  EECOUNT.      Ta
35660 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
35670 20 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53   if( (pTab = isS
35680 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73  impleCount(p, &s
35690 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a  AggInfo))!=0 ){.
356a0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73          /* If is
356b0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65  SimpleCount() re
356c0 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
356d0 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  to a Table struc
356e0 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  ture, then.     
356f0 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74     ** the SQL st
35700 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68  atement is of th
35710 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20  e form:.        
35720 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
35730 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
35740 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20  FROM <tbl>.     
35750 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
35760 20 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65   where the Table
35770 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72   structure retur
35780 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74  ned represents t
35790 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20  able <tbl>..    
357a0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
357b0 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
357c0 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68   is so common th
357d0 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a  at it is optimiz
357e0 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68  ed specially. Th
357f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f  e.        ** OP_
35800 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  Count instructio
35810 6e 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69  n is executed ei
35820 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b  ther on the intk
35830 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20  ey table that.  
35840 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
35850 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  s the data for t
35860 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e  able <tbl> or on
35870 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65   one of its inde
35880 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20  xes. It.        
35890 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20  ** is better to 
358a0 65 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f  execute the op o
358b0 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69  n an index, as i
358c0 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73  ndexes are almos
358d0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  t.        ** alw
358e0 61 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73  ays spread acros
358f0 73 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61  s less pages tha
35900 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f  n their correspo
35910 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20  nding tables..  
35920 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
35930 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d   const int iDb =
35940 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
35950 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
35960 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
35970 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
35980 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73  int iCsr = pPars
35990 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f  e->nTab++;     /
359a0 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e  * Cursor to scan
359b0 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20   b-tree */.     
359c0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
359d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
359e0 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
359f0 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
35a00 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
35a10 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20  *pKeyInfo = 0;  
35a20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35a30 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e  Keyinfo for scan
35a40 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ned index */.   
35a50 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73       Index *pBes
35a60 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
35a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73            /* Bes
35a80 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f  t index found so
35a90 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20   far */.        
35aa0 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62  int iRoot = pTab
35ab0 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  ->tnum;         
35ac0 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
35ad0 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74  e of scanned b-t
35ae0 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ree */..        
35af0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
35b00 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
35b10 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  iDb);.        sq
35b20 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
35b30 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
35b40 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
35b50 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20  >zName);..      
35b60 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
35b70 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68  the index that h
35b80 61 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63  as the lowest sc
35b90 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20  an cost..       
35ba0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28   **.        ** (
35bb0 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e  2011-04-15) Do n
35bc0 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61  ot do a full sca
35bd0 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65  n of an unordere
35be0 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  d index..       
35bf0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28   **.        ** (
35c00 32 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e  2013-10-03) Do n
35c10 6f 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74  ot count the ent
35c20 72 69 65 73 20 69 6e 20 61 20 70 61 72 74 69 61  ries in a partia
35c30 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  l index..       
35c40 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
35c50 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b  n practice the K
35c60 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
35c70 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65   will not be use
35c80 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20  d. It is only . 
35c90 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64         ** passed
35ca0 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e   to keep OP_Open
35cb0 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20  Read happy..    
35cc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
35cd0 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
35ce0 62 29 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c  b) ) pBest = sql
35cf0 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
35d00 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
35d10 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
35d20 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
35d30 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
35d40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
35d50 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65   pIdx->bUnordere
35d60 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  d==0.           
35d70 26 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f  && pIdx->szIdxRo
35d80 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  w<pTab->szTabRow
35d90 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
35da0 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
35db0 72 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  re==0.          
35dc0 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70   && (!pBest || p
35dd0 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42  Idx->szIdxRow<pB
35de0 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20  est->szIdxRow). 
35df0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
35e00 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20          pBest = 
35e10 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  pIdx;.          
35e20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
35e30 20 20 20 20 69 66 28 20 70 42 65 73 74 20 29 7b      if( pBest ){
35e40 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74  .          iRoot
35e50 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a   = pBest->tnum;.
35e60 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e            pKeyIn
35e70 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
35e80 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73  nfoOfIndex(pPars
35e90 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20  e, pBest);.     
35ea0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
35eb0 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c   Open a read-onl
35ec0 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74  y cursor, execut
35ed0 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20  e the OP_Count, 
35ee0 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72  close the cursor
35ef0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  . */.        sql
35f00 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
35f10 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  t(v, OP_OpenRead
35f20 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69  , iCsr, iRoot, i
35f30 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  Db, 1);.        
35f40 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
35f50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
35f60 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
35f70 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65   -1, (char *)pKe
35f80 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
35f90 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  O);.        }.  
35fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
35fb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
35fc0 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49  unt, iCsr, sAggI
35fd0 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65  nfo.aFunc[0].iMe
35fe0 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
35ff0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
36000 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29   OP_Close, iCsr)
36010 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ;.        explai
36020 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61  nSimpleCount(pPa
36030 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74  rse, pTab, pBest
36040 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
36050 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
36060 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20  OMIT_BTREECOUNT 
36070 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  */.      {.     
36080 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
36090 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72  runs if the aggr
360a0 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f  egate has no GRO
360b0 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  UP BY clause.  T
360c0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
360d0 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68  ocessing is much
360e0 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74   simpler since t
360f0 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73  here is only a s
36100 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20  ingle row.      
36110 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a    ** of output..
36120 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
36130 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47     assert( p->pG
36140 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
36150 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
36160 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
36170 41 67 67 49 6e 66 6f 29 3b 0a 0a 20 20 20 20 20  AggInfo);..     
36180 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 71 75     /* If this qu
36190 65 72 79 20 69 73 20 61 20 63 61 6e 64 69 64 61  ery is a candida
361a0 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d  te for the min/m
361b0 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  ax optimization,
361c0 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
361d0 20 6d 69 6e 4d 61 78 46 6c 61 67 20 77 69 6c 6c   minMaxFlag will
361e0 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 76 69   have been previ
361f0 6f 75 73 6c 79 20 73 65 74 20 74 6f 20 65 69 74  ously set to eit
36200 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 57  her.        ** W
36210 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
36220 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42   or WHERE_ORDERB
36230 59 5f 4d 41 58 20 61 6e 64 20 70 4d 69 6e 4d 61  Y_MAX and pMinMa
36240 78 4f 72 64 65 72 42 79 20 77 69 6c 6c 0a 20 20  xOrderBy will.  
36250 20 20 20 20 20 20 2a 2a 20 62 65 20 61 6e 20 61        ** be an a
36260 70 70 72 6f 70 72 69 61 74 65 20 4f 52 44 45 52  ppropriate ORDER
36270 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 66   BY expression f
36280 6f 72 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  or the optimizat
36290 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ion..        */.
362a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
362b0 6d 69 6e 4d 61 78 46 6c 61 67 3d 3d 57 48 45 52  minMaxFlag==WHER
362c0 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
362d0 20 7c 7c 20 70 4d 69 6e 4d 61 78 4f 72 64 65 72   || pMinMaxOrder
362e0 42 79 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  By!=0 );.       
362f0 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78   assert( pMinMax
36300 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 4d  OrderBy==0 || pM
36310 69 6e 4d 61 78 4f 72 64 65 72 42 79 2d 3e 6e 45  inMaxOrderBy->nE
36320 78 70 72 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20  xpr==1 );..     
36330 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31     SELECTTRACE(1
36340 2c 70 50 61 72 73 65 2c 70 2c 28 22 57 68 65 72  ,pParse,p,("Wher
36350 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20 20 20  eBegin\n"));.   
36360 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
36370 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
36380 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
36390 2c 20 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d 61  , pWhere, pMinMa
363a0 78 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  xOrderBy,.      
363b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
363c0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
363d0 6d 69 6e 4d 61 78 46 6c 61 67 2c 20 30 29 3b 0a  minMaxFlag, 0);.
363e0 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49 6e          if( pWIn
363f0 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
36400 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
36410 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
36420 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
36430 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
36440 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
36450 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
36460 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
36470 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20  Info)>0 ){.     
36480 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36490 47 6f 74 6f 28 76 2c 20 73 71 6c 69 74 65 33 57  Goto(v, sqlite3W
364a0 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70  hereBreakLabel(p
364b0 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20  WInfo));.       
364c0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
364d0 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65  v, "%s() by inde
364e0 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
364f0 20 20 20 20 28 6d 69 6e 4d 61 78 46 6c 61 67 3d      (minMaxFlag=
36500 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
36510 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29  IN?"min":"max"))
36520 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
36530 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
36540 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
36550 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
36560 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
36570 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
36580 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 53       }..      sS
36590 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30  ort.pOrderBy = 0
365a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
365b0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
365c0 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
365d0 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  End, SQLITE_JUMP
365e0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
365f0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
36600 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 30 2c  Parse, p, -1, 0,
36610 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
36620 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
36630 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45  , addrEnd, addrE
36640 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  nd);.    }.    s
36650 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
36660 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e  eLabel(v, addrEn
36670 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20  d);.    .  } /* 
36680 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20  endif aggregate 
36690 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20  query */..  if( 
366a0 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
366b0 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  ype==WHERE_DISTI
366c0 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b  NCT_UNORDERED ){
366d0 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70  .    explainTemp
366e0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44  Table(pParse, "D
366f0 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a  ISTINCT");.  }..
36700 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
36710 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
36720 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65  use, then we nee
36730 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65  d to sort the re
36740 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73  sults.  ** and s
36750 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20  end them to the 
36760 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20  callback one by 
36770 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
36780 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29  sSort.pOrderBy )
36790 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
367a0 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 0a 20  pTable(pParse,. 
367b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
367c0 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74      sSort.nOBSat
367d0 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41 52 54  >0 ? "RIGHT PART
367e0 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22 4f   OF ORDER BY":"O
367f0 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67  RDER BY");.    g
36800 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
36810 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f 72  pParse, p, &sSor
36820 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
36830 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20  , pDest);.  }.. 
36840 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
36850 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79   skip this query
36860 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
36870 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
36880 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  v, iEnd);..  /* 
36890 54 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62  The SELECT has b
368a0 65 65 6e 20 63 6f 64 65 64 2e 20 49 66 20 74 68  een coded. If th
368b0 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ere is an error 
368c0 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74 72  in the Parse str
368d0 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65 74  ucture,.  ** set
368e0 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
368f0 20 74 6f 20 31 2e 20 4f 74 68 65 72 77 69 73 65   to 1. Otherwise
36900 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28 70   0. */.  rc = (p
36910 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b 0a  Parse->nErr>0);.
36920 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75  .  /* Control ju
36930 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61  mps to here if a
36940 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
36950 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72  ntered above, or
36960 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65   upon.  ** succe
36970 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20  ssful coding of 
36980 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f  the SELECT..  */
36990 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65  .select_end:.  e
369a0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
369b0 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
369c0 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
369d0 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctId);.  sqlite3
369e0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
369f0 62 2c 20 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42  b, pMinMaxOrderB
36a00 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  y);.  sqlite3DbF
36a10 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f  ree(db, sAggInfo
36a20 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  .aCol);.  sqlite
36a30 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67  3DbFree(db, sAgg
36a40 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 23 69 66  Info.aFunc);.#if
36a50 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
36a60 42 4c 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41  BLED.  SELECTTRA
36a70 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22  CE(1,pParse,p,("
36a80 65 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e  end processing\n
36a90 22 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  "));.#endif.  re
36aa0 74 75 72 6e 20 72 63 3b 0a 7d 0a                 turn rc;.}.